Favicon

Image blurring

Peponi4/15/20257m

C#
NugetPackageOpenCvSharp4

1. Introduction

이미지 블러링은 이미지에 나타나는 세부 정보를 부드럽게 하는 효과를 가져온다. 수학적으로는 주로 컨볼루션을 통해 구현되며, 이미지의 각 픽셀 값은 주변 픽셀 값과의 가중 평균으로 대체된다. 커널의 크기에 따라 블러 효과의 강도가 달라지게 되며, 커널의 크기가 클수록 더 강한 효과를 얻을 수 있다.

이미지 블러링을 수행하여 얻을 수 있는 대표적인 효과는 다음과 같다.

  • 노이즈 제거 : 이미지의 노이즈를 줄여 깨끗한 영상을 얻을 수 있다.
  • 세부 정보 감소 : 특정 세부 정보를 흐리게 하여 역동성, 인물 강조 등의 효과를 얻을 수 있다.
  • 시각적 효과 : 애니메이션, 깊이와 같은 효과를 부여할 수 있다.

이 문서에서는 OpenCVSharp4에서 제공하는 다양한 이미지 블러링 메서드에 대한 사용 방법 및 예시를 간략하게 알아본다.

실습에 사용할 이미지는 다음과 같다.

Image by sebastian del val from Pixabay

2. Blur

Blur

Mat.Blur()는 이미지 블러링을 수행할 수 있는 가장 기초적인 방법이다. 평균 블러링이 수행되어 이미지의 세부 사항이 부드러워짐과 함께 노이즈 감소 효과를 얻을 수 있다.

private void Blur(Mat image)
{
    // 커널 내 픽셀 값에 대한 평균 블러링 수행
    using var blurred = image.Blur(new OpenCvSharp.Size(3, 3));
}

3. BoxFilter

Box filter

Mat.BoxFilter()의 경우 기본적으로 Mat.Blur()와 유사하며 경계 처리 방법 등의 추가 기능이 제공되어 상세한 blurring 처리가 가능하다.

private void BoxFilter(Mat image)
{
    // 기본 Blur와 유사하고, 경계 처리 방법 등의 추가 기능 제공
    using var blurred = image.BoxFilter(-1, new OpenCvSharp.Size(3, 3));
}

4. Filter2D

Filter2D

Mat.Filter2D()는 커널을 설정 후 이미지에 대해 correlation 연산을 수행한다. 블러링, 샤프닝 등에 활용할 수 있으며 여기서는 블러링을 수행하는 예시를 알아본다.

private void Filter2D(Mat image)
{
    // 아래 커널에 지정할 공간 크기만큼 배열 할당
    // 블러 또는 샤프닝 효과를 얻는데 사용 가능하며 커널 설정에 따라 평균값, 가우시안 등이 적용된다.
    // 모든 가중치를 동일하게 부여하여 평균 블러링을 적용하는 예시
    float[] weight = [ 1/9f, 1/9f, 1/9f,
                        1/9f, 1/9f, 1/9f,
                        1/9f, 1/9f, 1/9f ];
 
    using var kernel = Mat.FromPixelData(3, 3, MatType.CV_32FC1, weight);
 
    using var blurred = image.Filter2D(-1, kernel);
}

5. Gaussian blur

Gaussian blur

Mat.GaussianBlur()는 가우시안 커널을 이용하여 블러링을 수행한다. 이미지의 노이즈를 줄이고 부드럽게 만드는 데 사용되며, 엣지 검출 또는 전처리에 자주 활용된다.

private void GaussianBlur(Mat image)
{
    // 가우시안 함수를 이용하여 이미지 블러링
    // 너무 심하게 적용하는 경우 엣지 훼손 가능성 있음
    // sigmaX and Y : 해당 축 방향 표준편차 (0 : 자동), 값이 커질수록 더 많이 블러링
    using var blurred = image.GaussianBlur(new OpenCvSharp.Size(3, 3), 0);
}

6. Median blur

Median blur

Mat.MedianBlur()는 커널 내의 픽셀 중 중간값으로 픽셀 값이 대체되어 소금-후추 잡음 특징이 있는 이미지를 처리하는 데 특히 유용하다.

private void MedianBlur(Mat image)
{
    // 커널 내의 픽셀 중 중간값으로 픽셀 대체
    // 노이즈를 제거하는 것에 유용함
    // 소금-후추 잡음 (노이즈로 인한 비정상 픽셀값) 처리에 탁월함
    using var blurred = image.MedianBlur(3);
}

7. Bilateral filter

Bilateral filter

Mat.BilateralFilter()는 인접 픽셀의 값 (거리, 색상) 을 고려하여 블러링을 수행한다. 가우시안 필터가 두 번 적용되어 노이즈를 줄이면서도 엣지를 보존하는 데 효과적이다 (소금-후추 잡음을 제거하는 데도 활용될 수 있다). 다만 필터가 두 번 적용됨에 따라 연산 시간이 많이 소요될 수 있어 강도를 적절하게 설정할 필요가 있다.

private void BilateralFilter(Mat image)
{
    // 인접 픽셀의 값 (거리, 색상) 을 고려하여 블러링 수행
    // 노이즈를 줄이면서 엣지를 보존하는 기법
    // 지름 d를 음수로 지정하면 sigmaSpace (공간 거리의 표준 편차) 에 따라 자동 설정됨
    // sigmaColor 값이 클수록 색상 차이가 큰 픽셀도 연산에 포함됨
    // sigmaSpace 값이 클수록 더 멀리 떨어진 픽셀도 연산에 포함됨
    using var blurred = image.BilateralFilter(-1, 105, 15);
}

8. 참조 자료