邻域滤波(卷积)

通用线性邻域滤波是一种常用的邻域算子,输入像素加权得到输出像素:

其中权重核
为“滤波系数”。上面的式子可以简记为:

【方框滤波】
最简单的线性滤波是移动平均或方框滤波,用
窗口中的像素值平均后输出,核函数为:
窗口中的像素值平均后输出,核函数为:
其实等价于图像与全部元素值为1的核函数进行卷积再进行尺度缩放。
代码
OpenCV中的 blur函数是进行标准方框滤波:
void cv::blur( InputArray src, OutputArray dst,
Size ksize, Point anchor, int borderType )
{
boxFilter( src, dst, -1, ksize, anchor, true, borderType );
}而boxFilter函数源码如下:
cv::Ptr<cv::FilterEngine> cv::createBoxFilter( int srcType, int dstType, Size ksize,
Point anchor, bool normalize, int borderType )
{
int sdepth = CV_MAT_DEPTH(srcType);
int cn = CV_MAT_CN(srcType), sumType = CV_64F;
if( sdepth <= CV_32S && (!normalize ||
ksize.width*ksize.height <= (sdepth == CV_8U ? (1<<23) :
sdepth == CV_16U ? (1 << 15) : (1 << 16))) )
sumType = CV_32S;
sumType = CV_MAKETYPE( sumType, cn );
Ptr<BaseRowFilter> rowFilter = getRowSumFilter(srcType, sumType, ksize.width, anchor.x );
Ptr<BaseColumnFilter> columnFilter = getColumnSumFilter(sumType,
dstType, ksize.height, anchor.y, normalize ? 1./(ksize.width*ksize.height) : 1);
return Ptr<FilterEngine>(new FilterEngine(Ptr<BaseFilter>(0), rowFilter, columnFilter,
srcType, dstType, sumType, borderType ));
}这里 blur 和 boxFilter 的区别是,blur是标准化后的 boxFilter,即boxFilter的核函数:
其中,
blur( src, dst, Size( 1, 1 ), Point(-1,-1));
blur( src, dst, Size( 4, 4 ), Point(-1,-1));
blur( src, dst, Size( 8, 8 ), Point(-1,-1));
blur( src, dst, Size( 16, 16 ), Point(-1,-1));
实验结果
下图是对一幅图像分别用1*1,4*4,8*8,16*16标准方框滤波后的图像:
OpenCV中的图像滤波:方框、高斯、中值与双边滤波详解

本文详细介绍了OpenCV中几种常见的邻域滤波方法,包括方框滤波、高斯滤波、中值滤波和双边滤波。通过代码示例和实验结果展示了这些滤波器在去除图像噪声和平滑图像方面的应用。非线性滤波如中值滤波在处理散粒噪声时效果显著,而双边滤波则结合了空域和频域信息,适用于保留边缘细节的平滑处理。
最低0.47元/天 解锁文章
910

被折叠的 条评论
为什么被折叠?



