iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
佛心分享-IT 人自學之術

OpwnCV影像處理新手村系列 第 12

🌅 DAY 12:影像平滑與模糊化|blur、GaussianBlur、medianBlur

  • 分享至 

  • xImage
  •  

影像平滑與模糊化(Image Smoothing / Blurring)是影像處理中常見的操作,
主要用於降低影像中的雜訊(Noise)、柔化影像邊緣,以及產生特效。

OpenCV 提供多種模糊方式,其中常用的有:

  • cv2.blur():均值模糊(Average Blur)
  • cv2.GaussianBlur():高斯模糊(Gaussian Blur)
  • cv2.medianBlur():中值模糊(Median Blur)

🖼 測試圖片準備

準備一張圖片 image.jpg,放在與程式同一個資料夾中。

import cv2

img = cv2.imread("image.jpg")

cv2.imshow("Original", img)

# 放最後面
cv2.waitKey()
cv2.destroyAllWindows()

https://ithelp.ithome.com.tw/upload/images/20250914/20129482IF6U4l5Hx9.png


🔹 1. 均值模糊(Average Blur)

cv2.blur(src, ksize)
將影像中每個像素的值替換為鄰域(Kernel)中所有像素的平均值。
這種方式簡單快速,但可能會造成邊緣細節的明顯喪失。

  • ksize:模糊核大小(如 (5,5) 表示 5x5 區域取平均)
# 均值模糊
blur_img1 = cv2.blur(img, (5, 5))
blur_img2 = cv2.blur(img, (10, 50))
blur_img3 = cv2.blur(img, (50, 10))
blur_img4 = cv2.blur(img, (100, 100))

cv2.imshow("Average Blur 1", blur_img1)
cv2.imshow("Average Blur 2", blur_img2)
cv2.imshow("Average Blur 3", blur_img3)
cv2.imshow("Average Blur 4", blur_img4)

顯示的圖片如下:

均質模糊 5x5
https://ithelp.ithome.com.tw/upload/images/20250914/20129482mCmENSBywR.png

均質模糊 10x50 與 50x10(可觀察水平與垂直方向差異)
https://ithelp.ithome.com.tw/upload/images/20250914/20129482fKiIH0dYho.png

均質模糊 100x100
https://ithelp.ithome.com.tw/upload/images/20250914/20129482eyailR2oIW.png

📌 觀察:模糊盒越大,影像越模糊。


🔹 2. 高斯模糊(Gaussian Blur)

cv2.GaussianBlur(src, ksize, sigmaX)
與均值模糊不同,高斯模糊的權重遵循高斯分佈,越靠近中心的像素權重越大,
因此在保留邊緣細節的同時能更有效地去除雜訊。

  • sigmaX:高斯核在 X 方向的標準差(設為 0 時,OpenCV 會根據 ksize 自動計算)
# 高斯模糊
gaussian_img1 = cv2.GaussianBlur(img, (3, 3), 0)
gaussian_img2 = cv2.GaussianBlur(img, (5, 5), 0)
gaussian_img3 = cv2.GaussianBlur(img, (7, 7), 0)

gaussian_img4 = cv2.GaussianBlur(img, (3, 3), 5)
gaussian_img5 = cv2.GaussianBlur(img, (5, 5), 5)
gaussian_img6 = cv2.GaussianBlur(img, (7, 7), 5)

cv2.imshow("Gaussian Blur 1 | (3, 3) sigmaX = 0", gaussian_img1)
cv2.imshow("Gaussian Blur 2 | (5, 5) sigmaX = 0", gaussian_img2)
cv2.imshow("Gaussian Blur 3 | (7, 7) sigmaX = 0", gaussian_img3)
cv2.imshow("Gaussian Blur 4 | (3, 3) sigmaX = 5", gaussian_img4)
cv2.imshow("Gaussian Blur 5 | (5, 5) sigmaX = 5", gaussian_img5)
cv2.imshow("Gaussian Blur 6 | (7, 7) sigmaX = 5", gaussian_img6)

顯示的圖片如下:
https://ithelp.ithome.com.tw/upload/images/20250914/20129482b6X7EWWlxl.png

📌 參數詳解

cv2.GaussianBlur(img, (5, 5), 0) 中:

  • (5, 5) → 高斯核(Gaussian Kernel)大小,必須是奇數(3、5、7…)
  • 核越大,模糊範圍越廣
  • (5, 3) → 水平方向核寬 5,垂直方向核高 3
  • sigmaX = 0 → 自動根據核大小計算標準差
  • 調整 sigmaX 可加強或減弱模糊效果

常用核大小:

  • (3, 3) → 輕微模糊
  • (5, 5) → 中等模糊
  • (7, 7) → 模糊更明顯

🔹 3. 中值模糊(Median Blur)

cv2.medianBlur(src, ksize)
將鄰域像素排序後取中間值作為新的像素值,
對於去除「椒鹽雜訊(Salt & Pepper Noise)」特別有效。

  • ksize:必須是正奇數(3、5、7…)
# 中值模糊
median_img = cv2.medianBlur(img, 5)
cv2.imshow("Median Blur", median_img)

顯示的圖片如下:
https://ithelp.ithome.com.tw/upload/images/20250914/20129482Imkflgi3E2.png


🔄 三種模糊效果比較

# 一次比較三種模糊效果
blur_img = cv2.blur(img, (5, 5))
gaussian_img = cv2.GaussianBlur(img, (5, 5), 0)
median_img = cv2.medianBlur(img, 5)

cv2.imshow("Original", img)
cv2.imshow("Average Blur", blur_img)
cv2.imshow("Gaussian Blur", gaussian_img)
cv2.imshow("Median Blur", median_img)

cv2.waitKey()
cv2.destroyAllWindows()

顯示的圖片如下:
https://ithelp.ithome.com.tw/upload/images/20250914/20129482cXaMntqFam.png


📌 今日結語

  • 均值模糊:取平均值,簡單但邊緣容易糊掉
  • 高斯模糊:加權平均,效果自然,邊緣保留較好
  • 中值模糊:取中位數,去除椒鹽雜訊效果最佳

在影像前處理與特效製作中,選擇合適的模糊方法能達到不同的效果。


上一篇
🌅 DAY 11:影像混合|addWeighted 圖像融合效果
下一篇
🚀 DAY 13:影像銳化(Sharpening)|filter2D、Unsharp Mask、Laplacian
系列文
OpwnCV影像處理新手村14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言