Python----計算機視覺處理(Opencv:圖像噪點消除:濾波算法,噪點消除)
一、圖像平滑
????????圖像平滑處理(Smoothing Images),也稱為圖像模糊處理、圖像濾波(Images Filtering),就是在保留圖像原有信息的情況下,過濾掉圖像內部的噪聲,所得到的圖像稱 為平滑圖像。
圖像處理中平滑操作就是一種
預處理
的手段,目的是為后續的處理工作做鋪墊。
平滑的目的是什么
-
噪聲去除:圖像在采集過程中可能會受到各種噪聲的影響,平滑操作能夠有效減小噪聲對圖像質量的影響。
-
特征提取:通過平滑去除細節,有助于在后續處理(如邊緣檢測、形態學處理等)中更好地提取關鍵特征。
-
圖像壓縮:某些壓縮算法依賴于圖像的平滑化,以降低數據冗余。
常見濾波
-
均值濾波
-
高斯濾波
-
中值濾波
-
雙邊濾波
二、均值濾波
????????均值濾波是一種常用的線性濾波技術,主要用于平滑信號,從而減少噪聲。這種方法通過將信號中某個點的值替換為其鄰域內所有點的平均值,來消除噪聲波動。
????????但需要注意的是,由于它取的是“平均”,所以在消除噪聲的同時,也會不可避免地模糊掉一些信號的細節。
2.1、均值濾波核心思想
????????均值濾波是一種簡單的平滑技術,通過將圖像中某個像素與其鄰域像素的平均值替換,從而使圖像變得模糊。它的核心思想是用一個固定大小的窗口(例如 3x3 或 5x5)在圖像上滑動,然后將窗口內的所有像素值的平均值賦給當前像素。
1、選擇窗口大小
均值濾波的第一步是選擇一個滑動窗口的大小,通常為3x3、5x5等。窗口的大小決定了參與平均計算的像素點數量。一般選擇奇數大小的窗口,以便有一個明確的中心點。
2、窗口移動
均值濾波的窗口需要在信號或圖像上逐步移動。窗口通常從信號或圖像的左上角開始,一步一步地向右移動,然后再向下移動,直到覆蓋整個信號或圖像。
如果步長加大,會使得計算結果的精度下降,導致濾波效果不佳。
3、計算平均值
在窗口確定的位置,將窗口中的所有數值相加,然后除以窗口中的數值個數,得到均值。這個均值將作為窗口中心點的新的數值。這就像我們做菜時,將所有食材切碎、混合,然后嘗一嘗,確定一個統一的“味道”。
2.2、適用場景
- 椒鹽噪聲:均值濾波對隨機的黑白噪聲(如椒鹽噪聲)有較好的去除效果,因為它可以通過鄰域平均將這些極端值抹去。
- 圖像處理和分析:在圖像預處理階段,均值濾波常常作為去噪步驟,用于準備更清晰的圖像以供進一步處理,例如邊緣檢測、圖像分割等。
?
import cv2 # 導入OpenCV庫img = cv2.imread('./images/jiaoyan_pands.jpg')# 對圖像進行均值模糊
# (5, 5) 是模糊核的大小,它決定了模糊的程度。
# 數字越大,模糊效果越明顯。
res = cv2.blur(img, (5, 5))# 顯示原始圖像
cv2.imshow('img', img)# 顯示模糊后的圖像
cv2.imshow('res', res)# 等待按鍵
# 0 表示無限等待,直到用戶按下任意按鍵。
# 如果設置為正整數,則表示等待的毫秒數。
cv2.waitKey(0)# 銷毀所有OpenCV窗口
cv2.destroyAllWindows()
三、高斯濾波
3.1、概念
????????高斯濾波(Gaussian filter) 包含許多種,包括低通、帶通和高通等,我們通常圖像上說的高斯濾波,指的是高斯模糊(Gaussian Blur) ,是一種高斯低通濾波 ,其過濾調圖像高頻成分(圖像細節部分),保留圖像低頻成分(圖像平滑區域),所以對圖像進行 ‘高斯模糊’ 后,圖像會變得模糊。
高斯模糊
對于抑制?高斯噪聲
?(服從正態分布的噪聲) 非常有效。
????????這個矩陣的每個數字表示該位置上像素點的權重。中間的數字權重大,表示圖像中心的 像素影響較大,而周圍像素的影響較小。?
高斯模糊本質上就是利用高斯函數生成的高斯核(高斯模板)對圖像進行卷積操作。
應用場景
- 噪聲去除:在圖像預處理階段,常用于去除高斯噪聲。
- 邊緣檢測前處理:在邊緣檢測算法(如Canny算法)之前,通常會先應用高斯濾波來去除噪聲,提高邊緣檢測的效果。
import cv2 # 導入OpenCV庫img = cv2.imread('./images/jiaoyan_pands.jpg')# 對圖像進行高斯模糊
# (5, 5) 是高斯核的大小,它決定了模糊的程度。
# sigmaX=0 表示OpenCV會根據核的大小自動計算X方向的標準差。
# 高斯模糊相比均值模糊,在平滑圖像的同時更能保留圖像的邊緣信息。
gres = cv2.GaussianBlur(img, (5, 5), sigmaX=0)# 顯示原始圖像
cv2.imshow('img', img)# 顯示高斯模糊后的圖像
cv2.imshow('gres', gres)# 等待按鍵
# 0 表示無限等待,直到用戶按下任意按鍵。
cv2.waitKey(0)# 銷毀所有OpenCV窗口
cv2.destroyAllWindows()
四、中值濾波
????????中值濾波是一種常用的圖像處理技術,特別用于去除圖像中的噪聲。其基本原理是通過替換每個像素的值為其鄰域內像素的中值來平滑圖像,減少噪聲。
中值濾波的步驟
- 對于圖像中的每個像素點,選取一個鄰域窗口(通常是3x3、5x5或7x7的窗口)。
- 將窗口內的所有像素值排序。
- 用排序后的中間值替代當前像素的值。
這種濾波方法尤其對椒鹽噪聲(即圖像中有白點和黑點)效果顯著,因為它能有效去除這些異常值,而不影響圖像的整體結構。
中值濾波的優缺點
- 優點:能有效去除椒鹽噪聲,保留圖像邊緣信息。
- 缺點:處理速度較慢,尤其在窗口較大時,計算量會增加。
import cv2 # 導入OpenCV庫img = cv2.imread('./images/jiaoyan_pands.jpg')# 對圖像進行中值模糊
# 5 是模糊核的大小(必須是奇數)。
# 中值模糊對于去除椒鹽噪聲(salt-and-pepper noise)特別有效,
# 因為它用像素鄰域內的中值來替代中心像素的值,
# 從而有效地消除離群的噪聲點,同時又能較好地保留圖像邊緣。
medres = cv2.medianBlur(img, 5)# 顯示原始圖像
cv2.imshow('img', img)# 顯示中值模糊后的圖像
cv2.imshow('medres', medres)# 等待按鍵
# 0 表示無限等待,直到用戶按下任意按鍵。
cv2.waitKey(0)# 銷毀所有OpenCV窗口
cv2.destroyAllWindows()
五、雙邊濾波
????????雙邊濾波(Bilateral Filtering)是一種在保持邊緣的同時去除噪聲的圖像平滑技術。與傳統的高斯濾波不同,雙邊濾波在空間上進行平滑的同時,也考慮像素值的差異,從而有效地保護邊緣信息。????????
????????雙邊濾波的核心思想是:在濾波時,不僅考慮像素之間的空間距離,還考慮像素值的相似性。具體來說,雙邊濾波的權重由兩部分組成
雙邊濾波主要用于以下幾個領域:
-
去噪:適用于去除圖像中的噪聲,特別是圖像中包含大量高頻噪聲時。
-
圖像平滑:在保持邊緣的同時平滑圖像,常用于圖像美化。
-
圖像增強:增強圖像中的特征,突出重要部分,尤其是在邊緣部分。
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
參數 描述 src 輸入圖像,可以是灰度圖或彩色圖。 d 鄰域直徑。若為負值,函數會根據? sigmaSpace
?自動計算。sigmaColor 顏色空間的標準差,控制顏色相似度的影響。較大的值意味著更多的像素會被平滑處理。 sigmaSpace 空間坐標的標準差,控制像素的空間鄰域影響。較大的值意味著濾波效果覆蓋更大范圍。
import cv2 # 導入OpenCV庫img = cv2.imread('./images/nezha.png')# 對圖像進行雙邊濾波
# 雙邊濾波是一種非線性的平滑濾波方法,它在平滑圖像的同時能夠很好地保留邊緣。
# 參數解釋:
# 1. img: 輸入圖像。
# 2. 15: 濾波器核的直徑。該值越大,參與計算的像素越多,去噪效果越明顯,但計算量也越大。
# 3. 30: 顏色空間標準差 (sigmaColor)。該值越大,在顏色相差較大的像素之間進行模糊的可能性越大。
# 較大的值意味著更多的顏色會被混合在一起。
# 4. 75: 坐標空間標準差 (sigmaSpace)。該值越大,越遠的像素會相互影響,模糊效果越明顯。
# 它決定了在多大的空間范圍內進行模糊。
# 雙邊濾波的優點在于它結合了空間距離和像素顏色相似度來決定像素的權重,
# 從而實現了在去除噪聲的同時保留圖像的邊緣細節。
biltblur = cv2.bilateralFilter(img, 15, 30, 75) # 修正了sigmaSpace參數為75,使其更常見且避免過大的模糊# 顯示原始圖像
cv2.imshow('img', img)# 顯示雙邊濾波后的圖像
cv2.imshow('biltblur', biltblur)# 等待按鍵
# 0 表示無限等待,直到用戶按下任意按鍵。
cv2.waitKey(0)# 銷毀所有OpenCV窗口
cv2.destroyAllWindows()
Python----計算機視覺處理(Opencv:圖像噪點消除:濾波算法,噪點消除)?