强烈推荐博主点击这里
实现代码
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
//声明函数
bool myblur();
bool myGaussianBlur();
bool mymedianBlur();
bool mybilateralFilter();
//定义图像
Mat srcimage;
Mat blurimage_one,blurimage_two,blurimage_three;
Mat Gaussianimage_one,Gaussianimage_two,Gaussianimage_three;
Mat medianimage;
Mat bilateralimage_one,bilateralimage_two;
int main()
{
system("color 5E");
srcimage=imread("C:/Users/xihua/Pictures/Saved Pictures/opencv操作图/luosi.jpg");
if (srcimage.empty()) {
cout << "No image!" << endl; return -1;
}
//调用函数
myblur();
myGaussianBlur();
mymedianBlur();
mybilateralFilter();
return 0;
}
//均值滤波实现均值模糊
bool myblur() {
//Size()的参数必须是正数
//均值模糊,Size(3, 3)表示卷积算子(掩膜-卷积核)大小(不一定要正方形)为3*3, Point(-1, -1) 表示取掩膜中心点为计算结果
if(srcimage.empty()) {
cout<<"No image!"<<endl; return false;
}
blur(srcimage,blurimage_one,Size(4,4),Point(-1,-1));
blur(srcimage,blurimage_two,Size(29,1),Point(-1,-1));//x方向模糊看起来像是瞬间移动一样
blur(srcimage,blurimage_three,Size(1,29),Point(-1,-1));//y方向模糊看起来会把图像拉高一点点
namedWindow("blurone");
namedWindow("blurtwo");
namedWindow("blurthree");
imshow("blurone",blurimage_one);
imshow("blurtwo",blurimage_two);
imshow("blurthree",blurimage_three);
waitKey(0);
return true;
}
//高斯滤波实现高斯模糊
bool myGaussianBlur() {
if(srcimage.empty()) {
cout<<"No image!"<<endl; return false;
}
//同样的卷积因子,均值模糊会比高斯模糊更模糊些
//Size()的参数必须是正数而且是奇数,否则会报错
//参数sigma x 11, sigma y 11 是控制x,y方向高斯权重分布的,似乎是值越大,图像越模糊,但不是线性关系
//高斯模糊,Size(3, 3)表示卷积算子(掩膜)大小(不一定要正方形)为3*3
GaussianBlur(srcimage,Gaussianimage_one,Size(3,3),11,11);
GaussianBlur(srcimage,Gaussianimage_two,Size(15,1),11,11);
GaussianBlur(srcimage,Gaussianimage_three,Size(1,15),11,11);
namedWindow("GaussianBlurone");
namedWindow("GaussianBlurtwo");
namedWindow("GaussianBlurthree");
imshow("GaussianBlurone",Gaussianimage_one);
imshow("GaussianBlurtwo",Gaussianimage_three);
imshow("GaussianBlurthree",Gaussianimage_three);
waitKey(0);
return true;
}
//中值滤波实现中值模糊
bool mymedianBlur() {
if(srcimage.empty()) {
cout<<"No image!"<<endl; return false;
}
medianBlur(srcimage,medianimage,3);//第三个参数代表产生一个3*3的矩阵
namedWindow("medianBlur");
imshow("medianBlur",medianimage);
waitKey(0);
return true;
}
//双边滤波实现双边模糊
bool mybilateralFilter() {
if(srcimage.empty()) {
cout<<"No image!"<<endl; return false;
}
bilateralFilter(srcimage,bilateralimage_one,15,150,3);//双边模糊,虽然是模糊,但是图像的轮廓还在,而且能增强图像的立体感
/*15 –计算的半径,半径之内的像数都会被纳入计算,如果提供-1 则根据sigma space参数取值
150 – sigma color 决定多少差值之内的像素会被计算
3 – sigma space 如果d的值大于0则声明无效,否则根据它来计算d值
中值模糊的ksize大小必须是大于1而且必须是奇数。*/
bilateralFilter(srcimage,bilateralimage_two,15,100,3);//常见美颜磨皮效果,sigmaColor值越小,保留的边缘像素越多,sigmaColor值适合在100,d值适合在15
namedWindow("bilateralFilterone");
namedWindow("bilateralFiltertwo");
imshow("bilateralFilterone",bilateralimage_one);
imshow("bilateralFiltertwo",bilateralimage_two);
waitKey(0);
return true;
}