반응형

영상을 명암 영상으로 변환하고 반으로 축소하기

영상에는 다양한 형태가 있는데, 이번 포스팅에서는 B, G, R로 채널이 3개인 컬러 영상을 채널이 1개 뿐인 명암 영상(grayscale image)으로 변환하고 영상 크기를 반으로 축소해보고자 한다.

 

 

컬러 영상을 명암 영상으로 변환하기 위해서는 cvtColor() 함수를 사용하면 된다.

첫 번째 인수는 변환할 컬러 영상을 가진 객체를 넣고, 두 번째 인수에 cv.COLOR_BGR2GRAY를 넣어 BGR로 표현된 컬러 영상을 명암으로 변환하라고 지시한다. 이러한 cvtColor() 함수는 변환된 영상을 반환하는데 이 반환된 영상을 gray 객체에 저장한다.

 

다음으로, 영상의 크기를 변환하기 위해서는 resize() 함수를 사용하면 된다.

첫 번째 인수는 입력 영상이고, 두 번째 인수 dsize는 변환할 크기를 지정하는데 (0,0)인 경우 비율을 지정하는 fx와 fy에 따르는데, dsize=(0,0)이고 fx=0.5, fy=0.5이므로 가로와 세로 방향 모두 반으로 축소한다. 이러한 resize() 함수는 변환된 영상을 반환하는데, 이 반환된 영상을 gray_small 객체에 저장한다.

 

imwrite() 함수는 지정한 영상을 지정한 파일에 저장한다. 즉, gray 객체에 있는 영상은 'star_gray.jpeg' 파일에 gray_small 객체에 있는 영상은 'star_gray_small.jpeg' 파일에 저장된다. 프로그램 실행을 마치면 폴더에 아래와 같이 생성됨을 확인할 수 있다.

다음으로 imshow() 함수를 사용해서 영상 3개를 서로 다른 윈도우 3개에 디스 플레이 하면 아래와 같이 윈도우 3개에 영상이 잘 출력됨을 확인할 수 있다.

 

OpenCV의 cvtColor() 함수는 어떻게 채널이 세 장인 컬러 영상을 채널이 한 장인 명암 영상으로 변환할까?

OpenCV 공식 사이트는 컬러 이론에 기반해 BGR 영상을 명암 영상으로 변환하는 공식을 위와 같이 제시한다.

예를 들어 BGR = (41, 91, 52)은 위 공식에 따라 계산하면 I=74로 변환된다. 이런 연산을 모든 화소에 적용하면 명암 영상이 만들어진다.

공식에서는 R, G, B 순서임을 주의