python去噪函数_Python计算机视觉3:模糊,平滑,去噪

我是一名初学者,如果你发现文中有错误,请留言告诉我,谢谢

图像的模糊和平滑是同一个层面的意思,平滑的过程就是一个模糊的过程。

而图像的去噪可以通过图像的模糊、平滑来实现(图像去噪还有其他的方法)

那么怎么才能对一幅图像进行模糊平滑呢?

图像的模糊平滑是对图像矩阵进行平均的过程。相比于图像锐化(微分过程),图像平滑处理是一个积分的过程。

图像平滑过程可以通过原图像和一个积分算子进行卷积来实现。

下面介绍两种积分算子

全1算子

最简单的积分算子就是全1算子

082354085352920.jpg

利用全1算子可以对图像进行模糊平滑操作,有一定的去噪能力。

下面是python实例

importnumpy as npfrom PIL importImageimportmatplotlib.pyplot as pltimportmatplotlib.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()

运行结果如下图,(为了看到效果,图像经过人工局部放大)

上图为原图像,下图为经过模糊处理图像

090004487854653.jpg

比较两幅图可以看出,全1算子有一定的模糊平滑效果

高斯算子

利用高斯算子进行模糊处理就是我们常听到的高斯模糊。

标准差为σ的高斯分布如下式

090013361912446.jpg

我们可以通过numpy模块的fromfunction()方法来生成高斯算子。

importnumpy 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高斯算子每个元素进行四舍五入,可以得到下面矩阵

092250172851472.jpg

看到有些地方直接用上面的矩阵对图像进行高斯模糊,实际上是运用的是标准差为2的高斯近似算子。

利用高斯算子对图像进行模糊,程序如下

importnumpy as npfrom PIL importImageimportmatplotlib.pyplot as pltimportmatplotlib.cm as cmimportscipy.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()

运行结果如下图,(为了看到效果,图像经过人工局部放大)

上图为原图像,下图为经过高斯模糊处理图像

092300512854629.jpg

对比高斯算子和全1算子,可以看出,高斯算子的模糊想过似乎更好。

而且,我们可以通过更改高斯算子的标准差和维数来调整模糊效果

一般来说,高斯算子标准差越大,维数越大,图像越模糊。

参考列表

1.《python计算机视觉编程》

2.度娘,感谢那些热爱分享知识的朋友

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值