상위 목록: 하위 목록: 작성 날짜: 읽는 데 14 분 소요

분리(Split) 및 병합(Merge)

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

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

원본(Source, src)은 영상이나 이미지를 사용합니다.



클래스 코드

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

namespace Project
{
    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);               
        }
    }
}


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 : 선택된 채널의 색상이 흰색으로 변하고 나머지는 검은색으로 처리됩니다.


출력 결과

return b


return g


return r



병합 세부 코드

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(b, null, null, null, merge)


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


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


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


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


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


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


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



메인 코드

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

//

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

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

댓글 남기기