ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Split/Merge
    컴공지식/컴퓨터비전 2024. 9. 20. 00:49

    Split/Merge는 이미지의 여러 채널을 다루는 기술이다.

    이미지는 여러 색상 채널(RGB, BGR, YUV 등)로 이루어져 있다.

    Split은 이미지를 각 채널별로 나누는 것이고, Merge는 나눠진 채널들을 다시 합치는 과정이다.

     

    Split (채널 분리)

    void split(Mat src, Mat* mv)

     

    이 함수는 여러 채널로 이루어진 이미지를 각각의 단일 채널 이미지들로 분리한다.

    mv는 포인터인 것을 보면 눈치를 챘겠지만 배열인데, 출력 배열이다. 각각의 채널이 저장된다.

    예를 들어, BGR 이미지라면 mv[0]은 B 채널, mv[1]은 G 채널, mv[2]는 R 채널이 되는 거다.

    src.channels() 함수를 이용하여 이미지의 채널 수를 반환받아 이 수만큼 배열을 이용하면 된다.

     

    Merge (채널 합치기)

    void merge(InputArrayOfArray mv, OutputArray dst)

     

    MergeSplit의 반대 과정이다. 나눠져 있던 단일 채널 이미지들을 다시 합쳐서 하나의 이미지로 만들어준다.

    mv는 각 채널들을 저장한 배열이다. 예를 들어, mv[0]은 B 채널, mv[1]은 G 채널, mv[2]는 R 채널이 된다.

    dst는 결과적으로 합쳐진 이미지를 저장할 변수다. 

     

    이런 과정들이 왜 중요하냐면 이미지 처리할 때, 채널별로 따로 작업을 해야 할 때가 많다.

    예를 들어, R 채널만 따로 조작하거나 그레이스케일로 바꾸려면 채널을 분리하고 나서 각각의 채널에 필터를 적용하는 게 일반적이다.

    그런 다음 다시 합쳐서 최종 결과물을 만드는 거다.

     

     

    Split/Merge 실전 코드를 알아보자

    이 코드를 보면 이미지 채널 분리하고 다시 합치는 작업을 어떻게 하는지 확실히 알 수 있을 거다.

     

    int main() {
        Mat image, image_YUV, dst;  // 원본 이미지, YUV 이미지, 병합된 이미지용 Mat 선언
        Mat yuv_channels[3];        // YUV 채널을 저장할 배열 (채널 분리용)

        image = imread("lena.png"); // "lena.png" 이미지를 읽어서 image에 저장

        cvtColor(image, image_YUV, CV_BGR2YUV); // BGR 이미지를 YUV로 변환해서 image_YUV에 저장

        split(image_YUV, yuv_channels); // YUV 이미지의 각 채널을 분리해서 yuv_channels 배열에 저장

        merge(yuv_channels, 3, dst);    // 분리된 3개의 YUV 채널을 다시 합쳐서 dst에 저장

        imshow("input image", image);   // 원본 이미지 출력
        imshow("Y", yuv_channels[0]);   // Y 채널 출력
        imshow("U", yuv_channels[1]);   // U 채널 출력
        imshow("V", yuv_channels[2]);   // V 채널 출력
        imshow("YUV image", dst);       // 다시 합쳐진 YUV 이미지 출력

        waitKey(0);  // 키 입력을 기다림
        return 0;    // 프로그램 종료
    }

     

    이 코드의 결과를 살펴보면

    imshow("input image", image);: 원본 이미지인 BGR 이미지를 보여준다.

    imshow("Y", yuv_channels[0]);: Y 채널(밝기 정보)을 화면에 출력한다.

    imshow("U", yuv_channels[1]);: U 채널(색차 정보)을 보여준다.

    imshow("V", yuv_channels[2]);: V 채널(색차 정보)도 보여준다.

    imshow("YUV image", dst);: 분리한 채널을 다시 합친 결과 이미지(YUV)를 보여준다.

     

    요약하자면

    이 코드는 이미지의 색상 공간을 BGR에서 YUV로 변환하고, YUV 채널을 분리한 뒤, 다시 합쳐서 각 채널을 따로 보고 합친 결과물도 볼 수 있게 해주는 코드다.

     

     

    '컴공지식 > 컴퓨터비전' 카테고리의 다른 글

    Pseudo Coloring 예제  (0) 2024.09.20
    HSI 예제  (1) 2024.09.20
    Color Conversion  (0) 2024.09.20
    Color Processing  (0) 2024.09.20
    Color Models  (0) 2024.09.19
Designed by Tistory.