1.影像平滑處理
平滑化的目的主要為去除影像中的雜訊,常見方法如下:
以下將針對各種方法與效果進行說明與展示。
1.1. 均值濾波
用目前像素周圍N*N個像素的均值來取代原像素值。程式如下:
img_blur_3 = cv2.blur(img,(3,3))
img為輸入影像。(3,3)為kernel size,也就是取均值的範圍,值越大,去除雜訊效果越明顯,但影像會越模糊。
範例圖片為帶有椒鹽雜訊的Lena圖。"img_blur_3"為濾波後的效果,在本例中,和原圖相比,去雜訊的效果雖有改善但效果不明顯,且原圖也隨之模糊了。
<source:Greatway9999>
1.2. 方框濾波
可選擇對均值濾波結果進行正規化或是鄰域像素值之和。通常進行正規化後的效果較佳,而正規化為預設值。程式如下:
img_boxFilter = cv2.boxFilter(img, -1, (3,3))
img為輸入圖像。-1 代表與原始影像使用相同的影像深度。(3,3)為kernel size,值越大,去除雜訊效果越好,但影像會越模糊。
若將參數設定改成不進行正規化,程式會直接進行3*3鄰域的像素和,因此影像的像素值大都超過目前像素的最大值,使輸出影像會接近純白色。
範例圖片為帶有椒鹽雜訊的Lena圖。"img_boxFilter"為濾波後的效果,在本例中,效果和均值濾波相似。
<source:Greatway9999>
1.3. 高斯濾波
將kernel中心點的加權值加強,離中心點越遠,加權值越小。程式如下:
img_GaussianBlur = cv2.GaussianBlur(img, (3,3), 0, 0)
範例圖片為帶有椒鹽雜訊的Lena圖。"img_boxFilter"為濾波後的效果,在本例中,效果和均值濾波相似。
<source:Greatway9999>
1.4. 中值濾波
用鄰域內所有像素值的中間值來替代目前像素值。
img_medianBlur = cv2.medianBlur(img, 3)
要特別注意的地方為 kernel size 要是比1大的奇數。
與前述幾種方法相比,中值濾波對於去除椒鹽雜訊而言,是效果最佳的方法。
然而,由於沒進行均值處理,因此不會有細節模糊的問題。可在不影響原有影像的情況下去除雜訊。但因要進行排序動作,運算量較大。
<source:Greatway9999>
1.5. 雙邊濾波
綜合考慮距離與色彩的加權結果,能有效去除雜訊,較好地保護邊緣資訊。色彩相近的像素點,會被給予較大的加權值。程式與參數說明如下:
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)
- dst為輸出影像
- src為輸入影像
- d為濾波時選取的空間距離參數,表示以目前像素點為中心點的直徑。若濾波空間較大,則速度較慢。
- sigmaColor 是濾波處理時選取的顏色差值範圍,該值決定周圍哪些像素點能夠參與到濾波中。值越大,參與的像素越多。
- borderType為邊界樣式,通常採用預設值即可。
img_bilateralFilter = cv2.bilateralFilter(img, 25, 100, 100)
從結果來看,雙邊濾波對於去除椒鹽雜訊的效果並不明顯。
1.6. 自訂卷積
自訂卷積,通常效果和均值濾波相同
kernel = np.ones((9,9), np.float32)/81
img_filter2D = cv2.filter2D(img, -1, kernel)
<source:Greatway9999>
1.7. 完整範例程式
#Blur
# Example Image:https://commons.wikimedia.org/wiki/File:Lenna_0.1_SP_Noise.png
import numpy as np
import cv2
img = cv2.imread('Lenna_Noise.png')
#均值濾波:用目前像素周圍N*N個像素的均值來取代原像素值。
img_blur_3 = cv2.blur(img,(3,3)) #img為輸入影像。(3,3)為kernel size,也就是取均值的範圍,值越大,去除雜訊效果越好,但影像會越模糊。
cv2.imshow('img', img)
cv2.imshow('img_blur_3', img_blur_3)
#img_blur_10 = cv2.blur(img,(10,10))
#cv2.imshow('img_blur_10', img_blur_10)
#方框濾波:可選擇對均值濾波結果進行正規化或是鄰域像素值之和。通常進行正規化後的效果較佳,而正規化為預設值。
img_boxFilter = cv2.boxFilter(img, -1, (3,3)) #img為輸入圖像。-1 代表與原始影像使用相同的影像深度。(3,3)為kernel size,值越大,去除雜訊效果越好,但影像會越模糊。
cv2.imshow('img_boxFilter', img_boxFilter)
#img_boxFilter_0 = cv2.boxFilter(img, -1, (3,3), normalize = 0) #未進行正規化
#未進行正規化,直接進行3*3鄰域的像素和,因此影像的像素值大都超過目前像素的最大值,使輸出影像會接近純白色
#cv2.imshow('img_boxFilter_0 ', img_boxFilter_0 )
#img_boxFilter_10 = cv2.boxFilter(img, -1, (10,10)) #kernel size,值越大,去除雜訊效果越好,但影像會越模糊。
#cv2.imshow('img_boxFilter_10', img_boxFilter_10)
#高斯濾波:將kernel中心點的加權值加強,離中心點越遠,加權值越小。
img_GaussianBlur = cv2.GaussianBlur(img, (3,3), 0, 0)
cv2.imshow('img_GaussianBlur', img_GaussianBlur)
#中值濾波:用鄰域內所有像素值的中間值來替代目前像素值。
img_medianBlur = cv2.medianBlur(img, 3) #kernel size要是比1大的奇數
cv2.imshow('img_medianBlur', img_medianBlur)
#由於沒進行均值處理,因此不會有細節模糊的問題。可在不影響原有影像的情況下去除雜訊。但因要進行排序動作,運算量較大。
#雙邊濾波:綜合考慮距離與色彩的加權結果,能有效去除雜訊,較好地保護邊緣資訊。
#色彩相近的像素點,會被給予較大的加權值。
# dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)
# dst為輸出影像
# src為輸入影像。
# d為濾波時選取的空間距離參數,表示以目前像素點為中心點的直徑。若濾波空間較大,則速度較慢。
# sigmaColor 是濾波處理時選取的顏色差值範圍,該值決定周圍哪些像素點能夠參與到濾波中。值越大,參與的像素越多。
# borderType為邊界樣式,通常採用預設值即可。
img_bilateralFilter = cv2.bilateralFilter(img, 25, 100, 100)
cv2.imshow('img_bilateralFilter', img_bilateralFilter)
#自訂卷積,通常效果和均值濾波相同
kernel = np.ones((9,9), np.float32)/81
img_filter2D = cv2.filter2D(img, -1, kernel)
cv2.imshow('img_filter2D', img_filter2D)
cv2.waitKey()
cv2.destroyAllWindows()
---
0 留言