C#/C# OpenCV/

C# OpenCV 4-7. 노이즈 제거

2019. 11. 14.

대표함수

Cv2.BilateralFilter 양방향 필터. 선명도는 증가시키고 노이즈는 감소시키는 비선형 필터

Cv2.GaussianBlur 가우시안 블러. 가우시안 함수를 통해 가중치 적용

Cv2.MedianBlur 중앙값 블러. 커널 영역내의 중앙값으로 픽셀대체

 

Example Code

using System;
using System.Windows.Forms;
using OpenCvSharp;

namespace noisetest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Mat src = Cv2.ImRead("image.jpg");
            Mat[] dst = new Mat[3] { new Mat(), new Mat(), new Mat() };

            Cv2.BilateralFilter(src, dst[0], 5, 250, 10);
            Cv2.GaussianBlur(src, dst[1], new Size(5, 5), 3, 3);
            Cv2.MedianBlur(src, dst[2], 3);

            Cv2.ImShow("src", src);
            Cv2.ImShow("Bilateral", dst[0]);
            Cv2.ImShow("Gaussian", dst[1]);
            Cv2.ImShow("Median", dst[2]);

            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
    }
}

 

Explain Code


Cv2.BilateralFilter(src, dst[0], 5, 250, 10);

Cv2.BilateralFilter(src, dst, int d, double sigmaColor, double sigmaSpace)

    src 입력, dst 출력

    d 이웃한 픽셀의 지름 정의

    sigmaColor 컬러공간의 시그마정의(클수록 영향커짐)

    sigmaSpace 시그마 필터 조절 (클수록 영향 커짐, d>0이면 영향을 받지 않고 그외에는 d값에 비례)

 


Cv2.GaussianBlur(src, dst[1], new Size(5, 5), 3, 3);

Cv2.GaussianBlur(src, dst, Size ksize, double sigmaX, double sigmaY)

    src 입력, dst 출력

    ksize 커널의 크기

        ※ 커널의 크기는 홀수 ex) (1, 1), (3, 3), (5, 5), ...

    sigmaX 1차원 표준편차

    sigmaY 2차원 표준편차

 

Cv2.MedianBlur(src, dst[2], 3);

Cv2.MedianBlur(src, dst, int ksize)

    src 입력, dst 출력

    ksize 커널의 크기

        ※ 커널의 크기는 홀수 ex) 1, 3, 5, ...

 

결과

GaussianBlur는 노이즈 제거가 확실하나 엣지가 모두 뭉개져버렸고

MedianBlur는 엣지는 살아있으나 노이즈가 제거가 덜 되었고

BilateralFilter는 두가지의 중간정도 효과

상황에 따라 선택하여 사용하면 될듯하다