首页 > 编程知识 正文

matlab对图像平滑处理结论,图像平滑处理滤波越大

时间:2023-05-04 11:00:27 阅读:170389 作者:3429

目录图像平滑处理图像平滑处理原理图像平滑处理方法:均值滤波基本原理函数语法: dst=cv2.blue(src,ksize,anchor,borderType )示例块滤波函数语法: dst=cv2.box fix borderType )例程的高斯滤波器函数语法dst=cv2.Gaussianblur(SCR,ksize,sigmaX,sigmaY,borderType )示例中值滤波器基本原理函数语法: dst k size )示例双边滤波器函数语法: dst=cv2.bilateral filter (SCR,d,sigmaColor,sigmaSpace,borderType )示例二维卷积示例

图像平滑处理是在尽可能保留图像原有信息的情况下,过滤图像内部的噪声,称为图像平滑处理。 通过图像平滑处理,可以有效地过滤图像中的噪声信息。 英语中与Soomthing Images对应,图像平滑处理多伴随图像牧户操作,因此图像平滑处理有时也被称为图像模糊处理(Blurring Images )

图像平滑处理原理是处理图像中与周围像素点的像素值差较大的像素点,将该值调整为周围像素点的像素值的近似值

如何进行图像平滑:在该方法中,均值滤波器-块滤波器-高斯滤波器-中值滤波器-双边滤波器(定制滤波器) -二维滤波器(2D滤波器)指向当前像素点周围N*N个像素值的平均值,而不是当前像素值。 用该方法对图像内各像素点进行扫描处理,就完成了图像整体的平均值滤波

基本原理是首先考虑对周围的几个像素点取平均值,以现在的像素点为中心,对行数和列数相等的块区域的所有像素点的像素值进行平均。 关于第1行第1列那样的边缘像素点,可以只取图像内存在的周边附近点的像素值的平均值(例如

函数语法: dst=cv2.blue(src、ksize、anchor、borderType ) ) dst是返回值,得到平均值滤波处理结果。 src是原始图像,从任意数量的通道。 Ksize是滤波器芯尺寸(平均值处理中,附近图像的高度和宽度)。 Anchor是锚点,缺省值(-1,-1)表示当前计算平均值的点位于内核的中心点,通常采用缺省值。 BorderType是一种边界样式,用于确定如何处理边界,通常采用默认值

因此,cv2.blur ()的一半的形式是cv2.blur ()、SCR、ksize () )

示例#平均过滤img=cv2.im read (c : (photo (Lena noise.png ) ) R1=cv2.blur(img,) 9,9 ) ) R2=cv2.blur

卷积内核越大去噪效果越好,运算时间越长,同时图像失真

块滤波可以自由选择是否将平均值滤波结果归一化,即滤波结果是附近像素值之和平均值还是附近像素值之和,如果不归一化,则可以获得与平均值滤波相同的效果

函数语法: dst=cv2.boxfilter(SCR、ddepth、ksize、anchor、normalize、borderType ) ddepth是处理结果图像的图像深度,通常用-1表示与原始图像相同的图像深度

Normalize表示规范化的必要性(0/1),1表示必要性,0表示规范化的必要性

常用格式: cv2.boxfilter(SCR,ddepth,ksize ) ) ) )。

例行程序#块过滤img=cv2.im read (c : (photo (Lena noise.png ) ) R1=cv2.boxfilter(img,-1,) 5、 5 ) )使用归一化处理R2=cv2.boxfilter )的normalize=0) #cv2.imshow(original ),img ) cv2.imshow ) ) result_nor,rmalize

规范化的图像接近白色。 因为5*5像素的总和通常超过当前的最大值255

高斯滤波器进行平均滤波和块滤波,邻域内像素的权重都相等,高斯滤波器增大中心点的权重值,远离中心点的权重值减小

据此计算附近内各像素值的不同权重之和,在高斯滤波器中内核的长度和宽度可以不相等,但必须是奇数。 在实际计算中,卷积内核被规范化处理。 严格来说,过滤未规范化的卷积内核常常会产生错误的结果。

函数语法dst=cv2.Gaussianblur(SCR,ksize,sigmaX,sigmaY,borderType ) sigmaX是卷积核在水平方向(x轴方向)上的标准偏差,其是权重尺度

sigmaY是卷积核在垂直方向(y轴方向)上的标准偏差,如果将该值设定为0,则只采用sigmaX的值,对于si

gmaX和sigmaY的值都为0,就通过ksize.width.height计算得到。
Sigmax=0.3*[(ksize.width-1)0.5-1]+0.8
sigmaY=0.3[(ksize.height-1)*0.5-1]+0.8
常见形式:dst=cv2.GaussianBlur(src,ksize,0,0)#官方文档建议指定ksize、signmaX、signmaY三个参数的值,以避免将来函数修改后可能造成的语法错误,所以将其默认为0

例子 #高斯滤波img=cv2.imread("C:photolenaNoise.png")r1=cv2.GaussianBlur(img,(7,5),0,0)cv2.imshow("original",img)cv2.imshow("reuslt",r1)cv2.waitKey()cv2.destroyAllWindows()

中值滤波

与之前三种处理方式不同,不再采用加权求平均值的方式来计算滤波结果,用邻域所有像素值的中间值来代替当前像素点的像素值

基本原理

采用当前像素点及周围邻近像素点(个数为奇数)的像素值,将这些像素值排列,然后将位于中间的像素值作为当前像素点的像素值

函数语法:dst=cv2.medianBlur(scr,k size) 例子 #中值滤波img=cv2.imread("C:photolenaNoise.png")r1=cv2.medianBlur(img,3)cv2.imshow("original",img)cv2.imshow("reuslt",r1)cv2.waitKey()cv2.destroyAllWindows()

因为没有进行均值处理,所以不存在均值滤波带来的细节模糊问题,在中值滤波操作中,噪音很难被选上,可以在几乎不影响换图情况下去除全部噪音,但是由于要进行排序等操作,中值滤波需要的运算量较大

双边滤波

综合图像空间和色彩信息的滤波方式,在滤波过程中能有效保护图像内的边缘信息
###基本原理
前面滤波只考虑空间的权重信息,计算起来比较方便,但是边缘信息的处理上存在较大问题。滤波处理过程中对邻域像素取均值会造成边界模糊,双边滤波在计算某一个像素点的新值时,不仅考虑距离问题(距离越远,权重越小),也考虑色彩信息(色彩差别越大,权重越小)。综合考虑距离和色彩的权重结果,既能有效去除噪音,也能较好保护边沿信息。处于边缘时,与当前色彩相近的像素点会被给予较大的权重值;而在与当前色彩差别较大的像素点会被给予较小的权重值,这样就保护了边缘信息。

函数语法:dst=cv2.bilateralFilter(scr,d,sigmaColor,sigmaSpace,borderType)

d是滤波时选取的空间距离参数,表示以当前像素点为中心的直径。如果非正数,则会自动从参数sigmaSpace中计算得到。如果滤波空间较大,推荐d=5.对于噪声较大的离线滤波,可以选择d=9;
sigmaColor是滤波时选取的颜色差别范围,决定了周围哪些像素点能够参与滤波中来,与当前像素点的像素值小于sigmaColor时,就能参与到滤波中来,该值为0表示滤波失去意义,该值为255表示直径内所有点都能参与运算
sigmaSpace是坐标中的sigma值,值越大,表明有越多的点能参与到滤波计算中,当d>0时,无论sigmaSpace的值如何,d都指定邻域大小,否则d与sigmaSpace成比例
为了简单起见,可以将sigmaSpace和sigmaColor的值设置相同,如果他们的值较小,滤波效果就不明显,如果值较大,滤波效果会比较明显,产生卡通效果。

例子 #双边滤波img=cv2.imread("C:photopie.png")g=r=cv2.GaussianBlur(img,(55,55),0,0)b=cv2.bilateralFilter(img,55,100,100)cv2.imshow("original",img)cv2.imshow("bilateralFilter",b)cv2.imshow("GaussianBlur",g)cv2.waitKey()cv2.destroyAllWindows()

2D卷积

使用特定的卷积核实现卷积操作,前面的滤波函数都无法将卷积核确定为特定形式,所以需要使用自定义卷积函数
###语法格式
dst=cv2.filter2D(scr,ddrpth,kernel,anchor,delta,borderType)
kernel是卷积核,是一个单通道的数组,如果想在处理彩色图像时,让每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作
delta是修正值,是可选项,如果该值存在,会在基础滤波值上加上该值作为最终的滤波处理结果

例子 #2D卷积滤波img=cv2.imread("C:photolenaNoise.png")kernel=np.ones((9,9),np.float32)/81r=cv2.filter2D(img,-1,kernel)cv2.imshow("original",img)cv2.imshow("filter2D",r)cv2.waitKey()cv2.destroyAllWindows()

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。