Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상 잡음 제거(2) - 양방향 필터 - cv2.bilateralFilter

AI 꿈나무 2020. 10. 3. 16:44
반응형

황선규 박사님의 <OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝>, 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다.

 


영상 잡음 제거(2) - 양방향 필터 - cv2.bilateralFIlter

 가우시안 잡음 제거에는 가우시안 필터가 효과적입니다.

 

 

 이처럼 잡음이 있는 지글지글한 부분을 가우시안 필터로 완만하게 수정할 수 있습니다.

 

 하지만 가우시안 블러를 심하게 적용하면 영상에 있는 엣지 부분에 훼손이 생깁니다.

 

 이 단점을 극복하기 위해 양방향 필터라는 기법이 생겼습니다.

 

양방향 필터 - Bilateral filter

 가우시안 필터를 양쪽 방향으로 두번 한다고해서 이름이 붙여졌습니다.

 

 평균 값 필터 또는 가우시안 필터는 에지 부근에서도 픽셀 값을 평탄하게 만드는 단점이 있습니다.

 

 양방향 필터는 기준 픽셀과 이웃 픽셀과의 거리, 그리고 픽셀 값의 차이를 함께 고려하여 블러링 정도를 조절합니다.

 

양방향 필터 수식

 

 수식을 보면 가우시안 필터 함수 G가 2개 있습니다.

 

양방향 필터의 작동 원리

 양방향 필터는 에지가 아닌 부분에서만 블러링을 합니다.

 

 평탄한 부분은 가우시안 필터르 이용하고, 엣지 부분이면 가우시안의 일부분만 가져와 필터링을 합니다.

 

 따라서 에지를 보존할 수 있습니다.

 

 

 이처럼 에지 부근 에서는 가우시안의 일부분만을 가져와 필터링을 합니다.

 

 픽셀 값의 차이가 크면 0으로 채워넣고, 가우시안 필터의 고정점과 픽셀차이가 비슷하면 필터값을 가져옵니다.

 

양방향 필터링 함수 - cv2.bilaterFilter

 OpenCV에서 제공하는 cv2.bilaterFIlter를 이용해서 양방향 필터링을 적용할 수 있습니다.

 

 함수를 보면 sigma가 두개 있습니다.

 

 sigmaColor는 엣지냐 아니냐를 판단하는 기준입니다.

 

 sigmaColor을 100으로 주어주면 가우시안 필터를 적용하는 것과 동일합니다.

 

 또 d는 -1을 권장합니다.

 

[함수 설명]

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None) -> dst

• src: 입력 영상. 8비트 또는 실수형, 1채널 또는 3채널.
• d: 필터링에 사용될 이웃 픽셀의 거리(지름), 음수(-1)를 입력하면 sigmaSpace 값에 의해 자동 결정(권장)
• sigmaColor: 색 공간에서 필터의 표준 편차
• sigmaSpace: 좌표 공간에서 필터의 표준 편차
• dst: 출력 영상. src와 같은 크기, 같은 타입.
• borderType: 가장자리 픽셀 처리 방식

[양방향 필터링 예제]

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()

 

원본 영상

 

양방향 필터 영상

 

 결과 영상을 보면 머리부분의 에지가 훼손되지 않았습니다.

 

 가우시안 필터를 적용했었더라면 에지가 훼손되었을 것입니다.

 

 감사합니다.

 

반응형