Program/OPEN_CV

[Open CV] 기본적인 영상처리 기법 _ 컬러 영상과 색 공간

사막여유 2022. 5. 8. 11:51
728x90

 

이 전 강의에서도 많이 다뤘지만 다시한번 COLOR에 대해서 다뤄보자면

컬러영상은 3차원 numpy.ndarray 로 표현된다. 즉, 3차원 행렬로 표현되는 걸 알 수 있다.

이는 Width Height 3Color ( B , G , R ) 순의 행렬로 표현될 수 있다.

 

예를들면

img1 = cv2.imread( 'lenna.bmp', cv2,IMREAD_COLOR ) 라고 하는 OpenCV함수를 이용해 이미지를 읽을수있고

img2 = np.zeros((480,640,3), np.uint8) 이라는 Numpy를 사용하여 비어있는 영상 ( 버퍼 )를 만들수도 있다.

그리고 GrayScale 로 불러와진 영상을 Color 영상으로 전환시킬 수도 있는데 이도 OpenCV 함수인

cvtColor 함수를 사용해서 BGR 순의 컬러영상으로 전환할 수 있다.

 * GrayScale의 영상이 Color영상으로 변환될뿐 실제로 흑백이미지가 어떤 랜덤한 컬러영상으로 변하는건 아니다.

 

본격적으로 색공간에 대해서 알아보자면

 1. RGB 색공간

  - 이는 우리가 가장 많이 알고있는 빛의 3원색인 Red , Green , Blue 를 의미한다.

  - 또한 카메라 센서 자체에서도 RGB의 색공간으로 받아오기 때문에 가장 많이 사용된다.

 

RGB의 Color Value는 각각 떼어보면 GrayScale 영상의 형태로 볼 수 있다.

이는 cv2.split 이라는 함수를 사용하여 각각의 원소값을 뗄 수 있다.

split을 사용하게되면 3개의 GrayScale 영상으로 리스트형태로 묶어져서 출력된다.

반대로 cv2.merge 라는 함수를 사용하여 RGB 각각의 원소값을 가진 영상을 결합할 수도 있다.

 

 

위와같이 split 함수로 원본 컬러영상을 분할하게되면 아래와 같이 B G R 의 영상이 분리되는 걸 볼 수 있다.

그래서 B G R 의 영상을 자세히 보면 B영상은 파란성분이 많은 부분이 더 밝게나타나는 걸 확인할 수 있다.

 

 

하지만, 실제 영상처리를 할때는 BGR RGB등의 색상을 많이 이용하지는 않는다.

BGR을 이용하여 다른 색공간으로 변환시킨 뒤 그 변형된 색공간을 사용하는 경우가 많다.

다른 색공간은 어떤 것들이 있는지 살펴보자

 

일단 cv2.cvtColor ( src, code, dst , dstCn ) 함수를 사용할 수 있는데

code에 어떤 색공간으로 변형할지 그 인자를 넣어주면 된다.

BGR -> GRAY ( COLOR_GRAY2BGR)

BGR -> RGB ( COLOR_RGB2BGR)

BGR -> HSV ( COLOR_HSV2BGR)

BGR -> YCrCb  ( COLOR_YCrCb2BGR)

의 인자를 사용하면 현재 BGR 성분의 컬러영상을 해당 색공간으로 변형시킬 수 있다.

이 외에도 많은 변환 인자가 존재하는데 ColorConversionCodes를 검색하면 찾을 수 있다.

 

 

이론적인 부분을 살펴보자면

RGB 색상을 그레이스케일로 변환할때

 0.299R + 0.587G + 0.114B 의 가중치합을 통해 그레이스케일로 변환시킨다.

( GREEN > RED > BLUE ) 성분의 중요도에따라 가중치를 둔다.

장점은 데이터 저장 용량감소, 데이터 처리 속도 향상등이 있지만

단점은 당연하지만 색상 정보가 손실될 수 있다.

 

그리고 HSV 의 색공간은

Hue 색상 ( 색의 종류 )

Saturation 채도 ( 색의 탁하고 선명한 정도 )

Value 명도 ( 빛의 밝기 )

를 표현하는데 HSI , HSV, HSL 이라고 비슷하지만 다른 색공간이 있는데

색을 표현하는 색상 , 채도 , 명도를 표현하는 형식은 비슷하다고 한다.

출처 : https://hoony-gunputer.tistory.com/entry/OpenCv-python-%EA%B8%B0%EC%B4%88-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%83%89%EA%B3%B5%EA%B0%84-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0-%EC%B6%94%EC%A0%81%ED%95%98%EA%B8%B0

 

그래서 Hue는 각도0~360 Saturation Value는 0~255의 값으로 표현할 수 있는데

CV_8U의 경우 각도를 360까지 표현할 수 없기때문에 반절인 0~179의 값으로 바꿔서 표현해야 한다.

BGR의 컬러값을 HSV의 색상평면값으로 변환하게 되면

 

 

위와같이 HSV로 나눠져서 볼 수 있다.

Hue를 보게되면 빨간색에 가까운 0 , 179 의값들은 밝게나오는 걸 볼 수있다.

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

728x90