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 留言