標籤:
我是一名初學者,如果你發現文中有錯誤,請留言告訴我,謝謝
映像的模糊和平滑是同一個層面的意思,平滑的過程就是一個模糊的過程。
而映像的去噪可以通過映像的模糊、平滑來實現(映像去噪還有其他的方法)
那麼怎麼才能對一幅映像進行模糊平滑呢?
映像的模糊平滑是對映像矩陣進行平均的過程。相比於映像銳利化(微分過程),映像平滑處理是一個積分的過程。
映像平滑過程可以通過原映像和一個積分運算元進行卷積來實現。
下面介紹兩種積分運算元
全1運算元
最簡單的積分運算元就是全1運算元
利用全1運算元可以對映像進行模糊平滑操作,有一定的去噪能力。
下面是python執行個體
import numpy as npfrom PIL import Imageimport matplotlib.pyplot as pltimport matplotlib.cm as cmsuanzi = 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-255image2 = (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 npfrom PIL import Imageimport matplotlib.pyplot as pltimport matplotlib.cm as cmimport 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-255image2 = (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.度娘,感謝那些熱愛分享知識的朋友
Python電腦視覺3:模糊,平滑,去噪