본문 목표
영상처리에서 노이즈제거는 매우 중요하다.
앞선 포스트에서 평균필터(average filter)와 가우시안 블러(gaussian blur)를 다뤘었다.
이번에는 보다 전문적으로 노이즈 제거 방법에 대해서 알아보도록 한다.
그리고 영상처리에 있어서 low pass filter는 노이즈 제거라는 것을 이해한다.
키워드 : low pass filter, average filter, gaussian filter, median filter, bilateral filter
알아볼 함수 원형
- 필터 적용 ( filter2d )
blur(img, img_blur, Size(5, 5), Point(-1, -1), BORDER_REFLECT);
GaussianBlur(img, img_gaussian, Size(5, 5), 0, 0, 4);
medianBlur(img, img_median,5);
bilateralFilter(img, img_bilateral, 5,50,50, 4);
blur( src, dst, kernel_Size, anchor,border_Type ) : 평균 필터, Average filter
○ src : 입력할 이미지 변수
○ dst : 필터가 적용되어 저장될 이미지 변수
○ kernel_Size : 적용시킬 평균 필터의 사이즈, Size( x, y) 로 입력해야 함
○ anchor : 적용될 픽셀 위치, 기본값 Point(-1,-1) 을 사용할 것을 권장
○ border_Type : 이미지의 테두리에 대한 처리방법,
- zero padding 또는 reflect(mirror) padding 을 적용할 수 있음
■ BORDER_CONSTANT 또는 0
■ BORDER_REPLICATE 또는 1
■ BORDER_REFLECT 또는 2
■ BORDER_DEFAULT 또는 4
■ BORDER_REFLECT101 또는 4 (기본 값)
■ BORDER_TRANSPARENT 또는 5
■ BORDER_ISOLATED 또는 16
GaussianBlur( src, dst, kernel_Size, sigma_x, sigma_y, border_Type ) : 가우시안 필터, Gaussian filter
○ src : 입력할 이미지 변수
○ dst : 필터가 적용되어 저장될 이미지 변수
○ kernel_Size : 적용시킬 평균 필터의 사이즈, Size( x, y) 로 입력해야 함
○ sigma_x : x방향 표준편차, 기본값 0을 사용하면 자동으로 계산 됨
○ sigma_y : y방향 표준편차, 기본값 0을 사용하면 자동으로 계산 됨
○ border_Type : 이미지의 테두리에 대한 처리방법,
- zero padding 또는 reflect(mirror) padding 을 적용할 수 있음
■ BORDER_CONSTANT 또는 0
■ BORDER_REPLICATE 또는 1
■ BORDER_REFLECT 또는 2
■ BORDER_DEFAULT 또는 4
■ BORDER_REFLECT101 또는 4 (기본 값)
■ BORDER_TRANSPARENT 또는 5
■ BORDER_ISOLATED 또는 16
medianBlur( src, dst, kernel_Size ) : 미디안필터, Median filter
○ src : 입력할 이미지 변수
○ dst : 필터가 적용되어 저장될 이미지 변수
○ kernel_Size : 적용시킬 median 필터의 사이즈, 정사각 행렬로 한 변의 길이만 입력하면 됨
- 3, 5, 7 ... 처럼 홀수를 입력해야 함.
bilateralFilter( src, dst, d, sigma_Color, sigma_Space, border_Type) : 바이라더럴 필터, Bilateral Filter
○ src : 입력할 이미지 변수
○ dst : 필터가 적용되어 저장될 이미지 변수
○ d : 필터를 적용할 때, 고려할 주변 pixel 범위
○ sigma_Color : Color를 고려할 공간, 숫자가 클수록 멀리있는 색도 고려함
○ sigma_Space : 숫자가 크면 멀리있는 픽셀도 고려함
○ border_Type : 이미지의 테두리에 대한 처리방법,
- zero padding 또는 reflect(mirror) padding 을 적용할 수 있음
■ BORDER_CONSTANT 또는 0
■ BORDER_REPLICATE 또는 1
■ BORDER_REFLECT 또는 2
■ BORDER_DEFAULT 또는 4
■ BORDER_REFLECT101 또는 4 (기본 값)
■ BORDER_TRANSPARENT 또는 5
■ BORDER_ISOLATED 또는 16
위에서 다룬 4가지 필터들이 Low Pass Filter (LPF) 이다.
영상처리에서 Low Pass Filter 는 노이즈 제거를 담당한다고 보면 된다.
평균필터와 가우시안 필터는 앞선 포스트들에서 다뤄봤었으므로,
median filter 와 bilateral filter를 다뤄보자.
median filter 는 소금 후추 노이즈 ( Salt and pepper noise ) 제거에 특화되어 있는 필터이다.
점 잡음이라고 하는 소금 후추 노이즈는 이미지에 소금이나 후추가 뿌려지듯한 노이즈를 뜻한다.
위와 같이 소금후추 노이즈가 생긴경우에 적합한 필터가 median filter인데,
그 원리는 아래와 같다.
위와 같은 이미지 행렬 중 일부에서, 커널이 적용된 3 x 3 행렬의 숫자를 차례로 정렬해보면
0, 68, 75, 80, 82, 150, 160, 165, 255
순서로 정렬할 수 있다.
여기서 중간 값이 82 이므로,
필터가 적용되면 중앙 값이 82로 바뀌게 된다.
이렇게 커널을 적용하는 것이 median filter 이다.
따라서 점 잡음이 있는 경우에 average filter 또는 gaussian filter는 0과 255 값을 계산식에 적용이 되다보니깐 문제가 생길 수 있는 것이다.
만약 위의 9개 값에 노이즈로 인해서 255 값이 3개가 있었다고 한다면
average filter는 효과적으로 노이즈를 제거하기에는 노이즈가 필터 적용 후에도 큰 영향을 줘버리게 된다.
따라서 점 잡음이 있는 경우에는 median filter가 적합한 노이즈제거 방법이 될 수 있다.
bilateral filter 는 좀 복잡한 방법의 노이즈 제거 필터이다.
앞에서 다룬 필터들은 비교적 단순한 방법의 노이즈 제거 필터들이었다면
해당 필터는 여러가지를 고려하여 노이즈를 제거한다.
장점은 기존의 blur 처리는 원본 이미지의 물체들의 경계마저도 흐려지는 문제를 극복한 blur 처리가 가능하다는 것이다.
물체들의 경계를 살리면서 잡음을 제거하기 위해서 여러가지 정보가 필요한 것이다.
함수 이름을 그대로 해석하면 양방향 필터라고 부르며,
두개의 가우시안 필터, 도메인 필터, 레인지 필터가 적용된다.
효과는 앞서 다뤘던 노이즈 제거방식보다 좋다고 할 수 있다.
물체들의 가장자리를 살리면서 노이즈만 효과적으로 제거하기 때문이다.
그러나 문제가 있다.
퀄리티와 소요시간은 비례한다.
퀄리티가 좋은만큼 앞서 다룬 다른 방식들에 비해 시간이 오래 걸리는 단점이 있다.
코드 테스트 결과
- CODE
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int ac, char** av)
{
Mat img = imread("Lenna_noise.png");
Mat img_salt = imread("Lenna_salt_noise.png",0);
Mat img_blur, img_gaussian, img_median, img_bilateral;
blur(img, img_blur, Size(5, 5), Point(-1, -1));
GaussianBlur(img, img_gaussian, Size(5, 5), 0, 0, 4);
medianBlur(img_salt, img_median,5);
bilateralFilter(img, img_bilateral, 9,75,75, 4);
imshow("original", img);
imshow("img_blur", img_blur);
imshow("img_gaussian", img_gaussian);
imshow("img_median", img_median);
imshow("img_bilateral", img_bilateral);
waitKey(0);
return 0;
}
코드 그대로 사용하고 싶다면 위의 이미지 파일을 다운받아서 사용하면 된다.
- RESULT
노이즈를 추가한 Lenna 이미지를 사용하여 각각의 방법으로 노이즈 제거를 해보았다.
평균필터를 적용한 이미지이다.
확실히 물체의 테두리가 뭉개지는 것을 볼 수 있다.
대신 자글자글한 노이즈가 많이 억제된 것을 볼 수 있다.
가우시안 필터를 이용한 노이즈 제거 이미지이다.
확실히 원본에 비하면 노이즈가 제거 된 것을 볼 수 있다.
하지만 평균필터(average filter)에 비하면 노이즈 억제가 덜 된것을 볼 수 있다.
대신 평균필터 결과 이미지보다 인물의 가장자리가 뚜렷하다.
median filter는 따로 준비한 salt noise를 추가한 lenna 이미지에 사용하였다.
확실히 노이즈가 없어진 것을 확인 할 수 있다.
median filter는 점잡음에 최적화 되어있는 노이즈 제거 방식이라는 것을 확인할 수 있다.
마지막으로 bilateral filter를 적용한 이미지이다.
확실히 앞에서 봤었던 결과이미지보다 object 들의 가장자리가 뚜렷하게 보이면서 노이즈는 효과적으로 제거된 것을 확인할 수 있다.
결론.
영상처리에서 Low Pass Filter 는 노이즈 제거하는 필터를 뜻한다.
평균필터, 가우시안필터, 중앙값필터, 양방향필터가 LPF(low pass filter) 이다.
각각의 사용방법이 있고, 장 단점이 있다.
도움이 되었거나, 문제가 있는 경우 댓글로 알려주세요~!
감사의 댓글은 작성자에게 큰 힘이 됩니다 ^^
'코딩 > OpenCV' 카테고리의 다른 글
[C++ opencv] "이미지 복사" 개념 이해하기 .copyTo (0) | 2020.07.21 |
---|---|
[C++ opencv] High pass filter (HPF)로 윤곽선 검출, edge detection (1) | 2020.07.15 |
[C++ opencv] 이미지 사이즈 변경하기, resize( ) 함수 사용법 (0) | 2020.07.14 |
[C++ opencv] 이미지에서 경계선 검출하기, Edge detection (1) | 2020.07.04 |
[C++ opencv] opening, closing 기법 사용하여 경계 확실히 하기 (0) | 2020.07.03 |
댓글