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.度娘,感谢那些热爱分享知识的朋友

相关文章
相关标签/搜索