이미지 블러링(Images Smoothing/Blurring)
1. Image Filtering
- image smoothing은 이미지 처리나 컴퓨터 비전에 사용되는 기본적인 이미지 변형 방법이다.
- 이것은 이미지에 필터를 합성하는 것을 통해 이루어 진다.
- 즉 원본 이미지보다 크기가 작은 필터를 이미지 전체에 걸쳐 이동하며 원본 이미지의 픽셀값을 바꾼다.
- 블러링은 노이즈를 제거하는데 유용한 방법이며, 이미지를 좀 더 매끈하게 보이도록 만드는 효과를 낸다.
2D Convolution
- opencv에서는 cv2.filter2D() 함수를 이용하여 이미지에 kernel(filter)를 적용하여 이미지를 Filtering 할 수 있다.
- kernel은 행렬을 의미하는데 크기가 크면 이미지 전체가 blur처리가 많이 된다.(일반적으로 5*5 행렬을 사용하여 적용)
- cv2.fliter2D 함수를 사용해서 평균 값 필터를 적용해보겠다.
- 평균값 필터는 영상의 특정 좌표 값을 주변 픽셀 값들의 산술 평균으로 설정하는 필터이다.
cv2.filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=None) -> dst
• src : 입력 영상
• ddepth : 출력 영상 데이터 타입. (e.g) cv2.CV_8U, cv2.CV_32F, cv2.CV_64F, -1을 지정하면 src와 같은 타입의 dst 영상을 생성합니다.
• kernel: 필터 마스크 행렬. 실수형.
• anchor: 고정점 위치. (-1, -1)이면 필터 중앙을 고정점으로 사용
• delta: 추가적으로 더할 값
• borderType: 가장자리 픽셀 확장 방식
• dst: 출력 영상
import cv2
import numpy as np
img = cv2.imread('flower1.jpg')
kernel = np.ones((5,5), np.float32)/(25)
dst = cv2.filter2D(img,-1,kernel)
--------생략-----------------
2.Image Blurringe
- Image Blurring은 low-pass filter를 이미지에 적용하여 얻을 수 있다.
- 고주파 영역을 제거함으로써 노이즈를 제거하거나 경계선을 흐리게 할 수 있다.
- opencv에는 4가지 형태의 blurring 방법을 제공하고 있다.
Averaging
- Box 형태의 kernel을 이미지에 적용한 후 평균값을 box의 중심점에 적용하는 형태
- cv2.blur() 함수로 적용할 수 있다.
cv2.blur(src, ksize) → dst
- src – Chennel수는 상관없으나
- ksize – kernel 사이즈(ex; (3,3))
Gaussian Filtering
- 평균값 필터 블러링의 단점은 필터링 대상 위치에서 가까이 있는 픽셀과 멀리 있는 픽셀이 모두 같은 가중치를 사용하여 평균을 계산한다.
- 이렿게 될 경우 멀리 있는 픽셀의 영향을 많이 받아 필터 결과의 퀄리티가 낮아지게 된다.
- 이러한 단점을 보완하기 위해 가우시안 필터를 많이 사용하게 된다.
- 필터에 가우시안 함수를 사용하여 거리에 따른 가중치를 이용한다.
- 2차원 가우시안 필터 마스크의 크기는 표준편차에 따라 자동으로 설정된다.
- 즉, 박스 내에 픽셀값을 가우시안 분포의 가중치로 평균 내어 현재 픽셀값을 업데이트 해주는 방법이다.
- 이 가중치는 중심 픽셀에서 멀어질수록 급격하게 줄어든다. 따라서 중심 픽셀의 값은 그 바로 주변의 픽셀들의 영향을 가장 크게 받게 된다.
- cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None) -> dst
• src: 입력 영상. 각 채널 별로 처리됨.
• dst: 출력 영상. src와 같은 크기, 같은 타입.
• ksize: 가우시안 커널 크기. (0, 0)을 지정하면 sigma 값에 의해 자동 결정됨
• sigmaX: x방향 sigma.
• sigmaY: y방향 sigma. 0이면 sigmaX와 같게 설정.
• borderType: 가장자리 픽셀 확장 방식.
영상의 잡음
- Median Filtering에 대해 알아보기 전 잡음에 대해 먼저 알아보도록 하겠다.
- 영상의 잡음은 영상의 픽셀 값에 추가되는 원치 않은 형태의 신호를 의미한다.
- 잡음의 종류로는 두가지가 존재한다.
1) 가우시안 잡음(Gaussian noise)
- 대부분의 잡음 형태는 가우시안 형태이다.
- 잡음이 가우시안 형태로 추가되는데, 픽셀 값에서 조금 더 어두워지거나 밝아지게 된다.
2) Salt&Pepper Noise
- 영상에 소금,후추를 뿌린것과 같이 점 이 있는 잡음
- 요즘은 이런 잡음이 거의 없다
Median Filtering
- Median Filtering은 이러한 잡음 제거에 사용되는데, 특히 Salt&Pepper 잡음 제거에 효과적이다.
- Median Filter는 주변 픽셀들의 값들을 정리하여 그 중앙값으로 픽셀 값을 대체한다.
- OpenCV 에서는 미디언 필터링 함수로 cv2.medianBlur 명령어를 제공하고 있다.
- 화질의 퀄리티면에서 좋은 결과가 나오지는 않는다.
cv2.medianBlur(src, ksize, dst=None) -> dst
src : 입력 영상. 각 채널 별로 처리됨
ksize : 커널 크기. 1보다 큰 홀수를 지정. 숫자 하나를 집어주면 됨
dst : 출력 영상, src와 같은 크기, 같은 타입
Bilateral Filtering - 양방향 필터링
- 가우시안 잡음 제거에는 가우시안 필터가 효과적이다.
- 이렇게 잡음이 있는 자글자글한 부분을 가우시안 필터로 완만하게 수정할 수 있다.
- 하지만 가우시안 블러를 심하게 적용하면 영상에 있는 엣지 부분이 훼손이 생긴다.
- 이 단점을 극복하기 위해 양방향 필터라는 기법이 생긱게 되었다.
- Bilateral Filter는 가우시안 필터를 양쪽 방향으로 두번 한다고 해서 이름이 붙여 졌다.
- 평균 값 필터 또는 가우시안 필터는 에지 부근에서도 픽셀 값을 평탄하게 만드는 단점이있다.
- 양방향 필터는 기존 픽셀과 이웃 픽셀과의 거리, 그리고 픽셀 값의 차이를 함께 고려하여 블러링 정도를 조절한다.
- 양방향 필터는 에지가 아닌 부분에서만 블러링을 한다.
- 평탄한 부분은 가우시안 필터를 이용하고, 엣지 부분이면 가우시안의 일부분만 가져와 필터링을 한다.
- 따라서 엣지를 보존할 수 있다.
- OpenCV에서 제공하는 cv2.bilaterFIlter를 이용해서 양방향 필터링을 적용할 수 있다.
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None) -> dst
• src: 입력 영상. 8비트 또는 실수형, 1채널 또는 3채널.
• d: 필터링에 사용될 이웃 픽셀의 거리(지름), 음수(-1)를 입력하면 sigmaSpace 값에 의해 자동 결정(권장)
• sigmaColor: 색 공간에서 필터의 표준 편차
• sigmaSpace: 좌표 공간에서 필터의 표준 편차
• dst: 출력 영상. src와 같은 크기, 같은 타입.
• borderType: 가장자리 픽셀 처리 방식
- sigmaColor는 엣지냐 아니냐를 판단하는 기준이다.
- sigmaColor을 100으로 주어주면 가우시안 필터를 적용하는 것과 동일하다.
- 또 d는 -1을 권장한다
위에 정리한 내용은
https://deep-learning-study.tistory.com/164?category=946336
[파이썬 OpenCV] 영상 잡음 제거(2) - 양방향 필터 - cv2.bilateralFilter
황선규 박사님의 , 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다. 영상 잡음 제거(2) - 양방향 필터 - cv2.bilateralFIlter 가우시안 잡음 제거에는 가우시안 필터가 효과적입니다.
deep-learning-study.tistory.com
님의 블로그를 참고하였습니다.