본문 바로가기
개발

파이썬 opencv 이미지 색상 추출 히스토그램 RGB 그래프 그리기 예제(colorHistogram, color 그래프 )

by 화악 2022. 5. 23.
반응형

이번에는 좀처럼 찾기 힘든 이미지의 색성분을 추출하여 컬러 히스토그램 plot을 그리는 예제를 소개해드리려고 합니다. 보통 calcHist를 한 후 RGB형태로만 그래프를 그리는 예제는 많이 보셨을텐데 이포스팅에는 여러색깔을 본인의 입맛에 맞게 막대 그래프로 표현하는 예제를 소개하겠습니다.

 

 

이미지 불러오고 HSV로 색상변경


mport cv2
import numpy as np

img = cv2.imread('2_TEST.jpg') #이미지 불러오기
#img = cv2.imread('gogo22.jpg')

img=cv2.resize(img,(320,200)) #이미지사이즈 조정
cv2.imshow("hist2",img)

x= 20 #히스토그램 x 값 범위

img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #색 추출을위해 이미지 HSV 색상으로 변경

 

먼저 테스트할 이미지를 불러온 뒤 색추출을 위해 cvtColor함수로 RGB이미지를 HSV로 색상을 변경 합니다. 제가 이번에 사용한 원본 이미지와 변경 후 결과는 다음과 같습니다.

 

 

RGB , HSV

 

이미지 히스토그램 계산


img=cv2.calcHist(img,[0],None,[x],[0,180]) #이미지 히스토그램 계산


imgBuf=np.zeros((x,1,3),dtype="uint8") # 히스토그램 그리기위한 버퍼
imgHistResult = np.zeros((200,320,3),dtype="uint8") #히스토그램을 그릴 이미지배열
imgHistResult.fill(255)
rows,cols, channels = imgHistResult.shape # row,col 값 구하기위함

for i in range(0,x):
    imgBuf[i,0] = ((i*180/x) , 255,255 ) #버퍼에 지정한 x 만큼의 색상정보를 H 에 저장

binW= int(cols/x) #색상 히스토그램 너비값

imgBuf=cv2.cvtColor(imgBuf, cv2.COLOR_HSV2BGR) #HSV 를 BGR로 변환

HSV로 색상을 변경한 이미지를 calcHist로 히스토그램을 계산합니다. 그리고 최종 히스토그램 색상 추출 그래프 결과를 위한 계산식을 정의 합니다. 여기 변수에서 막대그래프의 범위와 색깔 범위등을 변경 할 수 있습니다.

 

 

히스토그램 색상 추출 그래프 그리기


for i in range(0, x):


    setY = int(img[i,0]*rows/255) #이미지 y값 을위한 변수

    #print(int(imgBuf[i,0][0]),int(imgBuf[i,0][1]),int(imgBuf[i,0][2]))


    cv2.rectangle(imgHistResult, ((i*binW),rows),((i+1)*binW,rows-setY),(int(imgBuf[i,0][0]),int(imgBuf[i,0][1]),int(imgBuf[i,0][2])),-1,8) #히스토그램 색깔별 출력 x에 따라 범위는 다름


cv2.imshow("Hist", imgHistResult)

cv2.rectangle함수로 앞에 정의한 변수를 사용해 막대그래프를 표현합니다. 색상별로 어떤 색깔이 많이 포함되어 있는지를 한눈에 확인 할 수 있습니다.

 

 

잘 추출되었네요. 이상으로 파이썬 opencv로 colorHistogram을 표현하는 예제를 마치겠습니다.

 

반응형

댓글