Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++와 OpenCV로 이미지를 각 채널별로 분리하는 방법

RGB 이미지는 빨강(Red), 초록(Green), 파랑(Blue)의 세 가지 채널로 구성되어 있습니다. 이처럼 빨강, 초록, 파랑 채널이 이미지를 표현하는 색 공간을 RGB 색 공간이라고 부릅니다. 다만 OpenCV에서는 RGB 순서 대신 BGR 순서를 사용합니다. 즉, 첫 번째 채널은 파랑, 두 번째 채널은 초록, 세 번째 채널은 빨강을 의미합니다.

1. 세 개의 채널을 담을 행렬 선언하기

RGB 이미지를 각 채널로 분리하려면 먼저 3개의 채널을 저장할 수 있는 행렬 배열을 정의해야 합니다. 이때 다음과 같이 선언합니다.

Mat different_Channels[3]; // 3개 채널을 저장할 행렬 배열 선언 //

2. split() 함수로 이미지 분리하기

다음으로, OpenCV에서 제공하는 split() 함수를 사용하여 불러온 이미지를 채널별로 분리합니다. 이 함수의 기본 형식은 다음과 같습니다.

split(원본 행렬, 대상 행렬);

split() 함수는 원본 행렬에 저장된 이미지를 채널 단위로 나누어 대상 행렬에 순서대로 저장합니다. 실제 코드에서는 아래 한 줄로 처리됩니다.

split(myImage, different_Channels); // 이미지를 3개 채널로 분리 //

이 시점에서 split() 함수는 파랑, 초록, 빨강 채널을 이미 different_Channels 배열에 저장한 상태입니다. 이제 각 채널의 이미지를 새로운 행렬 변수에 옮겨 담습니다.

Mat b = different_Channels[0]; // 파랑 채널 불러오기 //
Mat g = different_Channels[1]; // 초록 채널 불러오기 //
Mat r = different_Channels[2]; // 빨강 채널 불러오기 //

3. 각 채널 화면에 출력하기

마지막으로 imshow() 함수를 사용하여 분리된 각 채널을 별도의 창에 띄워 확인할 수 있습니다.

imshow("Blue Channel", b); // 파랑 채널 출력 //
imshow("Green Channel", g); // 초록 채널 출력 //
imshow("Red Channel", r); // 빨강 채널 출력 //

이 과정을 통해 하나의 이미지를 구성하는 채널들을 손쉽게 분리할 수 있습니다.

전체 예제 코드

아래 프로그램은 RGB 이미지를 파랑, 초록, 빨강 채널로 분리하여 각각 화면에 출력하는 전체 예제입니다.

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main(int argc,const char** argv) {
    Mat myImage; // 이미지를 불러올 행렬 선언 //
    Mat different_Channels[3]; // 3개 채널을 저장할 행렬 배열 선언 //  
    myImage = imread("RGB.png"); // myImage 행렬에 이미지 불러오기 //
    split(myImage, different_Channels); // 이미지를 3개 채널로 분리 //  
    Mat b = different_Channels[0]; // 파랑 채널 불러오기 //
    Mat g = different_Channels[1]; // 초록 채널 불러오기 //
    Mat r = different_Channels[2]; // 빨강 채널 불러오기 //  
    imshow("Blue Channel", b); // 파랑 채널 출력 //
    imshow("Green Channel", g); // 초록 채널 출력 //
    imshow("Red Channel", r); // 빨강 채널 출력 //
    imshow("Actual_Image", myImage); // 원본 이미지 출력 //
    waitKey(0); // 키 입력 대기
    destroyAllWindows(); // 모든 창 닫기 //
    return 0;
}

실행 결과

C++와 OpenCV로 이미지를 각 채널별로 분리하는 방법

실행 결과를 보면 원본 이미지가 파랑, 초록, 빨강 채널로 각각 분리되어 출력된 것을 확인할 수 있습니다. 각 채널 이미지는 해당 색 성분의 강도를 명암(그레이스케일) 형태로 보여주며, 값이 밝을수록 그 색 성분이 많이 포함되어 있다는 의미입니다.