[OpenCV] 04-4. Smoothing Images
🐍Python/OpenCV

[OpenCV] 04-4. Smoothing Images

728x90
반응형

< 4-3. Smoothing Images >

  • 다양한 low pass filter(LPF)가 있는 흐릿한 이미지
  • 이미지에 커스텀 필터 적용하기

2D Convolution ( Image Filtering )

1차원 신호에 대해서, 이미지는 다양한 LPF, high-pass filters(HPF)등으로 필터링 할 수 있다. LPF는 노이즈를 제거하거나, 이미지를 흐릿하게 하는데 도움을 준다. HPF 필터들은 이미지에서 윤곽선을 찾도록 도와준다.

OpenCV는 커널을 이미지로 확인하는 cv2.filter2D() 함수를 제공한다. 예를 들어서, 이미지에 대해서 평균 필터를 사용해 볼 것이다. 5x5 평균 필터 커널은 다음과 같이 정의될 수 있다.

K=1251111111111111111111111111

위의 커널로 필터링하면 다음과 같은 작업이 수행된다. 각 픽셀에 대해 5x5 창이 이 픽셀의 중심에 있고, 이 찬 내에 떨어지는 모든 픽셀이 합산되어 그 결과를 25로 나눈다. 이것은 그 창 안의 픽셀 값의 평균을 계산하는 것과 같다. 이 작업은 출력 필터링된 이미지를 생성하기 위해 영상의 모든 픽셀에 대해 수행된다. 다음 코드를 보자.

import cv2
import numpy
import matplotlib.pyplot as plt

img = cv2.imread('golden.jpg')

kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)

plt.subplot(121), plt.imshow(img[:,:,::-1]), plt.title('Original'),plt.axis('off')
plt.subplot(122), plt.imshow(dst[:,:,::-1]), plt.title("Averaging"),plt.axis('off')
plt.show()


Averaging 이미지가 조금 흐릿하게 변한 것을 볼 수 있다.

Image Blurring ( Image Smoothing )

이미지를 흐리는 것은 LPF 커널을 이미지에 계산하여 얻어진다. 이는 노이즈를 제거하는데 유용하다. 이는 사실 고주파 (노이즈, 엣지)를 이미지에서 제거하여 필터를 적용할 때 가장자리가 흐려지게 한다. (가장자리를 흐리게 하지 않는 흐리게하는 기술도 있다.) OpenCV는 주로 4 종류의 흐리게 하는 기술을 제공한다.

1. Averaging

이는 이미지와 정규화된 박스 필터를 계산하여 얻어졌다. 커널 부분 아래의 모든 픽셀의 평균을 간단하게 취하며 중심 요소를 이 평균으로 대체한다. 이는 cv2.blur()나 cv2.boxFilter()에 의해 수행된다. 커널에 대한 자세한 내용은 문서를 참조하자! 우리는 커널의 폭과 높이를 명시해야 한다. 3x3 정규화 박스 필터는 다음과 같다.

K=19111111111

  • 만약에 정규화된 박스 필터를 사용하고 싶지 않다면, cv2.boxFilter()를 사용하고 normalize=False를 사용하면 된다.

아래의 5x5 커널의 예를 보자

img = cv2.imread('circle.jpg')

blur = cv2.blur(img,(5,5))

plt.subplot(121), plt.imshow(img[:,:,::-1]), plt.title('Original'),plt.axis('off')
plt.subplot(122), plt.imshow(blur[:,:,::-1]), plt.title("Averaging"),plt.axis('off')
plt.show()


앞선 사례와 똑같다.

2. Gaussian Filtering

이 방법에서는, 똑같은 계수로 이루어진 박스 필터 대신에, 가우시안 커널이 사용된다. 이는 cv2.GaussianBlur()를 통해 수행된다. 우리는 양수와 홀수 커널의 폭과 높이를 지정해야한다. 또한 표준 편차는 각각 X와 Y방향, 시그마 X,시그마 Y로 지정해야 한다. 시그마 X만 지정하면 시그마 Y는 시그마 X와 동일한 것으로 간주된다. 둘 다 0으로 ㄹ주어지면 커널 크기에서 계산된다. 가우시안 필터링은 가우시안 노이즈를 제거하는 데 매우 효율적이다

원하는 경우, cv2.GaussianKernel() 함수를 사용하여 가우스 커널을 만들 수 있다.

위의 코드를 가우시안 흐림으로 수정하기 위해 다음과 같이 수정할 수 있다.

img = cv2.imread('circle.jpg')

blur = cv2.GaussianBlur(img,(5,5),0)

plt.subplot(121), plt.imshow(img[:,:,::-1]), plt.title('Original'),plt.axis('off')
plt.subplot(122), plt.imshow(blur[:,:,::-1]), plt.title("Gaussian"),plt.axis('off')
plt.show()


3. Median Filtering

cv2.medianBlur() 함수는 커널 창 아래에 있는 모든 필셀의 중앙값을 계산하고 중앙 픽셀은 이 중앙값으로 대체한다. 이는 점잡음을 제거하는데 매우 효율적이다. 한 가지 흥미로운 점은 가우시안 필터와 박스 필터에서 중심 요소에 대한 필터링된 값이 원래 이미지에 존재하지 않을 수 있는 값이 될 수 있다는 것이다. 하지만 중앙 요소는 영상에서 항상 일부 픽셀 값으로 대체되기 때문에 중앙 필터링에서는 그렇지 않다. 이것은 효과적으로 소음을 감소시킨다. 커널 크기는 양의 홀수 정수이어야 한다.

img = cv2.imread('circle.jpg')
median = cv2.medianBlur(img,5)

plt.subplot(121), plt.imshow(img[:,:,::-1]), plt.title('Original'),plt.axis('off')
plt.subplot(122), plt.imshow(median[:,:,::-1]), plt.title("Median"),plt.axis('off')
plt.show()


점잡음들이 많이 사라진 것을 볼 수 있다.

4. Bilateral Filtering

지적한 바와 같이, 앞에서 제시한 필터는 가장자리를 흐리게 하는 경향이 있다. 이는 양방향 필터인 cv2,bangerFilter()의 경우는 해당되지 않으며, 가장자리를 보존하면서 잡음 제거에 매우 효과적이다. 그러나 다른 필터들의 기능에 비하면 느린 편이다. 이미 가우시안 필터가 픽셀 주변의 부분을 차지하고 가우시안 가중 평균을 발견하는 것을 보았다. 이 가우시안 필터는 공간 단독의 함수로서, 즉, 필터링하는 동안 근처의 픽셀을 고려한다. 픽셀의 강도 값이 거의 동일한지 여부를 고려하지 않으며 픽셀이 가장자리에 있는지 여부를 고려하지 않는다. 결과적으로 가우시안 필터는 가장자리를 흐리게 하는 경향이 있어 바람직하지 않다.

양방향 필터는 공간 영역에서 가우시안 필터를 사용하지만, 픽셀 강도 차이의 함수인 (다중) 가우시안 필터 요소를 하나 더 사용한다. 공간의 가우시안 기능은 픽셀만 필터링을 위해 ‘공간 인접’으로 간주하고, 강도 영역(강도 차이의 가우시안 기능)에 적용된 가우시안 성분은 중심 픽셀(‘강도 인접성’)과 유사한 강도를 가진 픽셀만 흐릿한 강도 값을 계산하기 위해 포함된다.

결과적으로 가장자리 근처에 있는 픽셀, 가장자리 반대쪽에 위치한 인접 픽셀의 경우 가장자리를 보존하고, 따라서 중심 픽셀과 비교할 때 큰 강도 변화를 나타내지 않을 것이므로, 이 방법은 가장자리를 보존한다.

아래 예는 양방향 필터링의 사용을 보여준다.

img = cv2.imread('block.jpg')

bf = cv2.bilateralFilter(img,9,75,75)

plt.subplot(121), plt.imshow(img[:,:,::-1]), plt.title('Original'),plt.axis('off')
plt.subplot(122), plt.imshow(bf[:,:,::-1]), plt.title("Bilateral"),plt.axis('off')
plt.show()


보도블럭의 중앙부분은 사라졌지만, 가장자리는 잘 남아있는 것을 볼 수 있다.

728x90
반응형