Python OpenCV 影像平滑模糊化 blur

本篇 ShengYu 將介紹如何使用 OpenCV 與 Python 來作影像平滑模糊化 blur,在寫 Python 影像處理程式時常會用到 OpenCV cv2.blur 圖片平滑模糊化的功能,接下來介紹怎麼使用 Python 搭配 OpenCV 模組來進行影像平滑模糊化 blur。

影像平滑模糊化是透過使用低通濾波器進行影像卷積來實現的。這對於消除雜訊很有用。實際上使用此濾波器時,它會從影像中去除高頻內容(例如,雜訊,邊緣),也會導致影像邊緣變得模糊(也有其他濾波器不會造成影像邊緣模糊)。OpenCV主要提供四種類型的平滑模糊化技術。
平均濾波 Averaging:使用 opencv 的 cv2.blur 或 cv2.boxFilter
高斯濾波 Gaussian Filtering:使用 opencv 的 cv2.GaussianBlur
中值濾波 Median Filtering:使用 opencv 的 cv2.medianBlur
雙邊濾波 Bilateral Filtering:使用 opencv 的 cv2.bilateralFilter

平均濾波 Averaging

平均濾波是使用 box 濾波器進行影像卷積來完成的。它只是簡單地計算 kernel 裡所有 pixel 的平均值,並將該平均值取代 kernel 中心元素。這是使用 cv2.blur 或 cv2.boxFilter 完成的。

以下範例為平均濾波,kernel 大小為 5x5:

opencv-blur.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('opencv-logo.png')

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

plt.subplot(121), plt.imshow(img), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(blur), plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

結果如下圖所示:

cv2.blur 參數的詳細細節請參考這裡

高斯濾波 Gaussian Filtering

這邊我們介紹高斯濾波 Gaussian Filtering,它與平均濾波 Averaging 類似,平均濾波 Averaging 的 kernel 裡的每個 pixel 權重都是1,而高斯濾波給予每個 pixel 不同權重,中心 pixel 的權重最高,越往邊角權重就越低,相較於平均濾波 Averaging 這樣可以讓圖片失真較少,高斯濾波通常去除雜訊也有不錯的效果。

opencv-GaussianBlur.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('opencv-logo.png')

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

plt.subplot(121), plt.imshow(img), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(blur), plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

結果如下圖所示:

cv2.GaussianBlur 參數的詳細細節請參考這裡

中值濾波 Median Filtering

這邊我們介紹中值濾波 Median Filtering,使用 cv2.medianBlur 就可以計算 kernel 視窗內所有 pixel 的中位數然後取代 kernel 中間的數值,中值濾波 Median Filtering 這個方法對於去除雜訊很有效,我們這邊示範讀取一個有雜訊 opencv logo 的圖片然後做 cv2.medianBlur,kernel 大小為 5,

opencv-medianBlur.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('opencv-logo-noise.png')

blur = cv2.medianBlur(img, 5)

plt.subplot(121), plt.imshow(img), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(blur), plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

結果如下圖所示:

cv2.medianBlur 參數的詳細細節請參考這裡

雙邊濾波 Bilateral Filtering

TBD

cv2.bilateralFilter 參數的詳細細節請參考這裡

參考
[Python+OpenCV] 灰階、模糊、邊緣檢測 | 程式好好玩 - 點部落
https://dotblogs.com.tw/coding4fun/2017/11/09/125723
OpenCV: Smoothing Images
https://docs.opencv.org/4.x/d4/d13/tutorial_py_filtering.html

其它相關文章推薦
Python OpenCV cv2.GaussianBlur 高斯濾波
Python OpenCV cv2.medianBlur 中值濾波
Python OpenCV 影像二值化 Image Thresholding
Python OpenCV 彩色轉灰階(RGB/BGR to GRAY)
Python OpenCV 彩色轉HSV(RGB/BGR to HSV)
Python OpenCV 彩色轉YCbCr(RGB/BGR to YCbCr)
Python OpenCV 影像邊緣偵測 Canny Edge Detection
Python OpenCV resize 圖片縮放