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

我是一名初學者,若是你發現文中有錯誤,請留言告訴我,謝謝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.度娘,感謝那些熱愛分享知識的朋友

相關文章
相關標籤/搜索