Image blurring using openCV

less than 1 minute read

이미지 블러링은 이미지 처리나 컴퓨터 비전에 사용되는 기본적인 이미지 변형 방법이다. 이것은 이미지에 필터의 합성(2D convolution)을 통해 이뤄진다. 즉, 원본 이미지 보다 크기가 작은 필터를 이미지 전체에 걸쳐 이동하며 원본 이미지의 픽셀값을 바꾼다. 블러링은 노이즈를 제거하는데 유용한 방법이며, 이미지를 좀 더 매끈하게(smoothing) 하게 보이도록 만드는 효과를 낸다.

이미지 상에서 픽셀의 값은 공간적으로 느리게 변한다. 따라서 픽셀간의 상관관계 (correlation)가 크다. 이를 slow spatial variation이라고 한다. 이것이 이미지에서 시그널(signal)에 해당한다. 반면, 노이즈는 픽셀간의 상관관계가 없다. 즉, 노이즈는 이미지에서 어떤 패턴도 나타내지 않는다.

이 노이즈를 제거하는 효과적인 방법은 바로 평균을 내는 것이다. 노이즈는 서로 상관관계가 아주 약하기 때문에 평균을 내면 0으로 수렴하게 된다. 이를 통해 이미지의 시그널을 상대적으로 부각시킬 수 있다.

대부분의 이미지 블러링 알고리즘은 픽셀값의 평균을 낸다. 평균을 내는 방식이 단순한 산술 평균이냐 아니면 가중치를 고려한 평균이냐에 따라 방법이 다양하게 나뉜다.

이 포스팅에서는 openCV에서 제공하는 4가지 방법의 블러링을 해보도록 하겠다.

  1. Averaging

  2. Gaussian Blurring

  3. Median Blurring

  4. Bilateral Filtering

import cv2
import matplotlib.pyplot as plt
 
image = cv2.imread('../images/lena.png')
 
def plotFigures(original_image, blurred_image):
    plt.figure(figsize=(10,10))
    plt.subplot(121)
    plt.imshow(cv2.cvtColor(original_image,cv2.COLOR_BGR2RGB))
    plt.title('Original')
    plt.xticks([]), plt.yticks([])
 
    plt.subplot(122)
    plt.imshow(cv2.cvtColor(blurred_image,cv2.COLOR_BGR2RGB))
    plt.title('Blurred')
    plt.xticks([]), plt.yticks([])
    plt.show()