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

   

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혼합된 채널의 이미지를 표시합니다.



도움이 되셨다면 광고 클릭 부탁드립니다.

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