본문 바로가기
IT/Python

color histogram 연습

by Jang HyunWoong 2015. 6. 2.

OpenCV를 사용하여 color histogram 계산해보겠다. 


먼저 OpenCV에는 cv2.calcHist 라는 함수가 있다. 간단하게 이 함수에 대해서 리뷰해보면 다음과 같다. 


cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])


images - 히스토그램을 계산하기 위한 그림 배열이다. python에서 리스트처럼 넣을 수 있다. [image].

channels - 우리가 계산하고자 하는 히스토그램의 인덱스들을 나타내는 리스트이다. 만약 grayscale의 이미지를 계산하려면 [0], Red, Green, Blue 채널을 계산하려면 [0, 1, 2]로 사용할 수 있다. 

mask - 마스크 옵션이다. 이미지 전체를 사용할 경우 "None"으로 사용한다. 만약 특정한 이미지 내의 히스토그램영역을 사용하려면 마스크를 생성해야한다. 

histSize - bin의 개수를 나타낸다. 

ranges - 픽셀값의 범위를 결정한다. 보통 [0, 256]로 각 채널의 범위를 정한다. 


http://docs.opencv.org/modules/imgproc/doc/histograms.html

여기에 자세한 설명이 나와있다. 


histogram.py


먼저 기본이미지를 불러오자


main1.jpg <-이미지 이름 (같은 폴더 내에 존재해야한다)


>python histogram.py -i main1.jpg


이미지가 잘 뜨는 것을 확인할 수 있다.


line 6-8 : 윈도우 커멘드 창에서 이미지를 입력할 수 있도록 설정한다. 

line 10-12 : 커멘드에서 받은 이미지를 image에 저장하고 출력한다. line 12는 키보트에 특정한 입력이 있을 때까지 무한정 대기한다. 


Grayscale 계산



line 1-2 : 이미지를 gray로 변환하고 이미지를 보여준다. 

line 3 : grayscale의 변환된 이미지를 히스토그램으로 계산한다. 위에서 cv2.calHist() 함수를 간단하게 설명했다. grayscale의 이미지는 오직 하나의 채널만 가지고 있기 때문에 채널 리스트를 [0]로 한다. bin의 개수와 픽셀 값의 범위는 256으로 한다. 

line 4-10 : figure 값을 설정하고 화면에 나타낸다.


커멘드 창에서 다음과 같이 입력하면

>python histogram.py -i main1.jpg




Figure1을 보면 x축은 0~256 의 bins로 되어 있다. y축은 각각의 bins에 매치되는 픽셀의 수 이다. 주요한 점은 bins의 약 80~100bins의 값이 높은 것을 보면 회색으로 변하는 곳이 많다는 것을 알 수 있고, 250쪽에서 값들이 꽤 있는 것을 보면 이미지에 흰색도 조금 있다는 생각을 할 수 있다. 


Color Histgram 계산

이번에는 이미지에 있는 세가지 colors 에 대한 히스토그램을 계산하겠다. 



line 1 : cv2.split() 함수는 BGR이미지의 채널 값을 나눌 수 있다. 예를 들어 >>> b,g,r = cv2.split(img) 와 같이 사용 할 수 있다. 

line 9-14 : 채널과 colors를 for루프를 돌면서 히스토그램을 생성하고 features 리스트에 추가한다. color histogram을 사용하여 colors features vector 값을 생성할 수 있다. 




위와 같은 plot을 생성할 수 있다. 

컬러 히스토그램의 값에 대해서 살펴 보면 140bin 의 값은 이미지 배경이 파란색임을 알 수 있다. red와 green도 높은 값을 가지고 있는데 아마도 이미지에서 노란색 값이 꽤 높음을 볼 수 있었다. 아마 그 값을 나타내는 것이라고 생각할 수 있다. 




반응형