opencv笔记——图像操作

强烈推荐博主点击这里

实现代码

#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;
}

猜你喜欢

转载自blog.csdn.net/pipihan21/article/details/105298919
今日推荐