목표
- 다양한 저주파 통과 필터로 이미지를 뿌옇게 마만들어 봅시다.
- 2차원 콘볼루션을 통해 커스텀 필터를 사용해봅시다.
2차원 컨벌루션과 필터
- 1차워 신호의 경우 이미지는 다양한 저주파 통과 필터 LPF Low Pass Filter나 고주파 통과 필터 HPF High Pass Filter로 필터링을 할수 있습니다.
- LPF는 노이즈를 제거해주고 영상을 흐리게 만들어 줍니다.
- HPF는 이미지에 존재하는 에지를 찾는데 도와줍니다.
평균 필터
-opencv에서는 이미지를 커널(마스크)로 컨벌루션할수 있게 cv2.filter2D()함수를 제공하는데요.
- 영상에 평균 필터를 적용해본다면 5x5 크기의 평균 필터 커널은 아래와 같이 정의할수도 있겠습니다.
필터 수행
- 각 픽셀에 5 x5 크기의 윈도우(필터, 마스크)가 중간에 그 픽셀이 위치하도록 놓고 25개의 필터와 원본 영상의 값들을 곱한 후 합하여 새 영상에 그 픽셀 자리에 컨벌루션한 결과 합을 넣어줍니다.
- 이렇게 윈도우 내부에서 픽셀들의 평균 값이 계산 되며, 모든 픽셀들에 수행하면 필터링된 결과 이미지를 얻게 됩니다.
- 한번 다음 코드를 돌려보세요.
이미지 블러링(이미지 스무딩)
- 이미지 블러링은 저주파 통과 필터를 영상에다가 컨벌루션하여 얻을수 있습니다.
- 이는 노이즈 제거에 좋은 방법이라할수 있는데요.
- 고주파 성분들(노이즈, 에지)들을 영상에서 제거하여 필터링된 결과 블러된 이미지를 얻게 됩니다.
- OPENCV에선 4가지의 블러링 기술들을 제공하고 있어요.
1. 평균 블러링
- 이미지를 정규화된 박스 필터로 컨볼루션해서 얻을수 있습니다.
- 커널 영역에서 모든 픽셀들의 평균을 구하는 방식으로, 이 평균값으로 해당 픽셀의 값을 바꿔줍니다.
- 여기서 사용하는 함수는 cv2.blur()나 cv2.boxFilter()를 사용하며, 3x3크기의 정규화박스 필터는 아래와 같습니다.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('C:/Users/do/Documents/github/opencv_python/res/opencv_logo.png')
blur = cv2.blur(img,(5,5))
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()
2. 가우시안 블러링
- 이번에는 필터의 모든 계수들이 동일한 박스 필터 대신에 가우시안 필터를 사용해보겠습니다.
- 가우시안 필터는 cv2.GaussianBlur()함수로 사용할수 있는데, X와 Y방향에 표준 편차를 지정해주어야 합니다.
* 0을 주면 필터 크기로 알아서 주고, sigma X만 명시하는경우 Y도 동일하게 적용됩니다.
- 가우시안 필터는 영상 내부의 가우시안 노이즈를 제거하는대 유용합니다.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('C:/Users/do/Documents/github/opencv_python/res/opencv_logo.png')
blur1 = cv2.GaussianBlur(img,(5,5),0)
blur2 = cv2.GaussianBlur(img,(15,15),0)
blur3 = cv2.GaussianBlur(img,(15,15),10)
plt.subplot(221),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(222),plt.imshow(blur1),plt.title('Blurred 1')
plt.xticks([]), plt.yticks([])
plt.subplot(223),plt.imshow(blur2),plt.title('Blurred 2')
plt.xticks([]), plt.yticks([])
plt.subplot(224),plt.imshow(blur3),plt.title('Blurred 3')
plt.xticks([]), plt.yticks([])
plt.show()
'로봇 > 영상' 카테고리의 다른 글
opencv-python 튜토리얼 - 12. 이미지 그라디언트 (0) | 2020.08.14 |
---|---|
opencv-python 튜토리얼 - 11. 모폴로지 연산 (0) | 2020.08.14 |
opencv-python 튜토리얼 - 9. 이미지 이진화 (0) | 2020.08.14 |
opencv-python 튜토리얼 - 8. 이미지 기하학적 변환 (0) | 2020.08.13 |
opencv-python 튜토리얼 - 7. 이미지 기본 연산 다루기 (0) | 2020.08.10 |