Like Share Discussion Bookmark Smile

J.J. Huang   2026-01-26   Python OpenCV 03.圖片處理篇:基礎技巧   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 基本濾波與模糊效果

📚 前言

在前面我們學會了 調整亮度、對比與負片效果
這一篇要進一步學習 基本濾波與模糊效果,這些操作屬於影像的平滑化處理,能幫助我們降低雜訊、改善影像品質,或製造特殊的視覺效果。

🔍 基本概念

  • 基本濾波 (Filtering):影像處理中的「平滑化」方法,用來降低雜訊或細節。
  • 專業說法:利用「卷積核 (Kernel)」在影像上滑動,計算區域像素的加權值,並用結果更新中心像素。
  • 白話說法:就是「取出一塊指定區域,把裡面所有像素值加起來取平均,再用這個平均值取代中心像素」。
  • 常見方法
    • 平均模糊 (blur):取區域平均值,簡單降噪。
    • 高斯模糊 (GaussianBlur):加權平均,權重符合高斯分佈,效果自然。
    • 中值模糊 (medianBlur):取區域中值,特別適合去除椒鹽雜訊。
    • 雙邊模糊 (bilateralFilter):同時考慮空間距離與像素差異,能保留邊緣細節。

💻 範例程式:平均模糊 (blur)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2

img = cv2.imread("test.png")

# 使用 5x5 卷積核進行平均模糊
blur_5 = cv2.blur(img, (5, 5))
# 使用 25x25 卷積核進行平均模糊
blur_25 = cv2.blur(img, (25, 25))

cv2.imshow("Original", img)
cv2.imshow("Average Blur 5", blur_5)
cv2.imshow("Average Blur 25", blur_25)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:平均模糊 5x5 與 25x25 示例

💻 範例程式:高斯模糊 (GaussianBlur)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2

img = cv2.imread("test.png")

# 使用 5x5 Gaussian 核進行模糊
gaussian_5 = cv2.GaussianBlur(img, (5, 5), 0)
# 使用 25x25 Gaussian 核進行模糊
gaussian_25 = cv2.GaussianBlur(img, (25, 25), 0)

cv2.imshow("Original", img)
cv2.imshow("Gaussian Blur 5", gaussian_5)
cv2.imshow("Gaussian Blur 25", gaussian_25)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:高斯模糊 5x5 與 25x25 示例

💻 範例程式:中值模糊 (medianBlur)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2

img = cv2.imread("test.png")

# 使用 5x5 卷積核進行中值模糊
median_5 = cv2.medianBlur(img, 5)
# 使用 25x25 卷積核進行中值模糊
median_25 = cv2.medianBlur(img, 25)

cv2.imshow("Original", img)
cv2.imshow("Median Blur 5", median_5)
cv2.imshow("Median Blur 25", median_25)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:中值模糊 5x5 與 25x25 示例

💻 範例程式:雙邊模糊 (bilateralFilter)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import cv2

img = cv2.imread("test.png")

# 雙邊濾波:保留邊緣,同時模糊雜訊
bilateral_10_0_0 = cv2.bilateralFilter(img, d=10, sigmaColor=0, sigmaSpace=0)
bilateral_10_50_100 = cv2.bilateralFilter(img, d=10, sigmaColor=50, sigmaSpace=100)
bilateral_10_100_1000 = cv2.bilateralFilter(img, d=10, sigmaColor=100, sigmaSpace=1000)

cv2.imshow("Original", img)
cv2.imshow("Bilateral Filter 10 0 0", bilateral_10_0_0)
cv2.imshow("Bilateral Filter 10 50 100", bilateral_10_50_100)
cv2.imshow("Bilateral Filter 10 100 1000", bilateral_10_100_1000)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:雙邊模糊示例

📌 參數說明

1
cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace)
  • img:來源影像。
  • d:相鄰像素的直徑。
    • 常用值為 5。
    • 數值越大,計算範圍越廣,但運算速度也會變慢。
  • sigmaColor:顏色混合的程度。
    • 數值越大,會混合更多區域的顏色,產生更大區塊的同一種顏色。
  • sigmaSpace:空間距離的影響範圍。
    • 數值越大,影響的範圍就越大,更多像素會被納入計算。

⚠️ 注意事項

  • 卷積核大小:數值越大,模糊效果越強,但也可能導致影像失真。
  • Gaussian 模糊:適合處理高斯雜訊,效果自然。
  • Median 模糊:適合處理椒鹽雜訊 (Salt-and-Pepper Noise)。
  • Bilateral 濾波:能保留邊緣細節,常用於人像或需要邊緣清晰的影像。
  • 應用場景:影像前處理、邊緣檢測前的降噪、人像美化、隱私模糊。

🎯 結語

這一篇我們學會了如何進行 基本濾波與模糊效果,包含平均模糊、Gaussian 模糊、中值模糊與雙邊模糊,掌握影像平滑化的基礎技巧。這些方法能有效降低雜訊,並在影像處理流程中扮演重要角色。

在下一篇,我們將進一步學習 二值化與閾值處理,探索如何將影像轉換成黑白二值影像,方便後續分析。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。


註:以上參考了
OpenCV Tutorials
OpenCV-Python Tutorials
blur()
GaussianBlur()
medianBlur()
bilateralFilter()