본문 바로가기
Image Processing (Python)

Color Space Change (색공간 변경)

by HanByol Jang 2021. 11. 22.
728x90

함수 설명

색공간은 색의 3가지 속성인 색상, 명도, 채도를 3차원 공간안에서 표현한 것으로 인간이 볼 수 있는 모든 색을 뜻합니다.

다양한 색공간이 존재하지만 자주 사용되는 몇가지의 색공간에 대해 설명하겠습니다.

 

1. RGB

RGB 색 공간은 색을 혼합하면 명도가 올라가는 가산 혼합 방식으로 색을 표현합니다.
RGB 
가산혼합의 삼원색은 빨강(Red), 녹색(Green), 파랑(Blue)을 뜻합니다정육면체 모델 형태로 표현할 수 있습니다.
 channel마다 [0-255]의 값을 가지며 256*256*256 = 16,777,216의 색을 표현 가능합니다가장 많이 사용되는 color mode 입니다.

 

2. HSV

HSV 색 공간은 색상, 명도, 채도를 기준으로 색을 구성하는 방식으로 위 그림처럼 원뿔형태로 표현할 수 있습니다.
H(hue): 
색상일반적인 색을 의미합니다원추모형에서 각도로 표현이 됩니다. [0-360]의 값을 가지며, 0 Red, 120 Green, 240 Blue의 값을 가집니다.
S(saturation): 
채도색의 순수성을 의미하며 일반적으로 짙다흐리다로 표현됩니다. [0-100]의 값을 가지며, 0은 같은 명도의 무채색을 나타냅니다.
V(value): 
명도색의 밝고 어두운 정도를 의미합니다.

 

3. YCrCb

YCbCr은 영상 시스템에서 사용되는 색공간의 일종으로 Y는 휘도, Cr Cb는 색차를 표현하도록 구성된 색공간입니다. Y가 커지면 위 그림이 전체적으로 밝아지고, Y가 작아지면 전체적으로 어두워집니다인간의 눈이 밝기 차에는 민감하지만 색상 차에는 상대적으로 둔감하다는 점을 이용해서 Y에는 많은 bit(해상도)를 할당하고 Cb, Cr에는 낮은 bit를 할당합니다주로 비디오 압축에 사용됩니다.

 

4. CIE XYZ

CIE XYZ 색공간은 인간의 색채 인지 연구를 바탕으로 수학적으로 정의된 최초의 색공간입니다. 인간은 각기 다른 세가지의 빛을 받아들이는 원추세포가 존재합니다. 따라서 X, Y, Z로 표현되는 세가지의 삼색 자극값으로 색공간을 표현한 것이 CIE XYZ 색공간입니다.  

색은 밝기과 색도로 나눌 수 있는데, CIE XYZ 중 Y가 밝기에 해당합니다. 그리고 색도 x,y는 아래의 식으로 표현됩니다.

계산되 색도 x, y의 값으로 표현되는 색은 아래와 같습니다.

 

5. CIE Lab

CIE(국제 조명위원회)에서 규정한 색공간입니다균일한 색공간 좌표로서 인간의 눈이 인지할 수 있는 색차를 거의 그대로 수치로 표현합니다.
L: 
밝기명도를 나타내며, 0이면 검은색, 100이면 흰색을 나타냅니다.
a: red
 green중 어느 쪽으로 치우쳤는지를 나타내며, a가 음수이면 green에 치우친 색깔이며, a가 양수이면 red 쪽으로 치우친 색깔입니다.
b: yellow
 blue를 나타내며음수이면 blue, 양수이면 yellow입니다.


코드 설명

python OpenCV 라이브러리를 사용했습니다.

 

cv2.cvtColor(src, code)

 

1) src : 바꾸고 싶은 source 이미지

2) code : 색상변환 코드

'원본 색공간 2 바꾸고 싶은 색공간' 으로 표현합니다. 색상 공간 코드는 150여가지가 있지만 몇가지만 아래 설명

cv2.COLOR_RGB2HSV : RGB -> HSV

cv2.COLOR_RGB2XYZ : RGB -> XYZ

cv2.COLOR_RGB2Lab : RGB -> Lab

cv2.COLOR_RGB2GRAY : RGB -> GRAY


예제

다양한 색공간으로 변경시키는 예제입니다.

import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage import io

# Image Load
image = io.imread('rose.jpg')

# RGB to HSV
output1 = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)

# RGB to YCrCb
output2 = cv2.cvtColor(image, cv2.COLOR_RGB2YCrCb)

# RGB to XYZ
output3 = cv2.cvtColor(image, cv2.COLOR_RGB2XYZ)

# RGB to Lab
output4 = cv2.cvtColor(image, cv2.COLOR_RGB2LAB)

# RGB to Grayscale
output5 = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

# view
img_list = [image, output1, output2, output3, output4, output5]
title_list = ['RGB', 'HSV', 'YCrCb', 'XYZ', 'Lab', 'Grayscale']

for i in range(len(img_list)):
    plt.subplot(2, 3, i+1, )
    plt.imshow(img_list[i])
    plt.title(title_list[i])
    plt.axis('off')

plt.show()

RGB 기준으로 show를 했기에 이상하게 보일지 모르지만, 각 색공간에 맞게 변환된 것을 확인할 수 있습니다.

728x90

'Image Processing (Python)' 카테고리의 다른 글

Rotate (회전)  (0) 2021.11.24
Denoising (non-local)  (0) 2021.11.23
Gamma Correction (감마 보정)  (1) 2021.11.19
Embossing (엠보싱)  (0) 2021.11.18
Smoothing  (0) 2021.11.17

댓글