一、概述
使用中值滤波器模糊图像。
该函数使用具有 ksize×ksize 孔径的中值滤波器对图像进行平滑处理。 多通道图像的每个通道都是独立处理的。
中值滤波器在内部使用 BORDER_REPLICATE 来处理边界像素,请参阅 BorderTypes。
下图描述了一个ksize=3×3的滑动窗口(或称滤波器模板、kernel),如黄色部分所示。用这个ksize=3×3的窗口作用于原始图像上的每一个像素,如下图的绿色部分所示,被这个窗口覆盖的9个像素点都参与计算,这样在该像素点上就会得到一个新的像素值,当窗口沿着图像逐个像素进行计算,就会得到一幅新的图像。
上图中滤波器模板的不同就构成了滤波算法的差异,比如均值平滑算法中滑动窗口中各个像素点的系数均为1/(窗口高*窗口宽),高斯平滑中系数和中心点的距离满足高斯分布。
中值平滑和均值平滑一样也用到了滑动窗口,但是它并不是计算滑动窗口中的某种加权和,而是使用原图像滑动窗口中所有像素值排序后的中值作为新图像的像素值。
从上图也可以看到,当滑动窗口作用于图像边沿的时候,滑动窗口的某些像素并没有和图像重合,这时就需要对边沿做特殊处理,常用的方法有填0、填1、复制边沿等方式。
二、medianBlur函数
1、函数原型
cv::medianBlur (InputArray src, OutputArray dst, int ksize)
2、参数详解
src | 输入 1、3 或 4 通道图像; ksize 为 3 或 5 时,图像深度应为 CV_8U、CV_16U 或 CV_32F,对于较大的光圈尺寸,只能为 CV_8U。 |
dst | 与 src 大小和类型相同的目标数组。 |
ksize | 孔径线性尺寸; 它必须是奇数且大于 1,例如:3、5、7 ... |
三、OpenCV源码
1、源码路径
opencv\modules\imgproc\src\median_blur.dispatch.cpp
2、源码代码
void medianBlur( InputArray _src0, OutputArray _dst, int ksize )
{
CV_INSTRUMENT_REGION();
CV_Assert(!_src0.empty());
CV_Assert( (ksize % 2 == 1) && (_src0.dims() <= 2 ));
if( ksize <= 1 || _src0.empty() )
{
_src0.copyTo(_dst);
return;
}
CV_OCL_RUN(_dst.isUMat(),
ocl_medianFilter(_src0,_dst, ksize))
Mat src0 = _src0.getMat();
_dst.create( src0.size(), src0.type() );
Mat dst = _dst.getMat();
CALL_HAL(medianBlur, cv_hal_medianBlur, src0.data, src0.step, dst.data, dst.step, src0.cols, src0.rows, src0.depth(),
src0.channels(), ksize);
CV_OVX_RUN(true,
openvx_medianFilter(_src0, _dst, ksize))
//CV_IPP_RUN_FAST(ipp_medianFilter(src0, dst, ksize));
CV_CPU_DISPATCH(medianBlur, (src0, dst, ksize),
CV_CPU_DISPATCH_MODES_ALL);
}
四、效果图像示例
![](https://img-blog.csdnimg.cn/7a3c9fa7cb44463cb9c29ea0e1def515.png)