我是一名初學者,如果你發現文中有錯誤,請留言告訴我,謝謝
圖像的模糊和平滑是同一個層面的意思,平滑的過程就是一個模糊的過程。
而圖像的去噪可以通過圖像的模糊、平滑來實現(圖像去噪還有其他的方法)
那么怎么才能對一幅圖像進行模糊平滑呢?
圖像的模糊平滑是對圖像矩陣進行平均的過程。相比於圖像銳化(微分過程),圖像平滑處理是一個積分的過程。
圖像平滑過程可以通過原圖像和一個積分算子進行卷積來實現。
下面介紹兩種積分算子
全1算子
最簡單的積分算子就是全1算子

利用全1算子可以對圖像進行模糊平滑操作,有一定的去噪能力。
下面是python實例
import numpy as np from PIL import Image import matplotlib.pyplot as plt import matplotlib.cm as cm suanzi = np.ones((3,3)) # 創建全1算子 # 打開圖像並轉化成灰度圖像 image = Image.open("pika.jpg").convert("L") image_array = np.array(image) # 原圖像與全1算子進行卷積 image2 = signal.convolve2d(image_array,suanzi,mode="same") # 將結果灰度值轉化到0-255 image2 = (image2/float(image2.max()))*255 # 顯示圖像 plt.subplot(2,1,1) plt.imshow(image_array,cmap=cm.gray) plt.axis("off") plt.subplot(2,1,2) plt.imshow(image2,cmap=cm.gray) plt.axis("off") plt.show()
運行結果如下圖,(為了看到效果,圖像經過人工局部放大)
上圖為原圖像,下圖為經過模糊處理圖像

比較兩幅圖可以看出,全1算子有一定的模糊平滑效果
高斯算子
利用高斯算子進行模糊處理就是我們常聽到的高斯模糊。
標准差為σ的高斯分布如下式

我們可以通過numpy模塊的fromfunction()方法來生成高斯算子。
import numpy as np # 乘以100是為了使算子中的數便於觀察 # sigma指定高斯算子的標准差 def func(x,y,sigma=1): return 100*(1/(2*np.pi*sigma))*np.exp(-((x-2)**2+(y-2)**2)/(2.0*sigma**2)) # 生成標准差都2的5*5高斯算子 a = np.fromfunction(func,(5,5),sigma=2) print(a) # 結果 [[ 2.92749158 4.25947511 4.82661763 4.25947511 2.92749158] [ 4.25947511 6.19749972 7.02268722 6.19749972 4.25947511] [ 4.82661763 7.02268722 7.95774715 7.02268722 4.82661763] [ 4.25947511 6.19749972 7.02268722 6.19749972 4.25947511] [ 2.92749158 4.25947511 4.82661763 4.25947511 2.92749158]]
對上面的5*5高斯算子每個元素進行四舍五入,可以得到下面矩陣

看到有些地方直接用上面的矩陣對圖像進行高斯模糊,實際上是運用的是標准差為2的高斯近似算子。
利用高斯算子對圖像進行模糊,程序如下
import numpy as np from PIL import Image import matplotlib.pyplot as plt import matplotlib.cm as cm import scipy.signal as signal # 生成高斯算子的函數 def func(x,y,sigma=1): return 100*(1/(2*np.pi*sigma))*np.exp(-((x-2)**2+(y-2)**2)/(2.0*sigma**2)) # 生成標准差為2的5*5高斯算子 suanzi = np.fromfunction(func,(5,5),sigma=2) # 打開圖像並轉化成灰度圖像 image = Image.open("pika.jpg").convert("L") image_array = np.array(image) # 圖像與高斯算子進行卷積 image2 = signal.convolve2d(image_array,suanzi,mode="same") # 結果轉化到0-255 image2 = (image2/float(image2.max()))*255 # 顯示圖像 plt.subplot(2,1,1) plt.imshow(image_array,cmap=cm.gray) plt.axis("off") plt.subplot(2,1,2) plt.imshow(image2,cmap=cm.gray) plt.axis("off") plt.show()
運行結果如下圖,(為了看到效果,圖像經過人工局部放大)
上圖為原圖像,下圖為經過高斯模糊處理圖像

對比高斯算子和全1算子,可以看出,高斯算子的模糊想過似乎更好。
而且,我們可以通過更改高斯算子的標准差和維數來調整模糊效果
一般來說,高斯算子標准差越大,維數越大,圖像越模糊。
參考列表
1.《python計算機視覺編程》
2.度娘,感謝那些熱愛分享知識的朋友
