이번 튜토리얼에서는 OpenCV의 양방향 필터링(Bilateral Filtering)을 사용해 이미지를 처리하는 방법을 알아봅니다.
양방향 필터는 이미지를 부드럽게 만들고 노이즈를 줄이면서도 객체의 경계(에지)는 선명하게 유지하는 것이 특징입니다. 일반적인 가우시안 블러와 달리, 밝기 차이가 큰 픽셀(즉, 에지 부분)까지 함께 흐려지지 않도록 설계되어 있어 사진 보정이나 전처리 작업에서 널리 활용됩니다.
OpenCV에서는 cv2.bilateralFilter() 함수 하나로 이 기능을 간단히 구현할 수 있습니다. 이 함수는 다음과 같은 주요 매개변수를 받습니다.
- d: 필터링 시 고려할 이웃 픽셀의 지름(diameter)
- sigmaColor: 색 공간(color space)에서의 시그마 값 — 값이 클수록 더 넓은 색상 범위의 픽셀들이 함께 혼합됨
- sigmaSpace: 좌표 공간(coordinate space)에서의 시그마 값 — 값이 클수록 더 멀리 있는 픽셀들까지 영향을 받음
원본 이미지

알고리즘 단계
1단계: cv2 모듈을 임포트한다. 2단계: 이미지를 읽어온다. 3단계: bilateralFilter() 함수를 호출한다. 4단계: 결과 이미지를 화면에 출력한다.
예제 코드
import cv2
image = cv2.imread('testimage.jpg')
blur = cv2.bilateralFilter(image, 29, 100, 100)
cv2.imshow('BilateralFilter', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()코드 설명
cv2.imread('testimage.jpg'): 처리할 이미지 파일을 불러옵니다.cv2.bilateralFilter(image, 29, 100, 100): 지름 29, 색 공간 시그마 100, 좌표 공간 시그마 100으로 양방향 필터링을 적용합니다. 값이 클수록 스무딩 효과가 강해집니다.cv2.waitKey(0)과cv2.destroyAllWindows(): 창이 바로 닫히지 않도록 대기 상태를 유지하고, 종료 시 리소스를 정리합니다.
실행 결과

결과 이미지를 보면 전체적으로 부드러워지고 잡티나 노이즈가 제거되었음에도 불구하고, 객체의 윤곽선과 세부 구조는 비교적 선명하게 유지된 것을 확인할 수 있습니다. 이것이 바로 양방향 필터링의 핵심 장점입니다.
마무리
양방향 필터링은 인물 사진의 피부 보정, 의료 영상 처리, 컴퓨터 비전 파이프라인의 전처리 단계 등 에지 정보가 중요한 작업에 특히 유용합니다. 매개변수인 d, sigmaColor, sigmaSpace 값을 조절하며 다양한 이미지에 적용해 보면 그 특성을 더 깊이 이해할 수 있습니다.