-
[OpenCV] RGB 컬러영상 Channel 별로 분리하기.Tech/Vision 2011. 10. 21. 16:30
RGB 이미지를 다루다보면 각 Color Channel 별로 분리하고 싶을 때가 있다. 인덱스별로 직접 분리해내도 되지만, OpenCV에서는 mixChannels 라는 함수를 이용해서 간단히 해결할 수 있다.
mixChannels(const Mat *src, int nsrc, Mat* dst, int ndst, const int *fromTo, size_t npairs); // src - input array or vector of matrices. // nsrc - number of matrices in src. // dst - output array or vector of matrices. // ndst - number of matrices in dst. // fromTo - Array of index pairs specifying which channels are copied and where. // npairs - number of index pairs in fromTo
이 함수를 사용하는 간단한 예제는 아래와 같이 작성해볼 수 있다. 그런데 아래 예제에서 함정이 있다. OpenCV에서 칼라 이미지는 BGR 순서로 저장된다.
Mat image; image = imread( "test.png", 1 ); Mat image_r( image.rows, image.cols, CV_8UC1); Mat image_g( image.rows, image.cols, CV_8UC1); Mat image_b( image.rows, image.cols, CV_8UC1); Mat out[] = { image_r, image_g, image_b }; int from_to[] = { 0,0, 1,1, 2,2 }; mixChannels( &image, 1, out, 3, from_to, 3 ); namedWindow(oriImageWindow,CV_WINDOW_AUTOSIZE ); namedWindow(outputImageWindow1,CV_WINDOW_AUTOSIZE ); namedWindow(outputImageWindow2,CV_WINDOW_AUTOSIZE ); namedWindow(outputImageWindow3,CV_WINDOW_AUTOSIZE ); imshow( oriImageWindow, image ); imshow( outputImageWindow1, image_r ); imshow( outputImageWindow2, image_g ); imshow( outputImageWindow3, image_b ); waitKey(0);