數字圖像處理-空間域處理-空間濾波-平滑空間濾波器


參考自:數字圖像處理第三版-岡薩勒斯

 

平滑濾波用於模糊處理降低噪聲。模糊處理常用於預處理任務中,如在目標提取之前去除圖像中的一些瑣碎細節,以及橋接直線或曲線的縫隙。通過線性或非線性平滑濾波也可降低噪聲。

線性濾波器

均值濾波器(均值平滑、均值濾波)

平均值或加權平均值

 常見的平滑處理應用就是降低噪聲。它會去除與濾波器模板尺寸相比較小的像素區域。然而,由於圖像邊緣也是由圖像灰度尖銳變化帶來的特性,所以均值濾波處理存在不希望有的邊緣模糊效應。

 

空間均值處理的一個重要應用是為了對感興趣的物體得到一個粗略的描述,模糊一幅圖像。這樣,那些較小物體的灰度與背景融合在一起,較大物體變得像“斑點”而易於檢測。模板的大小由那些即將融入背景中的物體尺寸來決定。

(b)中圖像的一些部分或者融入背景中,或者亮度降低

 

 1 """
 2 均值濾波
 3 """
 4 import numpy as np
 5 import cv2
 6 
 7 
 8 # 定義函數,生成椒鹽噪聲圖像
 9 def salt_pepperNoise(src):
10     dst = src.copy()
11     num = 1000  # 1000個噪聲點
12     ndim = np.ndim(src)
13     row, col = np.shape(src)[0:2]
14     for i in range(num):
15         x = np.random.randint(0, row)  # 隨機生成噪聲點位置
16         y = np.random.randint(0, col)
17         indicator = np.random.randint(0, 2)  # 生成隨機數0和1,決定是椒噪聲還是鹽噪聲
18         # 灰度圖像
19         if ndim == 2:
20             if indicator == 0:
21                 dst[x, y] = 0
22             else:
23                 dst[x, y] = 255
24         # 彩色圖像
25         elif ndim == 3:
26             if indicator == 0:
27                 dst[x, y, :] = 0
28             else:
29                 dst[x, y, :] = 255
30     return dst
31 
32 
33 # 定義函數,實現均值濾波
34 def meanFilter(src, wsize):  # src為輸入圖像,wsize為窗口大小
35     border = np.uint8(wsize/2.0)  # 計算擴充邊緣
36     addBorder = cv2.copyMakeBorder(src, border, border, border, border, cv2.BORDER_REFLECT_101)  # 擴充后
37     dst = src.copy()
38     filterWin = 1.0/(wsize**2) * np.ones((wsize, wsize), dtype=np.float32)  # 定義窗口
39     row, col = np.shape(addBorder)
40     # 滑動,開始濾波
41     for i in range(border, row-border):
42         for j in range(border, col-border):
43             temp = addBorder[i-border:i+border+1, j-border:j+border+1]
44             newValue = np.sum(temp * filterWin)  # 均值濾波
45             dst[i-border, j-border] = newValue
46     dst = np.uint8(dst + 0.5)
47     return dst
48 
49 
50 img = cv2.imread('F:\program_study\Python\data\lena.tif', cv2.IMREAD_GRAYSCALE)
51 # 生成椒鹽圖
52 saltPimg = salt_pepperNoise(img)
53 cv2.imshow('saltPepper', saltPimg)
54 # 均值濾波
55 MeanFimg = meanFilter(saltPimg, 3)
56 cv2.imshow('MeanFilter', MeanFimg)
57 cv2.waitKey(0)
58 cv2.destroyAllWindows()
均值平滑

 

高斯濾波器(高斯平滑、高斯濾波)

 參考自:琪琪寶貝

高斯濾波器是一種帶權的平均濾波器,它的模板根據高斯函數計算得到。高斯函數是正態分布的密度函數。正態分布是一種鍾形曲線,越接近中心,取值越大,越遠離中心,取值越小。高斯函數的圖形:

σ控制鍾形的“緊度”

 

高斯分布

一維:

二維:

x,y的取值

 

高斯濾波模板

常見的模板有

高斯濾波的性質

高斯函數具有五個重要的性質,這些性質使得它在早期圖像處理中特別有用.這些性質表明,高斯平滑濾波器無論在空間域還是在頻率域都是十分有效的低通濾波器,且在實際圖像處理中得到了工程人員的有效使用.高斯函數具有五個十分重要的性質,它們是: 

  (1)二維高斯函數具有旋轉對稱性,即濾波器在各個方向上的平滑程度是相同的.一般來說,一幅圖像的邊緣方向是事先不知道的,因此,在濾波前是無法確定一個方向上比另一方向上需要更多的平滑.旋轉對稱性意味着高斯平滑濾波器在后續邊緣檢測中不會偏向任一方向. 

  (2)高斯函數是單值函數.這表明,高斯濾波器用像素鄰域的加權均值來代替該點的像素值,而每一鄰域像素點權值是隨該點與中心點的距離單調增減的.這一性質是很重要的,因為邊緣是一種圖像局部特征,如果平滑運算對離算子中心很遠的像素點仍然有很大作用,則平滑運算會使圖像失真. 

  (3)高斯函數的傅立葉變換頻譜是單瓣的.正如下面所示,這一性質是高斯函數付立葉變換等於高斯函數本身這一事實的直接推論.圖像常被不希望的高頻信號所污染(噪聲和細紋理).而所希望的圖像特征(如邊緣),既含有低頻分量,又含有高頻分量.高斯函數付立葉變換的單瓣意味着平滑圖像不會被不需要的高頻信號所污染,同時保留了大部分所需信號. 

  (4)高斯濾波器寬度(決定着平滑程度)是由參數σ表征的,而且σ和平滑程度的關系是非常簡單的.σ越大,高斯濾波器的頻帶就越寬,平滑程度就越好.通過調節平滑程度參數σ,可在圖像特征過分模糊(過平滑)與平滑圖像中由於噪聲和細紋理所引起的過多的不希望突變量(欠平滑)之間取得折衷. 

  (5)由於高斯函數的可分離性,較大尺寸的高斯濾波器可以得以有效地實現.二維高斯函數卷積可以分兩步來進行,首先將圖像與一維高斯函數進行卷積,然后將卷積結果與方向垂直的相同一維高斯函數卷積.因此,二維高斯濾波的計算量隨濾波模板寬度成線性增長而不是成平方增長.

統計排序(非線性)濾波器

這種濾波器以統計排序的值代替中心像素的值。如,中值濾波器。它的主要功能是使擁有不同灰度的點看起來更接近於它的相鄰點,具有非常優秀的去噪能力,而且比相同尺寸的線性平滑濾波的模糊程度明顯要低。中值濾波處理椒鹽噪聲非常有效。

另外還有最大值和最小值濾波器

 

 1 """
 2 非線性濾波,包括中值濾波,
 3           最大值濾波,最小值濾波
 4 """
 5 import numpy as np
 6 import cv2
 7 
 8 
 9 # 定義函數,生成椒鹽噪聲圖像
10 def salt_pepperNoise(src):
11     dst = src.copy()
12     num = 1000  # 1000個噪聲點
13     ndim = np.ndim(src)
14     row, col = np.shape(src)[0:2]
15     for i in range(num):
16         x = np.random.randint(0, row)  # 隨機生成噪聲點位置
17         y = np.random.randint(0, col)
18         indicator = np.random.randint(0, 2)  # 生成隨機數0和1,決定是椒噪聲還是鹽噪聲
19         # 灰度圖像
20         if ndim == 2:
21             if indicator == 0:
22                 dst[x, y] = 0
23             else:
24                 dst[x, y] = 255
25         # 彩色圖像
26         elif ndim == 3:
27             if indicator == 0:
28                 dst[x, y, :] = 0
29             else:
30                 dst[x, y, :] = 255
31     return dst
32 
33 
34 
35 # 定義函數,實現中值濾波,最大值濾波,最小值濾波
36 def nonlinearFilter(src, wsize):
37     border = np.uint8(wsize / 2.0)
38     addBorder = cv2.copyMakeBorder(src, border, border, border, border, cv2.BORDER_REFLECT_101)
39     dst = src.copy()
40     row, col = np.shape(addBorder)
41     # 開始滑動
42     for i in range(border, row - border):
43         for j in range(border, col - border):
44             temp = addBorder[i - border:i + border + 1, j - border:j + border + 1]
45             newValue = np.median(temp)  # 中值濾波
46             # newValue = np.max(temp)  # 最大值濾波
47             # newValue = np.min(temp)  # 最小值濾波
48             dst[i - border, j - border] = newValue
49     return dst
50 
51 
52 img = cv2.imread('F:\program_study\Python\data\lena.tif', cv2.IMREAD_GRAYSCALE)
53 # 生成椒鹽圖
54 saltPimg = salt_pepperNoise(img)
55 cv2.imshow('saltPepper', saltPimg)
56 # 中值,最大值,最小值濾波
57 Fimg = nonlinearFilter(saltPimg, 3)
58 cv2.imshow('nonlinearFilter', Fimg)
59 cv2.waitKey(0)
60 cv2.destroyAllWindows()
中值、最大值和最小值濾波

中值濾波是用窗口內像元的中值來代替中心像元的亮度值。

均值濾波和中值濾波非常基礎,均值濾波相當於低通濾波,有將圖像模糊化的趨勢,對椒鹽噪聲基本無能為力。中值濾波的優點是可以很好的過濾掉椒鹽噪聲,缺點是易造成圖像的不連續性。

最大值濾波是用窗口內像元的最大值來代替中心像元的亮度值,可以發現圖像中的亮點,並消除圖像中的“椒”噪聲(亮度值小的噪聲)。

 最小值濾波是用窗口內像元的最小值來代替中心像元的亮度值,可以發現圖像中的暗點,並消除圖像中的“鹽”噪聲(亮度值大的噪聲)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM