本章内容
1. 均值滤波
2.高斯滤波
3.中值滤波
4. 双边滤波
5.自定义滤波核滤波
1.均值滤波
输出结果:
2.高斯滤波
输出结果:
3.中值滤波
输出结果
4. 双边滤波
输出结果
5.自定义滤波
输出结果
源码
#include <ostream>
#include <opencv.hpp>int main(int argc, char *argv[])
{
/*
本章内容:
1. 均值滤波
2.高斯滤波
3.中值滤波
4.双边滤波
5.自定义滤波核滤波
*/
cv::String fileName = "/home/wang/dev/Image/cdut.jpeg";
cv::Mat src = cv::imread(fileName);
if(src.data == NULL){
printf("图像读入失败\n");
return -1;
}
/* 1. 均值滤波
api接口: CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
Size ksize, Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT );*/
cv::Mat dst;
cv::blur(src,dst,cv::Size(5,5));
cv::imshow("cdut", src);
cv::imshow("cdut blur", dst);
/*2.高斯滤波
api接口: CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT );
参数: sigmaX,sigmaY,为高斯核的标准差,默认sigmaY与sigmaX相同。
*/
cv::Mat dstGaussian;
cv::GaussianBlur(src, dstGaussian, cv::Size(7,7),5.0);
cv::imshow("cdut Gaussian", dstGaussian);/*3.中值滤波
api接口:
CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );
*/
cv::Mat dstMedian;
cv::medianBlur(src, dstMedian, 5 );
cv::imshow("cdut median", dstMedian);/*4.双边滤波
api接口: CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );
参数分析:
@param d Diameter of each pixel neighborhood that is used during filtering. // 核空间范围
@param sigmaColor Filter sigma in the color space. // 颜色空间标准差
@param sigmaSpace Filter sigma in the coordinate space. // 空域标准差
*/
cv::Mat dstBilateral;
cv::bilateralFilter(src, dstBilateral, 5,7,7);
cv::imshow("cdut dstBilateral", dstBilateral);/* 5.自定义滤波
api接口: CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth,
InputArray kernel, Point anchor = Point(-1,-1),
double delta = 0, int borderType = BORDER_DEFAULT );
参数分析:
@param ddepth Destination image depth, see @ref filter_depths "combinations"*/
cv::Mat dstMe;cv::Mat kernel=(cv::Mat_<float>(3,3) << 1.0,2.0,1.0,2.0,4.0,2.0,1.0,2.0,1.0);
/* 求和运算接口
CV_EXPORTS_AS(sumElems) Scalar sum(InputArray src);
*/
cv::Scalar sumValue = cv::sum(kernel);
std::cout << "sum = %f\n" << sumValue << std::endl;
/* 除法运算接口
CV_EXPORTS_W void divide(double scale, InputArray src2,
OutputArray dst, int dtype = -1);
*/
std::cout << "kenerl befor divide\n" << kernel <<std::endl;
cv::divide(1/sumValue[0], kernel, kernel);
std::cout << "kernel after divide\n" << kernel << std::endl;
cv::filter2D(src, dstMe, -1,kernel);
printf("src.type=%d, dstMe.type=%d\n",src.type(),dstMe.type());
cv::imshow("cdut myKernel", dstMe);cv::waitKey(0);
return 1;
}