본문 목표
영상처리에서 '노이즈 제거'의 중요성은 80%를 차지한다고해도 과언이 아니다.
노이즈 제거의 방법에는 여러가지가 있겠지만,
가장 쉽게 하는 방법은 영상을 흐리게 하는 것이다.
그 중에서 오늘은 '가우시안 필터' 또는 '가우시안 블러'를 알아보도록 한다.
이 방법은 중앙값에 가중치를 더 주고 주변은 더 흐리게 한다고 보면된다.
키워드 : 가우시안 필터, 가우시안 블러, Gaussian blur
알아볼 함수 원형
- 가우시안 필터 적용한 블러처리 ( Gaussian Blur )
...
Mat img = imread("Lenna.png", 0); //이미지를 grayscale로 불러옴
Mat img_blur;
GaussianBlur(img, img_blur, Size(7, 7), 0);
...
GaussianBlur( src, dst, kernel_size, sigma_x, sigma_y, borderType)
○ src : 입력할 이미지 변수
○ dst : 필터가 적용되어 저장될 이미지 변수
○ kernel_size : 가우시안 함수가 적용된 커널 마스크의 크기
○ sigma_x : X 방향 표준편차
○ sigma_y : Y 방향 표준편차, sigma_x 만 설정하면 자동으로 같은 값으로 적용됨
※simga_x 와 sigma_y 값을 0으로 사용하면 커널 크기에서 자동으로 계산 됨.
○ borderType : 이미지의 테두리 바깥쪽의 가상의 픽셀들을 어떻게 처리할 것인지 선택
- 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
border type을 봤을 때,
OpenCV에서는 기본값으로 mirror padding 을 사용하고 있음을 확인할 수 있었다.
기본적인 이미지 필터 적용 방식은
이 포스팅 전의 Average Filter 에서 자세하게 다뤘으므로
아직 못 봤다면 보는 것을 추천한다.
가우시안 필터를 좀 더 살펴보자면
가우시안 함수는 위와 같을 때,
그래프는 아래와 같다.
여기서 확인할 수 있는 것은
시그마(편차) 에 따라서 그래프 모양이 바뀌는데,
이 뜻은 가중치를 어떻게 줄 것인가 하는 것이다.
편차가 크면, 중앙값과 인접 픽셀 값들이 스무스하게 작용된다면
편차가 작으면, 중앙값에 가중치를 몰빵하는 것이 된다.
가우시안 필터를 적용할 때, 마스크 사이즈를 5x5 로 하고, 시그마(편차)를 5로 설정하면
가우시안 필터 커널은 아래와 같다.
보면 중앙 값이 제일 크게 가중치가 적용된 것을 확인할 수 있다.
코드 테스트 결과
- CODE
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int ac, char** av) {
Mat img = imread("Lenna.png", 0); //이미지를 grayscale로 불러옴
Mat img_blur;
GaussianBlur(img, img_blur, Size(7, 7), 0);
imshow("original", img);
imshow("img_blur", img_blur);
waitKey(0);
return 0;
}
- RESULT
원본이미지는 선명한 반면에
가우시안 블러를 적용한 이미지는 확실히 흐릿해졌음을 알 수 있다.
사람이 느끼기에는 원본이 더 좋다고 느끼겠지만,
컴퓨터가 이미지를 분석할 때에는 아래와 같은 이미지가 더 좋다고 느낀다.
그러므로 적절한 blur 방식을 사용하여 이미지를 컴퓨터가 처리하기 쉽게해주는 작업은 매우 중요하다.
이전에 다뤘던 평균필터와 가우시안 필터를 사용하는 상황이 다르기 때문에
주의해야한다.
무작정 가우시안 필터가 더 전문성 있어보인다고 사용해서는 안 된다는 것이다.
다만, 사실 일반인이 사용할 때에는 큰차이 없고,
가우시안 필터가 더 사용하기 편해서 그냥 사용해도 큰 문제는 없다.
가우시안 필터를 평균 필터와 비교했을 때,
평균필터는 비교적 윤곽선이 살아나면서 블러처리가 되고,
가우시안 필터는 윤곽선도 흐려지는 결과를 얻게 된다.
동일한 마스크 크기로 했을 때, 처리속도는 누가 더 빠를 것인지는
직접 생각해보시고, 테스트 해보시길 바란다.
비슷하게 노이즈가 제거되는 상황이면,
처리속도가 빠른것을 선택하는 것이 현명하기 때문에 제일 중요한 부분이라 할 수 있다.
도움이 되었거나, 문제가 있는 경우 댓글로 알려주세요~!
감사의 댓글은 작성자에게 큰 힘이 됩니다 ^^
'코딩 > OpenCV' 카테고리의 다른 글
[C++ opencv] Thresholding 임계값 처리로 binary 이미지 만들기 (1) | 2020.06.30 |
---|---|
[C++ opencv] 가우시안 필터 vs 평균 필터, 노이즈제거 승자는? (6) | 2020.06.30 |
[C++ opencv] 평균필터 적용하여 노이즈 제거하기 average filter, filter2d() (2) | 2020.06.26 |
[C++ opencv] 효율적인 Histogram 이용한 이미지 밝기 조절 (4) | 2020.06.25 |
[C++ opencv] 가장 쉽게 이미지 밝기 조절 하는 방법 (0) | 2020.06.25 |
댓글