彻底搞清楚 blur和boxFilter
1. 函数定义
void blur(
InputArray src,
OutputArray dst,
Size ksize,
Point anchor = Point(-1, -1),
int borderType = BORDER_DEFAULT
);
void boxFilter(
InputArray src,
OutputArray dst,
int ddepth,
Size ksize,
Point anchor = Point(-1, -1),
bool normalize = true,
int borderType = BORDER_DEFAULT
);
-
OpenCV官方文档:
https://docs.opencv.org/4.x/d4/d86/group__imgproc__filter.html#ga8c45db9afe636703801b0b2e440fce37 -
blur 和 boxFilter 都是方框型滤波器,简称方波,唯一不同的是,blur是boxFilter的归一化形式。前者是归一化方框型滤波器,后者是非归一化方框型滤波器。
-
在OpenCV的官方文档中有这样的说明:The call blur(src, dst, ksize, anchor, borderType) is equivalent to boxFilter(src, dst, src.type(), ksize, anchor, true, borderType). 也就是说当 boxFilter 中参数normalize 被设置为true时,这两个算子是完全相同的。
-
非归一化方框型滤波器用于计算每个像素邻域的各种积分特征,如图像导数的协方差矩阵(用于密集光流算法,等等)。
-
输入图像得通道数可以是任意的,因为这些通道会被单独处理,但是图像的深度必须是CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.
-
blur的卷积核如下:
-
boxFilter的卷积核如下:
2. 例程
-
对比 blur 和 boxFilter 参数设为归一化时的情况,结果是完全相同的。
-
对比boxFilter 归一化参数设为 true 和 false 的区别,中间为true,右边为false.
-
观察参数Ksize对处理结果的影响,中间的为Size(1, 9),右边的为Size(9, 1),可以看出纵向模糊和横向模糊的区别。不要认为Ksize的大小必须是奇数,它可以是偶数,而且是有效的。
#include "stdafx.h" #include <opencv.hpp> using namespace cv; int main() { Mat m_SrcImg = imread("./MonaLisa.jpg", IMREAD_COLOR); imshow("原图", m_SrcImg); Mat m_DstImg; //blur(归一化方波) blur(m_SrcImg, m_DstImg,Size(7,7),Point(-1,-1)); imshow("blur", m_DstImg); //观察参数Ksize对处理结果的影响 blur(m_SrcImg, m_DstImg, Size(1, 9)); imshow("blur2", m_DstImg); blur(m_SrcImg, m_DstImg, Size(9, 1)); imshow("blur3", m_DstImg); //Ksize可以是偶数 blur(m_SrcImg, m_DstImg, Size(9, 2)); imshow("blur3", m_DstImg); //boxFilter(归一化参数为true,此时blur等同) boxFilter(m_SrcImg, m_DstImg, m_SrcImg.depth(), Size(3, 3), Point(-1, -1), true); imshow("boxFilter1", m_DstImg); //观察Ksize参数的变化对图像处理结果的影响 boxFilter(m_SrcImg, m_DstImg, m_SrcImg.depth(), Size(3, 3),Point(-1,-1),false); imshow("boxFilter2", m_DstImg); waitKey(0); return 0; }