邻域滤波(卷积)
通用线性邻域滤波是一种常用的邻域算子,输入像素加权得到输出像素:
其中权重核 为“滤波系数”。上面的式子可以简记为:
【方框滤波】
最简单的线性滤波是移动平均或方框滤波,用
窗口中的像素值平均后输出,核函数为:


其实等价于图像与全部元素值为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标准方框滤波后的图像: