OpenCV4萌新之路——图像滤波之均值滤波“blur”
void cv::blur (InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT )
一、函数简析
头文件 #include <opencv2/imgproc.hpp>
imread | 返回类型 | 命名空间 | 函数名 | 参数1 | 参数2 | 参数3 | 参数4 | 参数5 |
---|---|---|---|---|---|---|---|---|
详细 | void | cv | blur | InputArray src | OutputArray dst | Size ksize | Point anchor = Point(-1,-1) | int borderType = BORDER_DEFAULT |
详细 | - | - | - | 输入图像 | 输出图像 | 滤波核大小 | 锚点 | 边界类型 |
二、参数详解
1.InputArray src
输入图像,没有通道数限制,每个通道都是独立处理。但是位深度只能为CV_8U, CV_16U, CV_16S, CV_32F 和 CV_64F这几种。
2.OutputArray dst
输出图像和输入图像一致。
3.Size ksize
模糊核大小
4.Point anchor = Point(-1,-1)
锚点,默认为Point(-1,-1),即核的中心。
5.int borderType = BORDER_DEFAULT
边界类型,这个以后详解。
三、测试代码
#include <iostream>
using namespace std;
#include "opencv2/opencv.hpp"
using namespace cv;
#define IMAGE_PATH "F:/Learn_OpenCV/Sakai_Izumi.jpg"
Mat src; //输入图像
Mat blurImg;//输出图像
int k_width = 3;//模糊核宽度
int k_height = 3;//模糊核高度
Point anchor = Point(-1, -1);//锚点
int borderType = BORDER_DEFAULT;//边界类型
const char* pWindowsTitle = "Blur";
const char* pWidthTitle = "k_width";
const char* pHeightTitle = "k_height";
void blurImage(int, void*)
{
if (k_width < 1)
{
k_width = 1;
}
else if (k_height < 1)
{
k_height = 1;
}
Size ksize = Size(k_width, k_height);//模糊核
blur(src, blurImg, ksize, anchor, borderType);
imshow(pWindowsTitle, blurImg);
}
int main()
{
//读取图片
src = imread(IMAGE_PATH, 1);
if (src.empty())
{
cout << "Load img failed!" << endl;
return 0;
}
else
{
cout << "Load img successs!" << endl;
}
int maxVal = MIN(src.cols, src.rows) >> 1; //模糊核长、宽最大值
namedWindow(pWindowsTitle, WINDOW_AUTOSIZE);
createTrackbar(pWidthTitle, pWindowsTitle, &k_width, maxVal, blurImage);
createTrackbar(pHeightTitle, pWindowsTitle, &k_height, maxVal, blurImage);
waitKey(0);
return 1;
}
模糊核水平、垂直方向增大是不是很像你手抖时拍摄的照片呢。其实模糊核大小就相当于曝光时间,时间越长,拍摄运动目标越容易出现拖影。