chapter 3. image 분리와 병합 기능

이번에 공부할 Sample은 이미지 분리와 병합입니다. 컬러이미지의 RGB 채널별 분리와, 병합을 할 수 있는 기능입니다. OpenCV Split() 함수와 Merge() 함수가 있습니다.

함수 설명

채널 분리

먼저 Split()은 어떻게 사용하는지 아래 예제를 보겠습니다. 우선 Mat[] 배열을 선언 한뒤, Split() 함수로 값을 받아옵니다. 3개의 채널 데이터를 리턴 받게 되고, 각 채널은 순서대로 R, G, B 채널을 분리하여 planes에 리턴 받습니다.

    Mat src = new Mat(FilePath.Image.Lenna, ImreadModes.Color);

    // Split each plane
    Mat[] planes;
    Cv2.Split(src, out planes);

    Cv2.ImShow("planes 0", planes[0]);
    Cv2.ImShow("planes 1", planes[1]);
    Cv2.ImShow("planes 2", planes[2]);
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();

실행 결과는 아래 그림과 같습니다.

채널 분리

채널 병합

다음은 병합을 알아보겠습니다. 채널별 분리된 배열 데이터를 하나로 병합 하는 방법은 아래와 같습니다.

    // Merge
    Mat merged = new Mat();
    Cv2.Merge(planes, merged);

아래 전체 예제 소스를 살펴 보겠습니다. 먼저 이미지를 분리 한 후 G(Green) 채널만 Bit반전을 준뒤 다시 병합 하는 예제입니다.

    Mat src = new Mat(FilePath.Image.Lenna, ImreadModes.Color);

    // Split each plane
    Mat[] planes;
    Cv2.Split(src, out planes);

    Cv2.ImShow("planes 0", planes[0]);
    Cv2.ImShow("planes 1", planes[1]);
    Cv2.ImShow("planes 2", planes[2]);
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();

    // Invert G plane
    Cv2.BitwiseNot(planes[1], planes[1]);

    // Merge
    Mat merged = new Mat();
    Cv2.Merge(planes, merged);

    Cv2.ImShow("src", src);
    Cv2.ImShow("merged", merged);
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();

결과 화면은 아래와 같습니다.

채널을 분리하여 특정 작업을 해야 할때 유용할 듯 합니다. 특정색을 인식한다던지..뭐 그럴때 써먹을려나요?

Leave a comment