컬러이미지 (Color image)를 R, G, B 요소로 분리하기
컬리이미지의 각 픽셀은 3개 색채널 (red, green, blue)로 구성되어 있다.
따라서 이미지에서 각 채널별 요소를 분리해 낼 수 있다.
아래와 같은 컬러이미지가 있다고 하자.
Red 채널만 뽑아낸 결과
위의 영상에서 G와 B는 무시하고, R에 해당하는 값만 뽑아낸 결과는
아래와 같다.
왼쪽 잔의 음료수 색이 빨간 색에 가까웠기 때문에,
Red만 뽑아낸 영상에서는 해당 부분이 하얗게 나타난다.
그리고 원래 하얀색이었던 부분은 R, G, B값이 모두 컸기 때문에
Red만 뽑아낸 영상에서도 하얗게 나타난다.
Green 채널만 뽑아낸 결과
Blue 채널만 뽑아낸 결과
함수 split( )
OpenCV 라이브러리에서는 컬러이미지를
각 채널별로 분리해내는 함수 split( )을 제공한다.
이것을 이용하여 구현한 프로그램은 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { if (argc != 2) { cout << " Provide image name to read" << endl; return -1; } Mat inputImg; inputImg = imread(argv[1], CV_LOAD_IMAGE_COLOR); vector<Mat> bgr_images(3); split(inputImg, bgr_images); namedWindow("Original", CV_WINDOW_AUTOSIZE); namedWindow("Blue", CV_WINDOW_AUTOSIZE); namedWindow("Green", CV_WINDOW_AUTOSIZE); namedWindow("Red", CV_WINDOW_AUTOSIZE); moveWindow("Original", 100, 100); moveWindow("Blue", 120, 120); moveWindow("Green", 140, 140); moveWindow("Red", 160, 160); imshow("Original", inputImg); imshow("Blue", bgr_images[0]); imshow("Green", bgr_images[1]); imshow("Red", bgr_images[2]); waitKey(0); return 0; } |
line 21-22:
vector<Mat> bgr_images(3); split(inputImg, bgr_images);
inputImg는 RGB 3개의 채널을 가진 컬러이미지이다.
이를 R,G,B로 분리해 내기 위해서는,
각 채널별로 저장할 공간을 만들어야 한다.
이를 위해, Mat의 vector인 bgr_images를 만든다.
이것은 크기 3인 배열이라고 생각하면 된다.
함수 split( )호출은 inputImg를 R,G,B로 분리한다.
이 때,
bgr_images[0]은 Blue
bgr_images[1]은 Green
bgr_images[2]는 Red 채널에 해당하게된다.
RGB 순서가 거꾸로 저장된다고 이해하면 쉽다.
moveWindow("Original", 100, 100); moveWindow("Blue", 120, 120); moveWindow("Green", 140, 140); moveWindow("Red", 160, 160); imshow("Original", inputImg); imshow("Blue", bgr_images[0]); imshow("Green", bgr_images[1]); imshow("Red", bgr_images[2]);
4개의 이미지 창을 만들어
원래 이미지와 함께, R, G, B 분리 결과를 보여준다.
함수 moveWindow( )는 해당 윈도우의 표시위치를 지정할 수 있도록 한다.
'Computer Vision by OpenCV' 카테고리의 다른 글
OpenCV HLS형식의 이미지 채널별 분리 (Split HLS-formated image) (0) | 2016.03.19 |
---|---|
OpenCV YUV형식의 이미지 분리 (Split YUV-formated image) (0) | 2016.03.19 |
OpenCV 함수 at( )과 포인터 사용간의 시간 차이 (0) | 2016.03.19 |
이미지 반전하기 (Invert Color Image) (0) | 2016.03.18 |
Webcam 영상을 Grey로 출력하기 (0) | 2016.03.16 |