我是一名初學者,若是你發現文中有錯誤,請留言告訴我,謝謝python
圖像的模糊和平滑是同一個層面的意思,平滑的過程就是一個模糊的過程。編程
而圖像的去噪能夠經過圖像的模糊、平滑來實現(圖像去噪還有其餘的方法)函數
那麼怎麼才能對一幅圖像進行模糊平滑呢?spa
圖像的模糊平滑是對圖像矩陣進行平均的過程。相比於圖像銳化(微分過程),圖像平滑處理是一個積分的過程。code
圖像平滑過程能夠經過原圖像和一個積分算子進行卷積來實現。blog
下面介紹兩種積分算子ip
全1算子 ci
最簡單的積分算子就是全1算子io
利用全1算子能夠對圖像進行模糊平滑操做,有必定的去噪能力。function
下面是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.度娘,感謝那些熱愛分享知識的朋友