본문 바로가기

Computer Vision by OpenCV

컬러이미지를 색깔별로 구분하기 (Split color image into R, G, B images)

반응형
SMALL



컬러이미지 (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 순서가 거꾸로 저장된다고 이해하면 쉽다.


line 29-37:
	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( )는 해당 윈도우의 표시위치를 지정할 수 있도록 한다.


반응형
LIST