C# OpenCV 강좌 : 제 47강 - 2D 필터링

   

2D 필터링 (2D Filter)


1 Filter2D 함수를 이용하여 임의의 선형 필터를 이미지나 영상에 적용합니다. 커널을 직접 생성하여 필터를 적용할 수 있습니다.

가우시안 필터, 중간값 필터를 비롯하여 임의의 필터 또한 직접 생성하여 적용할 수 있습니다.


Main Code


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

namespace test
{
    class OpenCV : IDisposable
    {  
        IplImage filter;
        
        public IplImage Filter2D(IplImage src)
        {   
            filter = new IplImage(src.Size, BitDepth.U8, 3);

            float[] data =  {   1,  4,  7,  4,  1,
                                4,  16, 26, 16, 4,
                                7,  26, 41, 26, 7,
                                4,  16, 26, 16, 4,
                                1,  4,  7,  4,  1   };

            CvMat kernel = new CvMat(5, 5, MatrixType.F32C1, data);

            Cv.Normalize(kernel, kernel, 1.0, 0, NormType.L1);
            Cv.Filter2D(src, filter, kernel);

            return filter;
        }
                  
        public void Dispose()
        {
            if (filter != null) Cv.ReleaseImage(filter);
        }
    }
}


Class Code


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

결과에 사용할 filter를 생성합니다.


float[] data =  {   1,  4,  7,  4,  1,
                    4,  16, 26, 16, 4,
                    7,  26, 41, 26, 7,
                    4,  16, 26, 16, 4,
                    1,  4,  7,  4,  1   };

1차원 배열을 생성하여 임의의 커널을 생성합니다.


  • Tip : 해당 커널은 가우시안 블러 커널과 동일합니다.



CvMat kernel = new CvMat(5, 5, MatrixType.F32C1, data);

CvMat을 이용하여 매트릭스를 생성합니다. new CvMat(n, m, 매트릭스 타입, 배열)입니다.

nxm 크기의 매트릭스로 변환하여 생성합니다.


Cv.Normalize(kernel, kernel, 1.0, 0, NormType.L1);

Cv.Normalize() 함수를 이용하여 매트릭스를 정규화합니다.

Cv.Normalize(원본, 결과, 최댓값, 최솟값, 정규화기준)입니다.


  • 최댓값 : 정규화된 값의 최댓값입니다.

  • 최솟값 : 정규화된 값의 최솟값입니다.

  • 정규화기준 : 정규화할때의 기준을 선택합니다.

    • NormType.C : 매트릭스의 최댓값을 기준으로 정규화합니다.
    • NormType.L1 : 매트릭스의 합을 기준으로 정규화합니다.
    • NormType.L2 : 매트릭스의 유클리드 노름을 기준으로 정규화합니다.


Cv.Filter2D(src, filter, kernel);

Cv.Filter2D()을 적용합니다. Cv.Filter2D(원본, 결과, 커널)을 사용합니다.


Result


Filter2D

2

SmoothType.Gaussian 5x5

3



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

⤧  Next post Python 강좌 : 제 13강 - Set 기초 연산 ⤧  Previous post C# OpenCV 강좌 : 제 46강 - 피라미드 평균 이동 분할