컴퓨터 비전/openCV

[openCV] Image Blurring - Gaussian Blur, Median Blur, Bilateral Filter

kdjames0930 2025. 11. 29. 22:30

오늘은 openCV 라이브러리를 이용해 Image Blurring을 해보겠다.

 

Image Blurring은 이미지에서 픽셀값을 주변 픽셀값들과 유사하게 조절하는 것이다.

이를 통해 이미지를 흐릿하게 만들거나 이미지에 포함된 노이즈를 제거하는 것에 활용될 수 있다.

 

openCV에서 제공하는 여러가지 Blurring 기법이 있는데, 여기서 Gaussian Blur, Median Blur, Bilateral Filter 세가지를 사용해보겠다.

 

  • Gaussian Blur

 Gaussian Blur 은 커널을 사용해 각 픽셀 주위의 값들에 가우시안 분포(정규 분포)를 사용해 가중치를 주어 픽셀값을 평균내고, 이때 가까운 픽셀값들에 더 큰 가중치를 부여해 자연스럽게 blur 한다. 직관적으로 생각했을 때 일정한 범위 안의 픽셀값에 전체 산술평균 값을 구하는 것보다 더 자연스러운 블러링이 될 것이다.

 

 Gaussian Blurring 기법은 머신러닝, 딥러닝의 전처리에도 사용된다. (블러링 처리해 노이즈를 제거한 결과물을 사용하면 더욱 정확한 결과를 얻을 수 있다)

 
img = cv2.imread("/content/drive/MyDrive/Dataset/opencv/Rabbit.jpg")
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.title("Original Image")
plt.axis("off")

Gaussian = cv2.GaussianBlur(img, (15, 15), 0)
Gaussian_rgb = cv2.cvtColor(Gaussian, cv2.COLOR_BGR2RGB)

plt.subplot(1, 2, 2)
plt.imshow(Gaussian_rgb)
plt.title("Gaussian Blurred Image")
plt.axis("off")
plt.show()
그림1. 이미지에 Gaussian Blur 적용한 결과

 

블러링을 적용하기 전후를 비교해보면 후에 확연히 흐릿해진 것을 볼 수 있다.

 

  • Median Blur

 Median Blur 은 커널을 사용해 주위 픽셀들의 중간값으로 픽셀값을 대체한다. Salt-and-Pepper noise 제거에 효과적이라는 특징이 있다. (참고로 Salt and Pepper noise는 이미지 위에 검은 점이 무작위로 생기는 노이즈이다) 중간값으로 대체하면 검은색 잡음을 무시할 수 있기 때문이다!

 
 
noise_img = cv2.imread("/content/drive/MyDrive/Dataset/opencv/noised_images.jpg")
noise_img_rgb = cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB)
median_noise_img = cv2.medianBlur(noise_img, 11)
median_noise_img_rgb = cv2.cvtColor(median_noise_img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(noise_img_rgb)
plt.title("Original Image")
plt.axis("off")
plt.subplot(1, 2, 2)
plt.imshow(median_noise_img_rgb)
plt.title("Median Blurred Image")
plt.axis("off")
plt.show()
그림2. 이미지에 Median Blur 적용한 결과

 

Salt and Pepper noise 가 있는 이미지에 Median Blur을 적용해 보았다. 잡음은 많이 제거되었지만 화질은 나빠졌다.

 

  • Bilateral Filter

 위에서 사용한 블러링 기법들은 결과물에서 물체의 윤곽선이 흐려진다는 문제점이 있었다. 이를 해결할 수 있는 것이 Bilateral Filter이다. Bilateral Filter을 사용하면 앳지 부분은 유지하면서 평탄한 부분만 블러링 처리할 수 있다.

 Gaussian Blurring에서는 가중치가 중심 픽셀로부터 떨어진 거리에만 영향을 받았지만, Bilateral Filter에서는 intensity 값도 같이 고려해준다. 만약 Intensity가 크게 다른 픽셀이 있다면 해당 픽셀은 중간 픽셀과 엣지를 경계로 나누어지는 부분의 픽셀로 고려해 계산에서 제외하는 것이다. 따라서 Intensity 값이 유사한 픽셀들에서만 가우시안 필터값을 가져와 계산을 하게 된다.

 

그림3. Bilateral Filter 원리, 출처) https://people.csail.mit.edu/sparis/bf_course .

 

bilateral = cv2.bilateralFilter(src=img, d=-1, sigmaColor=10, sigmaSpace=20)
bilateral_rgb = cv2.cvtColor(bilateral, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.title("Original Image")
plt.axis("off")
plt.subplot(1, 2, 2)
plt.imshow(bilateral_rgb)
plt.title("Bilateral Blurred Image")
plt.axis("off")
plt.show()

 

- sigmaColor: 색(밝기) 차이를 허용하는 정도. 작을수록 엣지로 판단하는 기준이 낮아져 엣지를 더 강하게 보존한다.

- sigmaSpace: 공간 차이를 허용하는 정도. 작을수록 가까운 픽셀값을 강하게 고려해 흐려지는 효과가 약해진다.

그림4. 이미지에 Bilateral Filter 적용한 결과

 

 

윤곽선 부분이 선명하게 보존되는 동시에 블러링이 되었다. Gaussian Filter을 사용했을 때와 윤곽선의 선명함 차이가 분명하게 드러난다!

반응형