滤波过程:
将内核锚放置在确定的像素的顶部,其余核心覆盖图像中的相应局部像素。
将内核系数乘以相应的图像像素值并对结果求和。
将结果放置在输入图像中锚点的位置。
通过在整个图像上扫描内核来重复所有像素的过程。
API函数
1、建立自己的内核
kernel_size = 3 + 2*( ind%5 );
kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);
2、filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
参数表示:
src:源图像
dst:目的地图像
ddepth:深度dst。负值(如−1)表示深度与源相同。
内核:要通过图像扫描的内核
anchor:锚点相对于其内核的位置。位置点(-1,-1)表示默认的中心。
delta:在关联期间要添加到每个像素的值。默认情况下为0
BORDER_DEFAULT:我们默认设置此值(以下教程中有更多详细信息)
代码
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char* argv[])
{
Mat src = imread("12.bmp", 1);
namedWindow("原图像", WINDOW_FREERATIO);
namedWindow("自创均值滤波图", WINDOW_FREERATIO);
namedWindow("API均值滤波图", WINDOW_FREERATIO);
if (src.empty())
{
std::cout << "打开图片失败,请检查" << std::endl;
return -1;
}
imshow("原图像", src);
Mat dst,dst1;
dst = src.clone();
dst1 = src.clone();
//实现均值滤波
//Mat kernel =(Mat_<float>(3,3)<<1,1,1,1,1,1,1,1,1)/9;
Mat kernel = Mat::ones(Size(7, 7), CV_32F)/49;
filter2D(src,dst,-1, kernel,Point(-1,-1),0,4);
blur(src, dst1, Size(7, 7), Point(-1, -1), 4);
imshow("自创均值滤波图", dst);
imshow("API均值滤波图", dst1);
waitKey(0);
return 0;
}