OpenCV-Python

OpenCV Python 필터링 - 잡음 제거 : 양방향(bilateral) 필터

rkftks22 2021. 8. 23. 20:37

잡음 제거 필터의 하나

기준 픽셀, 이웃 픽셀과의 거리, 픽셀 값의 차이를 함께 고려하여 블러링 정도 조정

가우시안 필터의 경우 에지 부분까지 blurring 하여 이미지의 형태조차 알아보기 힘든 경우가 많지만

양방향 필터의 경우 에지가 아닌 부분에서만 blurring 하여 물체의 윤곽이 어느 정도 보존이 됩니다.

 

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace [, dst [, borderType]]) [] : 생략 가능

import cv2

img = cv2.imread("imgs/Lenna.png") 

img = cv2.resize(img, dsize=(0, 0), fx=2, fy=2)

dst = cv2.bilateralFilter(img, -1, 10, 10)
dst2 = cv2.bilateralFilter(img, -1, 50, 10)


cv2.imshow("Lenna", img)
cv2.imshow("dst", dst)
cv2.imshow("dst2", dst2)

cv2.waitKey() 
cv2.destroyAllWindows()

dst : sigmaColor - 10 sigmaSpace - 10 / dst2 :  sigmaColor - 10 sigmaSpace - 100
dst : sigmaColor - 10 sigmaSpace - 10 / dst2 :  sigmaColor - 50 sigmaSpace - 10
dst : sigmaColor - 100 sigmaSpace - 10 / dst2 :  sigmaColor - 10 sigmaSpace - 100

 

src : 입력 영상

d : 필터링에 사용될 이웃 픽셀의 거리(지름) 

     음수(-1) 입력 시 sigmaSpace 값에 의해 자동 결정(추천)

sigmaColor : 색 공간에서 필터의 표준 편차(너무 크면 에지 부분을 구분하지 못합니다)

sigmaSpace : 좌표 공간에서 필터의 표준 편차(가우시안 필터에서 시그마와 비슷합니다)

                     값이 클수록 연산 시간이 길어집니다.

※ sigmaSpace를 엄청 크게 줘도 sigmaColor 값이 작다면 큰 변화가 없네요. 서로 값을 바꿔보면서 해보세요

dst : 출력 영상

borderType : 가장자리 픽셀 처리 방식