基于Python的Opencv学习

基于Python的Opencv学习第七天

各位小伙伴,大家好。今天我们一起来学习一下对图像平滑处理的相关内容,一起来看一下吧!

一.均值滤波

对任意一点的像素值进行均值滤波,意思是选取周围N*N个像素值的均值。在这里插入图片描述
例如:红色点的像素值=蓝色背景区域像素值之和(这个和含红色值)除以25(即25个不同的值相加除以25后的值赋给红色区域)

红色点的像素新值=((197+25+106+156+159)+(149+40+107+5+71)+(163+198+226+223+156)+(222+37+68+193+157)+(42+72+250+41+75))/25

这里选取的N行,N列在我们opencv中被称作核,将是我们需要调用opencv函数里面的重要参数。

在opencv中进行均值滤波需要调用blur()函数,来看看具体语法:
处理结果=cv2.blur(原始图像,核大小)

这里参数很简单,一个是需要处理的原始图像
一个是我们自定义的核大小:以(宽度,高度)形式表示的元组在这里插入图片描述

来看示例代码和结果:

>>> import cv2
>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> b=cv2.blur(a,(5,5))
>>> cv2.imshow("a",a)
>>> cv2.imshow("b",b)
>>> 

这里采取(5,5)就是对每一个点选取周围5*5个区域进行均值滤波处理,当此处选取的区域越大,图像就会更加模糊,如果选取为(1,1)就会发现图像和原图像相同,没有进行滤波
在这里插入图片描述
这里我们可以看到b图像更加平滑(这里可能看上去有点模糊处理的感觉,而且似乎看不出来平滑,但是如果对图像进行椒盐噪声攻击就能看得很清楚)
在这里插入图片描述

二.方框滤波

在方块滤波时,我们需要调用boxFilter()函数,具体语法如下:
处理结果=cv2.boxFilter(原始图像,目标深度图像,核大小,normalize属性)

来看具体参数:
原始图像:即我们需要处理的图像
目标深度大小:int类型的目标图像深度。通常使用“-1”表示与原始图像一致
核大小:与均值滤波介绍的相同,可参考均值滤波部分

normalize属性:是否对目标图像进行归一化处理
normalize=1(或者该参数不填):对目标图像进行归一化处理,其结果和均值滤波相同(即进行归一化处理就等同于均值滤波)
normalize=0:不进行归一化处理

这里介绍一下归一化处理:
如果进行归一化处理就是所有NN个像素值加起来之后除以(NN)

如果不进行归一化处理就是所有N*N个像素值加起来然后直接赋给待处理那点的像素值,这里很容易发生溢出,因为通常周围几个值加起来肯定大于最大值255,所以如果选取的核大小很大,那么很容易得到一片空白。

首先来看进行归一化处理的代码和结果:

>>> import cv2
>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>>> b=cv2.boxFilter(a,-1,(5,5),normalize=1)
>>> c=cv2.blur(a,(5,5))
>>> cv2.imshow("b",b)
>>> cv2.imshow("c",c)
>>>

在这里插入图片描述
如图,b是进行方块滤波(归一化处理的结果),c是进行均值滤波结果,两者相同作用。

再来看一下不进行归一化处理的代码和结果:

>>> import cv2
>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>> d=cv2.boxFilter(a,-1,(5,5),normalize=0)
>>> cv2.imshow("d",d)
>>> 

在这里插入图片描述
这里由于选取核大小过大,导致这里的d图出现一片白色,已经发生溢出事件。

>>> import cv2
>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
>>>> e=cv2.boxFilter(a,-1,(2,2),normalize=0)
>>> cv2.imshow("e",e)
>>> 

在这里插入图片描述
这里可以看到选取核大小较小,还能看到一点图像,但是像素点值已经很大,白色很明显。

三.高斯滤波

高斯滤波即让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。
这里和均值滤波不同的是,均值滤波是所有值采用1然后相加除以NN,相当于每一个值都除以N*N,但是高斯滤波就是每个值采取不同的比例,靠近待处理像素值的点的权重高,远离的则权重低,但是所有的和加起来等于“1”。

如下图可以看出,选取核大小为3*3,则权重可以如下选取。

在这里插入图片描述

在这里插入图片描述
这幅图更能够容易理解高斯滤波算法

在opencv中我们需要调用GaussianBlur()函数,来看具体语法:
dst=cv2.GaussianBlur(src,ksize,sigmaX)

src:原始图像
ksize:核大小(N,N)必须是奇数
sigmaX:X方向方差,控制权重

这里注重解释一下sigmaX,一般情况下我们选择

sigmaX=0,这时opencv会自动计算出:
sigmaX=0.3
*((ksize-1)*0.5-1)+0.8
而且Y方向方差等于X方向方差

import cv2
a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
cv2.imshow("a",a)
b=cv2.GaussianBlur(a,(3,3),0)
cv2.imshow("b",b)

在这里插入图片描述
这里选取核大小比较小,不容易看出结果,如果选取核大小较大,可以看到图像更加平滑。

四.中值滤波

中值滤波顾名思义,就是让选取的核大小里面的像素值按照大小排列,取排序像素集中位于中间位置的值作为中值滤波后的像素值。
在这里插入图片描述
这幅图能够非常详细的表达中值滤波的含义。

在opencv中,我们调用medianBlur()函数,具体语法如下:
dst=cv2.medianBlur(src,ksize)

参数含义为:
src:需要处理的原图像
ksize:选取的核大小,必须是比1大的奇数,如3,5,7等
以前核大小是元组的形式,这里就是一个数字,如填入3,即核大小为3*3

import cv2
a=cv2.imread(r"C:\Users\LT010407\Desktop\2.jpg")
cv2.imshow("a",a)
b=cv2.medianBlur(a,3)
cv2.imshow("b",b)

在这里插入图片描述
这里是代码和结果展示,由于选取核大小较小,所有结果不是特别明显。

今天给小伙伴们讲了一下图像平滑处理的各种滤波算法,都比较简单,在opencv里面就像做填空题一样,但是还是需要了解清楚各个参数的含义,只要清楚了含义,填空就方便多了。今天就到这里,我们下一篇博客见(转载注明出处)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值