AI 그게 뭔데
끄적끄적 개발일지
AI 그게 뭔데
전체 방문자
오늘
어제
  • 분류 전체보기 (342)
    • 논문 (5)
    • DL(Deep-Learning) (34)
      • 개념 (14)
      • Python 기초 (14)
      • Tensorflow (6)
      • Pytorch (0)
    • NLP (10)
    • OpenCV (53)
    • DevOps (10)
      • AWS (2)
      • Docker & Kubernetes (4)
      • Spark (3)
      • SQL (1)
    • MacOS (1)
    • React-Native (2)
    • BI (3)
      • GA(Google Analytics) (3)
      • Tableau (0)
    • 알고리즘 (221)
      • 백준 (76)
      • 프로그래머스 (108)
      • 기타 알고리즘 (37)

인기 글

태그

  • 파이썬
  • level1
  • LEVEL2
  • OpenCV
  • 이코테
  • 알고리즘
  • Python
  • 연습문제
  • 프로그래머스
  • 백준

최근 글

hELLO · Designed By 정상우.
AI 그게 뭔데

끄적끄적 개발일지

[OpenCV with Python] Filtering : Noise 제거 - 양방향 필터 Bilateral Filter
OpenCV

[OpenCV with Python] Filtering : Noise 제거 - 양방향 필터 Bilateral Filter

2022. 2. 1. 23:01

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

 

 

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

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

 

이 단점을 보완한 것이 양방향 필터(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
    AI 그게 뭔데
    AI 그게 뭔데
    공부와 개발 그리고 AI가 약간 첨가된 흔적 남기기

    티스토리툴바