Python計算機視覺3:模糊,平滑,去噪


我是一名初學者,如果你發現文中有錯誤,請留言告訴我,謝謝


圖像的模糊和平滑是同一個層面的意思,平滑的過程就是一個模糊的過程。

而圖像的去噪可以通過圖像的模糊、平滑來實現(圖像去噪還有其他的方法)


 

那么怎么才能對一幅圖像進行模糊平滑呢?

圖像的模糊平滑是對圖像矩陣進行平均的過程。相比於圖像銳化(微分過程),圖像平滑處理是一個積分的過程

圖像平滑過程可以通過原圖像和一個積分算子進行卷積來實現。

下面介紹兩種積分算子


 

 全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.度娘,感謝那些熱愛分享知識的朋友


免責聲明!

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



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