소소한 컴퓨터 이야기

컬러 스페이스 변환

by Cori

컬러 이미지를 그레이 스킬로 변환하는 것은 이미지 연산의 양을 줄여 속도를 높이는데 꼭 필요하다. OpenCV의 cv2.cvtColor() 함수를 이용해 컬러 이미지를 그레이 스케일이나 다른 컬러 스페이스로 변환하는 방법에 대해 살펴본다.

 

* 해당 포스팅에서 다루고 있는 모든 내용은 다음 서적을 참고하였습니다.

 

파이썬으로 만드는 OpenCV 프로젝트

“개발자에게 딱 필요한 만큼의 이론과 활용 가능한프로젝트로 배우는 OPENCV 프로그래밍”OPENCV는 영상 처리와 컴퓨터 비전 분야에서 현존하는 가장 영향력 있는 라이브러리이다.이 책은 누구나

book.naver.com


컬러 스페이스 변환

* 평균값을 구하는 알고리즘을 사용할 때, dtype이 uint8인 경우 평균 값을 구하는 과정에서 3채널의 값을 합하면 255보다 큰 값이 

  나올 수 있기 때문에, dtype을 uint16으로 변경해서 계산을 마치고 다시 uint8로 변경하는 작업이 필요하다. 

cvtColor 사용법

->  out = cv2.cvtColor(img, flag)

· cv2.COLOR_BGR2GRAY  -> BGR 컬러 이미지를 그레이 스케일로 변환 

· cv2.COLOR_GRAY2BGR -> 그레이 스케일 이미지를 BGR 컬러 이미지로 변환 

더보기

· cv2.COOR_BGR2RGB

· cv2.COLOR_BGR2HSV

· cv2.COLOR_HSV2BGR

· cv2.COLOR_BGR2YUV

· cv2.COLOR_YUV2BGR

 

... 더 많은 명령어를 보려면 [i for i in dir(cv2) if i.startswith('COLOR_')] 와 같이 작성 

 

* cv2.COLOR_GRAY2BGR 연산이 실제 흑백 사진을 컬러 사진으로 바꿔주는 것은 아니며, 2차원 배열 이미지를 3개 채널이 모두 같은 값을 갖는 3차원 배열로 변환하는 것이다. 영상 간 연산을 할 때 서로 차원이 다르면 연산을 할 수 없으므로 차원을 맞추는 용도로 - 

HSV vs YuV

1) HSV (HSV, HSI, HSL)

-> RGB와 마찬가지로 3채널 컬러 이미지 (H: 색조, S: 채도, V: 명도)를 표시. 명도를 표현하는 방법에 따라 마지막 V를 I(Intensity, 밀도), L(Lightness, 명도)로 표기하는 컬러 시스템 존재

2) YuV

-> 사람이 색상을 인식할 때 밝기에 더 민감하고 색상은 상대적으로 둔감한 점을 고려해서 만든 컬러 스페이스 Y(Luma, 밝기), U(Chorma Blue: 밝기와 파란 색과의 색상 차), V(Chorma Red: 밝기와 빨간 색과의 색상 차)를 의미하며, Y(밝기)에 많은 비트수를 할당하고 U(Cb)와 V(Cr)에는 적은 비트 수를 할당하여 데이터를 압축하는 효과를 가짐 

 

* YuV는 요즘들어 YCbCr로 인코딩된 파일 형식을 설명하는 용어로 사용되며, 밝기 정보와 컬러 정보를 분리해서 사용하기 때문에 명암 대비가 좋지 않은 영상을 좋게 만드는 데 대표적으로 활용됨

블로그의 정보

코딩하는 오리

Cori

활동하기