조금씩 꾸준히 완성을 향해

[OpenCV/Python] 블러 필터링(Blur, GaussianBlur, Bilateral Filter, MedianBlur) 본문

Python/OpenCV

[OpenCV/Python] 블러 필터링(Blur, GaussianBlur, Bilateral Filter, MedianBlur)

all_sound 2022. 11. 13. 12:51

영상 공간 필터링

  • 원하는 정보는 통과, 나머지는 걸러내는 작업
  • 대표적인 필터 : 잡음 제거, 부드러운 성분 제거 etc
  • 필터(마스크, 커널, 윈도우...)와 합성곱 연산

# 필터링 연산

  • 합성곱 연산(convolution)

# Border Type

# 블러 필터

▶ Blur

# lena, filter 3 x 3, 7 x 7

src = cv2.imread('./lena.jpg')

dst1 = cv2.blur(src, ksize = (3,3), borderType=cv2.BORDER_CONSTANT)
dst2 = cv2.blur(src, ksize = (3,3), borderType=cv2.BORDER_REPLICATE)
dst3 = cv2.blur(src, ksize = (7,7), borderType=cv2.BORDER_REFLECT)
dst4 = cv2.blur(src, ksize = (7,7), borderType=cv2.BORDER_REFLECT_101)

cv2.imshow('src', src)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
cv2.imshow('dst3', dst3)
cv2.imshow('dst4', dst4)
cv2.waitKey()
cv2.destroyAllWindows()
 

▶ GaussianBlur

src = cv2.imread('./lena.jpg')

# sigma : 분산 정도 (커질수록 가운데 값의 가중치가 줄이든다)
# 0을 넣으면 kernel 사이즈에 맞춰 자동으로 계산해줌
dst1 = cv2.blur(src, ksize=(7,7), borderType=cv2.BORDER_CONSTANT)
dst2 = cv2.GaussianBlur(src, ksize=(3,3), sigmaX=0, sigmaY=0, borderType=cv2.BORDER_CONSTANT)
dst3 = cv2.GaussianBlur(src, ksize=(7,7), sigmaX=10, sigmaY=10, borderType=cv2.BORDER_CONSTANT)

cv2.imshow('src', src)
cv2.imshow('Blur', dst1)
cv2.imshow('GaussianBlur1', dst2)
cv2.imshow('GaussianBlur2', dst3)
cv2.waitKey()
cv2.destroyAllWindows()
 
 

Bilateral Filter

  • 엣지를 제거하는 노이즈 제거 필터
 src = cv2.imread('./lena.jpg')

dst1 = cv2.blur(src, ksize=(3,3), borderType=cv2.BORDER_CONSTANT)
dst2 = cv2.bilateralFilter(src, -1, 10, 10, cv2.BORDER_CONSTANT)
dst3 = cv2.bilateralFilter(src, 0, 40, 10, cv2.BORDER_CONSTANT)

img = np.hstack((dst2, dst3))
cv2.imshow('src', src)
cv2.imshow('Blur', dst1)
cv2.imshow('bilateralFilter', img)
cv2.waitKey()
cv2.destroyAllWindows()
 
 

▶ MedianBlur

  • 픽셀의 중앙값을 취하는 방법
src = cv2.imread('./lena.jpg', cv2.IMREAD_GRAYSCALE)

dst1 = cv2.blur(src, ksize=(3,3), borderType=cv2.BORDER_CONSTANT)
dst2 = cv2.medianBlur(src, ksize=3)
dst3 = cv2.medianBlur(src, ksize=5)

img = np.hstack((dst2, dst3))
cv2.imshow('src', src)
cv2.imshow('Blur', dst1)
cv2.imshow('medianBlur', img)
cv2.waitKey()
cv2.destroyAllWindows()
 
 
  • Salt & Peppers noise removal
src = cv2.imread('./lena_noise.png', cv2.IMREAD_GRAYSCALE)

dst1 = cv2.medianBlur(src, ksize=3)

cv2.imshow('src', src)
cv2.imshow('dst1', dst1)
cv2.waitKey()
cv2.destroyAllWindows()