C# OpenCV 강좌 : 제 27강 - 모폴로지 - 팽창 & 침식

   

모폴로지 팽창 & 침식 (Dilate & Erode)


1 영상이나 이미지의 화소값을 대체하기 위해 사용합니다. 영상이나 이미지에서 DilateErode를 이용해 이미지의 정확도를 높일 수 있습니다.


팽창(Dilate) : 구조 요소를 사용하여 이웃한 화소를 최대 픽셀로 대체합니다. 즉, 어두운 영역이 줄어들며 밝은 영역이 늘어납니다. 노이즈 제거 후 줄어든 크기를 복구하고자 할 때 주로 사용합니다.

침식(Erode) : 구조 요소를 사용하여 이웃한 화소를 최소 픽셀로 대체합니다. 즉, 밝은 영역이 줄어들며 어두운 영역이 늘어납니다. 노이즈 제거에 주로 사용합니다.


원본(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 dil;
        IplImage ero;
            
        public IplImage DilateImage(IplImage src)
        {
            dil = new IplImage(src.Size, BitDepth.U8, 3);

            IplConvKernel element = new IplConvKernel(4, 4, 2, 2, ElementShape.Custom, new int[3, 3]);
            Cv.Dilate(src, dil, element, 3);
            return dil;
        }
        
        public IplImage ErodeImage(IplImage src)
        {
            ero = new IplImage(src.Size, BitDepth.U8, 3);

            IplConvKernel element = new IplConvKernel(4, 4, 2, 2, ElementShape.Custom, new int[3, 3]);
            Cv.Erode(src, ero, element, 3);
            return ero;
        }        
                  
        public void Dispose()
        {
            if (dil != null) Cv.ReleaseImage(dil);
            if (ero != null) Cv.ReleaseImage(ero);
        }
    }
}

Class Code


dil = new IplImage(src.Size, BitDepth.U8, 3);
ero = new IplImage(src.Size, BitDepth.U8, 3);

dilero팽창침식된 이미지입니다. Binary 또는 GrayScale 이미지 이용 시 채널은 1로 대체합니다.


IplConvKernel element = new IplConvKernel(4, 4, 2, 2, ElementShape.Custom, new int[3, 3]);

모폴로지(Morphology)의 형태학적 작업을 위해 IplConvKernel을 이용하여 지정된 크기와 구조 요소를 반환합니다. IplConvKernel(너비, 높이, X좌표, Y좌표, 형태, 커스텀형태)입니다.

  • 너비(cols) : 구조 요소의 너비
  • 높이(rows) : 구조 요소의 높이
  • X좌표(anchorX) : 앵커의 X 좌표
  • Y좌표(anchorY) : 앵커의 Y 좌표
  • 형태(ElementShape.*) : 구조 요소의 형태

    • ElementShape.Cross : 십자형 구조 요소
    • ElementShape.Custom : 사용자 정의 구조 요소
    • ElementShape.Ellipse : 타원형(직사각형에 채워진 타원) 구조 요소
    • ElementShape.Rect : 직사각형 구조 요소
  • 커스텀형태(values) : 사용자 정의 구조 요소의 형태, ElementShape.Custom를 이용할 때 사용하며 new int[n, m]으로 선언


Cv.Dilate(src, dil, element, 3);
Cv.Erode(src, ero, element, 3);

Cv.Dilate()Cv.Erode()를 이용하여 팽창침식 할 수 있습니다. Cv.*(원본, 결과, 구조 요소, 반복횟수)입니다. 반복횟수만큼 적용합니다.


Result


팽창(Dilate)

2

침식(Erode)

2



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

⤧  Next post C# OpenCV 강좌 : 제 28강 - 모폴로지 - 연산 ⤧  Previous post C# OpenCV 강좌 : 제 26강 - 원 검출