가우시안 잡음 제거에는 가우시안 필터가 효과적이다
이처럼 잡음이 있는 지글지글한 부분을 가우시안 필터로 완만하게 수정할 수 있다.
하지만 가우시안 블러를 심하게 적용하면 영상에 있는 엣지 부분에 훼손이 생긴다.
이 단점을 보완한 것이 양방향 필터(Bilateral Filter)이다.
양방향 필터 Bilateral filter
가우시안 필터를 양쪽 방향으로 두번 한다고해서 양방향이라는이름이 붙여졌다.
평균 값 필터 또는 가우시안 필터는 엣지 부근에서도 픽셀 값을 평탄하게 만드는 단점이 있다.
양방향 필터는 기준 픽셀과 이웃 픽셀과의 거리, 그리고 픽셀 값의 차이를 함께 고려하여 블러링 정도를 조절한다.
수식을 보면 가우시안 필터 함수(G)가 2개 있는 것을 볼 수 있다.
양방향 필터의 작동 원리
양방향 필터는 에지가 아닌 부분에서만 블러링을 한다.
평탄한 부분은 가우시안 필터르 이용하고, 엣지 부분이면 가우시안의 일부분만 가져와 필터링을 한다.
따라서 엣지를 보존할 수 있다.
이처럼 에지 부근 에서는 가우시안의 일부분만을 가져와 필터링을 한다.
픽셀 값의 차이가 크면 0으로 채워넣고, 가우시안 필터의 고정점과 픽셀차이가 비슷하면 필터값을 가져온다.
✔︎ 양방향 필터링 함수 - cv2.bilaterFilter
import cv2
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
- src: 입력 영상. 8비트 또는 실수형, 1채널 또는 3채널.
- d: 필터링에 사용될 이웃 픽셀의 거리(지름), 음수(-1)를 입력하면 sigmaSpace 값에 의해 자동 결정(권장)
- sigmaColor: 색 공간에서 필터의 표준 편차
- sigmaSpace: 좌표 공간에서 필터의 표준 편차
- dst: 출력 영상. src와 같은 크기, 같은 타입.
- borderType: 가장자리 픽셀 처리 방식
sigmaColor는 엣지냐 아니냐를 판단하는 기준이고, sigmaColor을 100으로 주어주면 가우시안 필터를 적용하는 것과 동일하다.
d는 -1을 권장한다.
💬 예제
import sys
import cv2
src = cv2.imread('lenna.bmp')
if src is None:
print('Image load failed!')
sys.exit()
dst = cv2.bilateralFilter(src, -1, 10, 5)
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
⬇️
모자 부분의 엣지가 훼손되지 않고 보존 되었음을 볼 수 있다.
'OpenCV' 카테고리의 다른 글
[OpenCV with Python] 영상 기하학적 변환 : 전단 변환 - cv2.warpAffine (0) | 2022.02.02 |
---|---|
[OpenCV with Python] 영상 기하학적 변환 : 이동 변환 - cv2.warpAffine (0) | 2022.02.01 |
[OpenCV with Python] Filtering : Noise 제거 - Median Filter (0) | 2022.02.01 |
[OpenCV with Python] Filtering : 영상에 샤프닝 적용 - Unsharp Mask (0) | 2022.02.01 |
[OpenCV with Python] Filtering : Blurring - 가우시안 필터 Gaussian Filter (0) | 2022.02.01 |