使用-快速上手
原理
线性滤波输出像素值,f为输入图像,h为核
g
(
i
,
j
)
=
∑
k
,
l
f
(
i
+
k
,
j
+
l
)
∗
h
(
k
,
l
)
g(i,j)=\sum\limits_{k,l} f(i+k,j+l)*h(k,l)
g(i,j)=k,l∑f(i+k,j+l)∗h(k,l)
方框滤波
void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), bool normalize=true, int borderType=BORDER_DEFAULT);
参数
src
输入图像dst
目标图像ddepth
输出图像的深度,-1代表使用原图深度ksize
内核的大小,用Size(w,h)表示,w为像素宽度,h为像素高度anchor
锚点,如果该点坐标为负值表示取核的中心点为锚点normalize
内核是否被其区域归一化borderType
用于推断图像外部像素的某种边界模式
该函数所用的核为
K
=
a
[
1
⋯
1
⋮
⋱
⋮
1
⋯
1
]
K=a \left [ \begin{matrix} 1 & \cdots & 1 \\ \vdots & \ddots & \vdots \\ 1 & \cdots & 1 \end{matrix} \right ]
K=a⎣⎢⎡1⋮1⋯⋱⋯1⋮1⎦⎥⎤
当normalize=true时,
a
=
1
w
∗
h
a=\frac{1}{w*h}
a=w∗h1
当normalize=false时,
a
=
1
a=1
a=1
下面说到的均值滤波其实就是normalize=true时的方框滤波
均值滤波
实际上这个函数基本上就是直接调用了boxFilter()
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT);
参数基本同上
高斯滤波
使用示例
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char* argv[])
{
Mat src;
src = imread("D:/Doucuments/temp/opencv_cpp/aete.jpg");
Mat bdst, gbdst;
blur(src, bdst, Size(20, 20));
GaussianBlur(src, gbdst, Size(11, 11), 10, 10);
namedWindow("src");
namedWindow("blur");
namedWindow("gblur");
imshow("src", src);
imshow("blur", bdst);
imshow("gblur", gbdst);
waitKey(0);
return 0;
}