C# OpenCV 강좌 : 제 16강 - Split & Merge

C# OpenCV Split & Merge

C# OpenCV 강좌 : 제 16강 - Split & Merge
[ C#-OpenCvSharp2 ] - 윤대희

분리(Split) 및 병합(Merge)


0 영상이나 이미지를 채널을 나누고 합치기 위해 사용합니다.

채널을 B(Blue), G(Green), R(Red)로 분리하여 채널을 변환할 수 있습니다.

  • Tip : OpenCV의 가산혼합의 삼원색 기본 배열순서BGR입니다.


원본(Source, src)를 영상이나 이미지를 사용하면 됩니다.

영상 사용하기 : 3강 바로가기

이미지 사용하기 : 4강 바로가기



Class


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace test
{
    class OpenCV : IDisposable
    {
        IplImage b;
        IplImage g;
        IplImage r;        
        
        IplImage merge;        
            
        public IplImage Split(IplImage src)
        {
            b = new IplImage(src.Size, BitDepth.U8, 1);
            g = new IplImage(src.Size, BitDepth.U8, 1);
            r = new IplImage(src.Size, BitDepth.U8, 1);

            Cv.Split(src, b, g, r, null);

            return r;
            //return g;
            //return b;                
        }
        
        public IplImage Merge(IplImage src)
        {
            merge = new IplImage(src.Size, BitDepth.U8, 3);
            b = new IplImage(src.Size, BitDepth.U8, 1);
            g = new IplImage(src.Size, BitDepth.U8, 1);
            r = new IplImage(src.Size, BitDepth.U8, 1);

            Cv.Split(src, b, g, r, null);
            Cv.Merge(b, g, r, null, merge);
                    
            return merge;        
        }                
            
        public void Dispose()
        {
            if (b != null) Cv.ReleaseImage(b);
            if (g != null) Cv.ReleaseImage(g);
            if (r != null) Cv.ReleaseImage(r); 
            if (merge != null) Cv.ReleaseImage(merge);               
        }
    }
}



Class Code


Split

b = new IplImage(src.Size, BitDepth.U8, 1);
g = new IplImage(src.Size, BitDepth.U8, 1);
r = new IplImage(src.Size, BitDepth.U8, 1);

bgr 각각은 단색이기 때문에 채널은 1입니다.


Cv.Split(src, b, g, r, null);

Cv.Split()를 이용하여 각각의 채널을 분리합니다. Cv,Split(원본, 채널1, 채널2, 채널3, 채널4)입니다. 채널4의 경우 필요하지 않기 때문에 null로 입력합니다.

  • Tip : 선택된 채널의 색상이 흰색으로 변하고 나머지는 검은색으로 처리됩니다.



Split Result


return b

1


return g

2


return r

3



Class Code


Merge

merge = new IplImage(src.Size, BitDepth.U8, 3);
b = new IplImage(src.Size, BitDepth.U8, 1);
g = new IplImage(src.Size, BitDepth.U8, 1);
r = new IplImage(src.Size, BitDepth.U8, 1);

merge의 경우 채널은 3이며 bgr 각각은 단색이기 때문에 채널은 1입니다.


Cv.Split(src, b, g, r, null);
Cv.Merge(b, g, r, null, merge);

Cv.Merge()를 이용하여 각 채널을 합칩니다. Cv.Merge(채널1, 채널2, 채널3, 채널4, 결과)입니다. 채널4의 경우 필요하지 않기 때문에 null로 입력합니다.

b, g, r의 파리미터채널의 색상으로 혼합하여 보여줍니다. b, g ,r채널 순서를 이용하여 특정 색상 채널을 다른 색상 채널 계열로 혼합제거할 수 있습니다.


  • 채널1 : Blue 계열 채널입니다.
  • 채널2 : Green 계열 채널입니다.
  • 채널3 : Red 계열 채널입니다.
  • Tip : 흰색은 해당 채널의 색상으로 설정됩니다.
  • Tip : 삽입된 채널 이외의 색상에는 검은색으로 처리합니다.



Merge Result


merge(b, null, null, null, merge)

4


merge(g, null, null, null, merge)

5


merge(r, null, null, null, merge)

6


merge(null, b, null, null, merge)

7


merge(null, null, b, null, merge)

8


merge(b, b, b, null, merge)

9


merge(r, g, b, null, merge)

10


merge(b, g, r, null, merge)

11


Main Code


using (OpenCV Convert = new OpenCV())
{
    pictureBoxIpl2.ImageIpl = Convert.Split(src);
}

//

using (OpenCV Convert = new OpenCV())
{
    pictureBoxIpl2.ImageIpl = Convert.Merge(src);
}

Split분리된 채널의 이미지를 표시합니다. Merge혼합된 채널의 이미지를 표시합니다.



Book Image

책이 출간되었습니다!

C#과 파이썬을 활용한 OpenCV 4 프로그래밍

컴퓨터 비전 기초 이론부터 머신러닝을 활용한 영상 처리 프로젝트까지

  • C# OpenCvSharp4
  • Python OpenCV4
  • Using Tesseract
  • Using TensorFlow
  • Using Regular Expression
  • 윤대희 저 | 위키북스

    [yes24 바로가기] [알라딘 바로가기] [교보문고 바로가기]

    후원하기


    ⤧  Previous post C# OpenCV 강좌 : 제 15강 - HSV ⤧  Next post C# OpenCV 강좌 : 제 17강 - Drawing
    C#-OpenCvSharp2 Category