Colour Spaces - RGB and HSV

김성빈·2024년 4월 15일
0

Modern Computer Vision

목록 보기
6/117

이번시간은 Colour Spaces( 색 공간) 에 대해서 알아본다.
RGB와 HSV가 있는데 HSV는 RGB와 색에대해 다른방식으로 표현한 방법으로

Hue(색상) Saturation(채도) Value(명도) 세가지의 약자이다.

RGB Space

사진을 img에 넣어주고 cv2.split을 이용해서 이미지의 RGB를 각각분리해준다.

# Load our input image
image = cv2.imread('./images/castara.jpeg')

# Use cv2.split to get each color space separately
# cv2.split을 사용하여 각 색 공간을 개별적으로 가져옵니다
B, G, R = cv2.split(image)
print(B.shape)
print(G.shape)
print(R.shape)

아래 사진으로 설명하자면 R,G,B를 구분해서 나눈 이미지로 나누는것이다.
위에서부터 R,G,B이다.

이미지를 cv2.split를 하고 B,R,G들의 shape를 출력하면 차원에대한 인수가 있지 않는것을 확인할수있다.

RGB의 육면체 모양을 잘라낸것으로 보면된다.

분리한것의 BLUE 채널만 출력해보면 회색으로 나오는데, 파란색 채널만 존재하기 때문에 다른 색상 정보가 없어 회색조로 표시된 것.

파란색 눈금의 강도라고 보면된다. 짙을수록, 어두울 수록 진해짐

하지만 이렇게 되면 이해하기 어렵다. 그래서 RGB의 색상으로 나뉠수 있게 해보겠다.

import numpy as np

# Let's create a matrix of zeros
# with dimensions of the image h x w
zeros = np.zeros(image.shape[:2], dtype = "uint8")

imshow("Red", cv2.merge([zeros, zeros, R]))
imshow("Green", cv2.merge([zeros, G, zeros]))
imshow("Blue", cv2.merge([B, zeros, zeros]))

코드를 보면 zeros(색상을 담기위한 공간) 라는 빈 배열을 생성하고 imshow를 할때 각 B,G,R에서 R만을 표현할때 나머지 색상은 아무것도 들어가지 않는것을 원하니 R만 넣고 나머지는 zeros를 넣어준것이다.

merge의 인수는 [B,G,R]로 각 수치에 숫자가 들어가고 숫자를 더해주면 더해준 부분의 색상이 진해진다.

결과는 아래와 같다.



zeros를 넣지 않고 B,G,R을 다넣게 되면 원래의 색상이 나오게 되는지 확인해보자.
위의 R,G,B 색상들을 merge를 이용해 합치면 split를 사용하기전의 이미지가 나오게 된다.

파란색과 초록색 수치에 100을 더해봐서 차이점을 봐보자.

파란색

초록색

HSV Color Space

앞서 RGB Space에 대해 알아봤는데 이제 HSV에 대해서 알아보자,

Hue(색상) Saturation(채도) Value(명도) 세가지로 이루어져있는데, 각각의 범위가 정해져있다.

Hue : 0 ~ 179
Saturation : 0 ~ 255
Value : 0 ~ 255

이렇게 글로만 보면 이해하기 힘드니까 OpenCV을 이용해 BGR의 이미지파일을 HSV로 전환해보자.

이미지를 불러와서 cvtColor를 이용해서BGR 이미지 파일을 HSV로 변환해주고 출력하면

# Reload our image
image = cv2.imread('./images/castara.jpeg')

# Convert to HSV
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
imshow('HSV', hsv_image)

아래처럼 결과가 출력된다. 이상해보인다.

이유는 plot기능은 HSV가 아닌 RGB전용 이미지를 위해 설계되었기 때문이다.

그러니까 애초에 맞지않는것을 사용했다는것이다. 그러면 HSV의 이미지를 사용할수있게 변환을 해줘야하는데, 그때도 cvtColor를 사용하면된다.

plt.imshow(cv2.cvtColor(hsv_image, cv2.COLOR_HSV2RGB))
plt.show()

BGR에서 HSV로 변경한 hsv_image 이미지 파일을 HSV to RGB를 이용해서 RGB 파일로 변환해주고 RGB 전용인 plot, plt을 이용해 출력하면 정상적인 색상으로 출력이 돼야한다.

RGB를 각각 분류했던것처럼 H,S,V도 한번 분류 해보자.

HSV로 변환한 hsv_image를 보면
Hue는 색상 정보이며 색상이 어디에 해당하는지를 나타낸다.
Saturation은 색의 순수성 정도를 나타내는것이며, 0은 회색이고 값이 커질수록 순수한 색에 가까워진다.

Value는 명도라고도 하고 색의 밝기를 나타내는데 이는 색의 어두운 정도를 나타낸다.

0은 검은색에 가깝고 커질수록 밝아진다.

이 내용을 확인하기 위해 HSV로 변환한 이미지의 H,S,V를 나누어서 이미지를 출력해보자.

# Switching back to viewing the RGB representation
imshow("Hue", hsv_image[:, :, 0])
imshow("Saturation", hsv_image[:, :, 1])
imshow("Value", hsv_image[:, :, 2])



profile
감사합니다. https://www.youtube.com/channel/UCxlkiu9_aWijoD7BannNM7w

0개의 댓글