Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

OpenCV로 배우는 양방향 필터링(Bilateral Filtering): 노이즈 제거와 에지 보존을 동시에

이번 튜토리얼에서는 OpenCV의 양방향 필터링(Bilateral Filtering)을 사용해 이미지를 처리하는 방법을 알아봅니다.

양방향 필터는 이미지를 부드럽게 만들고 노이즈를 줄이면서도 객체의 경계(에지)는 선명하게 유지하는 것이 특징입니다. 일반적인 가우시안 블러와 달리, 밝기 차이가 큰 픽셀(즉, 에지 부분)까지 함께 흐려지지 않도록 설계되어 있어 사진 보정이나 전처리 작업에서 널리 활용됩니다.

OpenCV에서는 cv2.bilateralFilter() 함수 하나로 이 기능을 간단히 구현할 수 있습니다. 이 함수는 다음과 같은 주요 매개변수를 받습니다.

  • d: 필터링 시 고려할 이웃 픽셀의 지름(diameter)
  • sigmaColor: 색 공간(color space)에서의 시그마 값 — 값이 클수록 더 넓은 색상 범위의 픽셀들이 함께 혼합됨
  • sigmaSpace: 좌표 공간(coordinate space)에서의 시그마 값 — 값이 클수록 더 멀리 있는 픽셀들까지 영향을 받음

원본 이미지

OpenCV로 배우는 양방향 필터링(Bilateral Filtering): 노이즈 제거와 에지 보존을 동시에

알고리즘 단계

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(): 창이 바로 닫히지 않도록 대기 상태를 유지하고, 종료 시 리소스를 정리합니다.

실행 결과

OpenCV로 배우는 양방향 필터링(Bilateral Filtering): 노이즈 제거와 에지 보존을 동시에

결과 이미지를 보면 전체적으로 부드러워지고 잡티나 노이즈가 제거되었음에도 불구하고, 객체의 윤곽선과 세부 구조는 비교적 선명하게 유지된 것을 확인할 수 있습니다. 이것이 바로 양방향 필터링의 핵심 장점입니다.

마무리

양방향 필터링은 인물 사진의 피부 보정, 의료 영상 처리, 컴퓨터 비전 파이프라인의 전처리 단계 등 에지 정보가 중요한 작업에 특히 유용합니다. 매개변수인 d, sigmaColor, sigmaSpace 값을 조절하며 다양한 이미지에 적용해 보면 그 특성을 더 깊이 이해할 수 있습니다.