大家好,欢迎来到IT知识分享网。
1.概念介绍
均值滤波是典型的
线性滤波算法,是指用当前像素点周围nxn个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,可完成整幅图像的均值滤波。2.基本原理
如图2-1,我们对第5行第5列的像素点进行均值滤波时,首先需要考虑需要对周围多少个像素点去取平均值。
通常情况下,我们会以该当前像素为中心,对行数和列数相等的一块区域内的所有像素点的像素取平均值。
例如,我们可以以当前像素点的像素周围3×3区域内所有像素点的像素取平均值,也可以对周围5×5区域内所有像素点的像素值取平均值。
图2-1 一幅图像的像素值示例因此,
针对边缘的像素点,可以只取图像内存在的周围领域点的像素值均值。如图2-2所示,计算左上角的均值滤波结果时,仅取图中灰色背景的33领域内的像素值的平均值。计算方法如下:
像素点新值=
[(23+158+140)+
(238+0+67)+
(199+197+25)]/9
=116
图2-2 边界点的处理除此之外,我们还可以扩展当前图像的周围像素点。例如,可以将当前97大小的图像扩展为13*11大小的图像,如图2-3所示。
图2-3 扩展边缘针对第5行第5列的像素点,其运算过程相当于一个额内部值是1/25的55矩阵进行相乘运算,从而得到均值滤波的结果为126。如图2-4所示。
图2-4 针对第 5 行第 5 列像素点均值滤波的运算示意图根据上述运算,针对每一个像素点,都是与一个内部值均为1/25的55举证相乘,得到均值滤波的计算结果。示意图如图2-4所示
图1-4 针对每一个像素点均值滤波的运算示意图将使用到的5×5矩阵一般化,可以得到如下图2-5的结果。
图2-5 将矩阵一般化在Opencv中,将图1-5右侧的矩阵称为卷积核,其一般形式如下图2-6所示。
其中M和N分别对应高度和宽度,一般情况下M和N的值是相等的,常用的3×3、5×5和7×7。如果M和N的值越大,参与运算的值就越大,参与运算的像素点的数量就越多,图像失真就越严重。
图2-6 卷积核3.函数语法
在OpenCV中,实现均值滤波的函数是cv2.blur(),其语法格式为:
dst = cv2.blur( src, ksize, anchor, borderType )
参数解析:
dst:返回值,表示进行均值滤波后得到的处理结果。
src:需要处理的图像,即原始图像。它可以有任意数量的通道,并能对各个通道独立进行处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F 或者 CV_64F 中的一种。
ksize:滤波核的大小。滤波核的大小是指在均值处理的过程中,其领域图像的高度和宽度。例如,其值可以为(5,5),表示以5*5大小的领域均值作为图像均值滤波处理的结果。
anchor:锚点,默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
borderType:边界样式,该值决定了以何种方式处理边界,其值如下表所示。一般情况下不需要考虑该值的取值,直接采用默认值即可。
类型 |
说明 |
|---|---|
| cv2.BORDER_CONSTANT | iiiiii abcdefgh iiiiiii,特定值 i |
| cv2.BORDER_REPLICATE | aaaaaa abcdefgh hhhhhhh |
| cv2.BORDER_REFLECT | fedcba abcdefgh hgfedcb |
| cv2.BORDER_WRAP | cdefgh abcdefgh abcdefg |
| cv2.BORDER_REFLECT_101 | gfedcb abcdefgh gfedcba |
| cv2.BORDER_TRANSPARENT | uvwxyz absdefgh ijklmno |
| cv2.BORDER_REFLECT101 | 与 BORDER_REFLECT_101 相同 |
| cv2.BORDER_DEFAULT | 与 BORDER_REFLECT_101 相同 |
| cv2.BORDER_ISOLATED | 不考虑 ROI(Region of Interest,感兴趣区域)以外的区域 |
4.程序示例
读取一幅噪声图像,使用函数 cv2.blur()对图像使用
三种不同大小的卷积核进行均值滤波处理,得到去噪图像,并显示原始图像和去噪图像。
import cv2 Gn=cv2.imread("Gaussian_noise.jpg") Mf_a=cv2.blur(Gn,(2,2)) Mf_b=cv2.blur(Gn,(5,5)) Mf_c=cv2.blur(Gn,(10,10)) cv2.imshow("噪声图像",Gn) cv2.imshow("使用2×2的卷积核进行均值滤波",Mf_a) cv2.imshow("使用5×5的卷积核进行均值滤波",Mf_b) cv2.imshow("使用10×10的卷积核进行均值滤波",Mf_c) cv2.waitKey() cv2.destroyAllWindows()
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/115118.html






