그레이 스케일 원리 - geulei seukeil wonli

OpenCV에서 RGB를 Grayscale로 변환하는 공식은 다음과 같다.

RGB를 Grayscale로 변환할 때 RGB의 평균값이 아닌 가중치를 둔 값으로 변환해야 한다. 왜냐하면, 사람 눈에는 동일한 값을 가질 때 G가 가장 밝게 보이고 그 다음 R과 B가 밝게 보이기 때문이다.

위 식은 1982년에 제정된 ITU-R BT.601에 정의된 식이다. 1990년에 제정된 ITU-R BT.709에는 다음과 같이 정의하고 있다.

Y = 0.299×R + 0.587×G + 0.114×B

과거의 1035i HDTV에서는 다음과 같이 정의하였다.

Y = 0.212×R + 0.701×G + 0.087×B

☞ 인간 눈의 색 인식 민감도

Grayscale Image (회색조 영상) : "흑백사진"처럼 밝기 정보만으로 구성된 영상 

Grayscale Image는 우리가 알고 있는 흑백사진의 이미지와 같다고 생각하면 된다. 오직 밝기 정보만을 가지고 있기 때문에 '밝다' 혹은 '어둡다'의 개념만으로 이미지를 나타낸다.

Grayscale Image는 밝기 정보를 256 단계로 구분하여서 표현한다.

즉, 한 픽셀은 밝기 정도인 픽셀값으로 0~255의 범위를 가진다는 의미이다.

이 픽셀 값의 범위를 Grayscale Level(그레이스케일 레벨)이라고 한다.

*Grayscale Level :  Grayscale Image에서 한 픽셀이 가질 수 있는 값의 범위 (0~255)

Graysclae

Graysclale Image에서는 픽셀 값이 밝기의 정도라고 생각하면 된다. 따라서, 값이 작을수록 어둡고 값이 클수록 밝다.

* 0: 검은색         255 : 흰색

이 Grayscale Image에서 픽셀 값을 저장하기 위해서 C언어와 C++에서는 보통 unsigned char 자료형을 사용한다.



char 자료형은 1byte (8bit)의 크기를 가지고 있기 때문에 Graysclae Level을 모두 담을 수 있는 알맞은 자료형이다.

여기서 unsigned는 부호 없이 해당 자료형을 사용한다는 의미로 unsigned char는 부호가 없는 1byte의 정수를 저장할 수 있는 자료형이다. 

따라서, Grayscale Image를 표현하기에 가장 적합한 자료형이라고 할 수 있다.

여러 OS와 라이브러리에서는 이 unsigned char 자료형을 다른 이름으로 재정의하여 사용한다.

Window - BYTE

Linux - uint8_t

openCV - uchar

* 우리가 사용할 openCV 라이브러리에서는 uchar로 사용함을 잘 알아두면 좋다.

Truecolor Image : "컬러사진"처럼 다양한 색상으로 구성된 영상 

Truecolor Image는 우리가 알고 있는 컬러사진의 이미지와 같다고 생각하면 된다. 우리가 흔히 말하는 '색'을 가지고 이미지를 표현한다.

* 예전에는 256개 이하의 색상으로 구성되는 컬러영상과 구분하기 위해 'Truecolor'라는 표현을 사용했지만, 요즘에는 대부분 256개 이상으로 구성되기 때문에 굳이 구분하지 않고 Color Image로 부르기도 한다.

컬러 이미지의 경우 색상을 표현하기 때문에, 색상을 표현하는 방법에 따라 같은 이미지도 다른 픽셀값들의 배열로 표현될 수 있다.

즉, 선택하는 색상 표현 방법에 따라 한 픽셀이 가지는 값과 그 의미가 다르다는 뜻이다.

비전 프로세싱을 구현할 때는 상황에 맞는 색상 표현 방법을 택하는 것도 중요한 문제이다.

아래는 주로 사용되는 색상 표현 방법이다.

RGB Color Space (RGB 색공간)

먼저 RGB는 각각 R (Red) , G (Green) , B (Blue) 로 빛의 3원색들이다.

RGB (출처 : //www.newiki.net/wiki/RGB)

빛의 3원색인 RGB를 각 색마다 어느 정도의 세기로 혼합하느냐에 따라 다른 색이 나오며, 이를 이용해 색을 표현하는 방법이다.

여기서 잘 생각해보면 이를 위해서는 R , G , B가 각각 자신의 값들을 가져야하므로 변수가 3개임을 알 수 있다. 

그래서 컴퓨터 비전에서는 보통 이를 수학적으로 표현할 때 각 변수가 하나의 좌표축을 이루는 3차원 상의 공간으로 보는데,

이를 RGB Color Space (RGB 색공간) 이라고 한다.

RGB Color Space (출처 : //www.pngwing.com/en/free-png-sndev)

 위의 사진과 같이 R,G,B 3개의 변수를 각각의 좌표축으로 보며 이 3개의 변수값에 따라 특정 색이 나오는 Color Space를 볼 수 있다.

즉, 수학적으로 RGB Color Space에서 특정 색은 일종의 벡터임을 확인할 수 있다. 

ex) 빨간색 (255,0,0)

이러한 색 공간을 이용해 RGB Image를 나타내기 위해서는 1byte의 크기를 가지는 변수 3개가 필요하다는 것을 쉽게 알 수 있다.

그래서 우리는 보통 Grayscale Image를 나타내기 위해서 사용했던 unsigned char 자료형 3개를 이용한다.

즉, 한 픽셀값을 나타내기 위해 unsigend char 자료형 3개를 이용하여 표현한다는 뜻이다.

HSV Color Space (HSV 색공간)

HSV는 각각 Hue (색상) , Saturation (채도) , Value (명도)로 초중학교 때 미술시간에 접했었던 명도, 채도 들의 개념으로 색상을 표현하는 방법이다.

HSV Color Space (출처 : //jinrona.tistory.com/manage/newpost/?type=post&returnURL=%2Fmanage%2Fposts%2F)

위의 사진은 HSV Color Space이다.

우리가 보통 RGB Color Space를 Cube(정육면체)로 표현한다면, HSV Color Space는 주로 Inverted cone(역원뿔)로 표현한다.

각자를 설명하기 전 간단하게 HSV Color Space에서 색을 표현하는 방법을 설명하면 다음과 같다.

1. Hue 선택

    - 특정한 Hue를 선택하는 것은 역원뿔의 윗면에서 특정한 각도를 선택하는 것과 같다. 

       따라서, 위의 그림과 같이 Hue를 선택하면 특정한 삼각형 면이 나온다.

2. Saturation 선택

    - 특정한 Saturation을 선택하는 것은 삼각형 면이 일종의 2차원 좌표계 위에 존재한다고 가정하면, 위의 그림에서는 x축을 선택한다고          생각하면 쉽다.

3. Value 선택

    - 특정한 Value를 선택하는 것은 2차원 좌표계에서 y축을 선택하는 것과 같다고 생각하면 된다.

물론, 위의 과정은 위에 기술한 순서대로 하지 않아도 된다. 위의 과정은 단순히 Color Space에서 특정 색이 선택되는 과정을 이미지화 시키기 위함이다.

사실, RGB Color Space와 같이 HSV Color Space 또한 3차원 공간에서 특정 벡터를 특정 색으로 표현한다고 생각하면 된다.

Hue(색상)는 360˚로 펼쳐진 색상표에서 특정 각도를 설정해 색상을 표현한다고 생각하면 쉽다.

즉, 아래 그림처럼 위에서 보았던 RGB의 혼합색들이 둥글게 그라데이션으로 존재하고, 우리는 특정 각도를 정해서 원하는 색을 선택한다고 보면 된다.

(출처 : //www.newsshooter.com/2018/07/30/fiilex-matrix-ii-rgbw-hands-review/hue-color-wheel-by-degree/)

Saturation(채도)는 선택한 색상을 짙게 칠한 정도를 표현한다고 생각하면 쉽다.

즉, Hue가 빨간색을 지정하는 값이라면 Saturation은 "짙은 빨강" , "옅은 빨강"을 지정하는 값이라는 뜻이다.

그래서 위에 있는 HSV Color Space 사진을 보면 삼각형에서 Saturation 값이 클 수록 초록색이 점점 짙어지는 것을 볼 수 있다.

* Saturation이 0이라면 색을 채색하지 않은 것과 같으므로 우리가 흔히 얘기하는 무채색들을 나타낸다.

Value(명도)는 색의 밝기 정도를 표현한다고 생각하면 된다.

쉽게 이야기하면 우리가 일상생활에서 흔히 이야기하는 "어두운 빨강색" , "밝은 빨강색"을 결정하는 값이라고 생각하면 된다.

* Value가 0이라면 밝기가 아예 없는 것과 같으므로 검은색을 나타내게 된다.

사실, HSV 색공간도 원기둥으로 표현되는 경우가 있는데, 원기둥에서 높이를 나타내는 Value가 0일 때는 같은 검은색을 나타내면서 아래로 내려갈 수록 비슷한 색들을 표현하게 된다는 것을 알 수 있다. 

그렇기 때문에 보통 HSV 색공간을 표현할 때는 원기둥에서 아래로 내려갈 수록 한 가지 색을 나타내게 표현되는 역원뿔로서 많이 표현한다.

HSV도 RGB와 마찬가지로 보통 unsigned char 자료형 3개가 한 개의 픽셀값을 나타내 Image를 표현하는 방식으로 사용한다.

그런데, RGB와 다른 점이 한가지 있다. RGB 색공간은 대부분 RGB 3개의 변수가 각각 [0,255]의 범위를 가지는 것과는 다르게

HSV는 변환 공식에 따라 사용하는 값의 범위가 다를 수 있다는 것이다.

Hue의 범위가 360˚의 절반인 [0,179]을 사용하는 경우도 있고, [0,255]가 되는 경우도 있다.

*openCV에서는 Hue의 범위를 [0,179]로 사용한다.

Saturation와 Value 또한 마찬가지로 [0,255] 범위를 사용하는 경우도 있고, [0,1]의 범위를 사용하는 경우도 있다.

이는 HSV Color Space를 사용하여 비전 프로세싱을 구현할 때 대부분 RGB를 공식에 따라 HSV로 변환한 뒤에 사용하기 때문에 이런 경우가 발생한다.

디지털 카메라의 대부분은 이미지를 RGB로 변환하기 때문에 우리가 HSV Image로 사용하고 싶다면 RGB를 HSV로 변환하여 사용할 수 밖에 없기 때문이다.

이 부분에 대해서는 공식과 함께 따로 포스팅할 예정이다.

이 글은 공부를 하면서 제가 정리해 놓은 내용으로 틀린 내용들이 있을 수도 있습니다.

틀린 부분에 대한 지적은 언제나 환영입니다!

-JinRona-

관련 게시물

Toplist

최신 우편물

태그