본문 바로가기
딥러닝\머신러닝/이미지분석

[cv2] 색감을 보는 방법 (RGB, BGR, HSV, LAB)

by 인포메틱스 2023. 1. 19.
반응형

 

이미지 분석을 하다보면 흔하게 볼 수 있는 색감 관련 개념은 GRAY 혹은 RGB를 많이 사용해보셨을겁니다.

 

저도 이미지분석을 공부중이라 분석에 적용할 때에는 잘 알고있는, GRAY 혹은 RGB를 이용한 분석을 주로 하였습니다. 그런데 GRAY, RGB 만 이용해서 분석을 하면서 표현적 한계에 부딪치는 경우가 있었습니다.

 

예를들어 cv2.inRange를 이용하여 색감들을 고를 경우 같은 색감일지라도 RGB로는 표현이 불가능 할 때가 있습니다.

 

아래의 코드를 이용하여 보라색 계열을 일부가져 왔습니다.

 

image_color =  np.array([
    [255, 72, 255],  
    [204, 0, 204],  
    [153, 0, 153], 
    [102, 0, 102],  
    [51, 0, 51], 
    [51, 0, 102], 
    [102, 51, 102], 
    [153, 51, 153], 
    [204, 51, 204],   
    [255, 51, 255],
    [255,102,255],
    [204,102,204],
    [153,102,153],
    [102,51,102],
    [51,0,153],
    [255,255,255],
    [255,51,51]
])
col=np.zeros((17,1,3))
for i in range(image_color.shape[0]):
    col[i,]=image_color[i]
    
col=col.transpose(1,0,2)
col= col.astype(np.uint8)

plt.figure(figsize=(20,20))
plt.axis('off')
st=-0.3
plt.imshow(col)
for i in range(col.shape[1]):
    # print(i)
    plt.text(st, -0.15, f'R={str(col[0,i,0])}', fontsize=12,color='white')
    plt.text(st, 0.05, f'G={str(col[0,i,1])}', fontsize=12,color='white')
    plt.text(st, 0.25, f'B={str(col[0,i,2])}', fontsize=12,color='white')
    st+=1

 

R의 경우 범위가 51~255까지의 범위, G의 경우 범위가 0~102까지의 범위, B의 경우 51~255까지의 범위입니다.

여기에 오른쪽 두개의 색감은 흰색(255,255,255), 빨간계열(255,51,0) 입니다.

 

여기에다가 inRange를 적용시키게 되면 다음과 같이 결과가 나옵니다.

 

col=cv2.cvtColor(col,cv2.COLOR_RGB2BGR)
plt.imsave('./test.jpg',col)
col_test = cv2.imread('./test.jpg')

lower_val=[51,0,51]
upper_val = [256,103,256]
col1=cv2.inRange(col_test,np.array(lower_val),np.array(upper_val))

plt.figure(figsize=(20,20))
plt.axis('off')
st=-0.3
plt.imshow(col_test)
for i in range(col_test.shape[1]):
    # print(i)
    plt.text(st, -0.15, f'R={str(col_test[0,i,0])}', fontsize=12,color='white')
    plt.text(st, 0.05, f'G={str(col_test[0,i,1])}', fontsize=12,color='white')
    plt.text(st, 0.25, f'B={str(col_test[0,i,2])}', fontsize=12,color='white')
    st+=1

 

빨간계열도 포함되는 결과를 확인하실 수가 있습니다. (노란색이 선택된 부분)

 

이상한점이 있다면 흰 보라색 부분은 왜때문?.. -> 이 부분은 색감의 경우 저장후 불러냈을 때, 색감의 값이 변할 수가 있습니다. 다음을 그림을 참조하세요. 

 

이렇기 때문에 RGB를 이용하여 분석할 경우 제한적으로 분석이 가능합니다.

 

그런데 RGB 이외에 다른 표현방식으로 변환후에 분석을 한다면?

 

다음은 RGB를 BGR, LAB, HSV, GRAY, BGRA, HLS, YUV로 변환시킨 값입니다.

col_cvt1=cv2.cvtColor(col,cv2.COLOR_RGB2BGR)
col_cvt2=cv2.cvtColor(col,cv2.COLOR_RGB2LAB)
col_cvt3=cv2.cvtColor(col,cv2.COLOR_RGB2HSV)
col_cvt4=cv2.cvtColor(col,cv2.COLOR_RGB2GRAY)
col_cvt5=cv2.cvtColor(col,cv2.COLOR_RGB2BGRA)
col_cvt6=cv2.cvtColor(col,cv2.COLOR_RGB2HLS)
col_cvt7=cv2.cvtColor(col,cv2.COLOR_RGB2YUV)

 

# col_cvt1~7까지 진행, GRAY, BGRA는 안함
lower_val = [0,0,0]
upper_val = [0,0,0]
for i in range(3):
    lower_val[i]=col_cvt7[:,:15,i].min()
    upper_val[i]=col_cvt7[:,:15,i].max()
    
print(lower_val,upper_val)
col1=cv2.inRange(col_cvt7,np.array(lower_val),np.array(upper_val))

 

inRange로 원본의 보라색만 골라냈을 경우 다음 범위를 이용하면 원하는 보라색 계열만 가지고 올 수 있습니다.

LAB = (21,157,59),(174,220,108) # lower, upper

HSV = (130,85,51),(150,255,255)

HLS = (130,26,51), (150,179,255)

YUV = (21,143,144), (165,187,233)

 

이렇게 RGB이외의 다른 색공간 표현 방식을 이용하면 간단한 Annotation도 진행시킬 수가 있습니다.

 

논문 중에 이를 이용하여 segementation했던 논문도 있었습니다. (단점은 약탈저널에서?..)

 

Li, Yan, et al. "Segmentation of white blood cell from acute lymphoblastic leukemia images using dual-threshold method." Computational and mathematical methods in medicine 2016 (2016).

 

 

뭐 약탈저널에서 했든 어디서 했든간에 방법론적으로 재미있는 접근이었습니다.

 

RGB만 고집하지 마시고, 다른 채널도 이용해보세요~! 

728x90
반응형

댓글