C/C++图像处理算法(一)

C/C++图像处理算法(一)图像处理算法1总结如下://添加椒盐噪声voidsalt(Mat&src,intnumber){ for(inti=0;i<number;i++) { intr=static_cast<int>(rng.uniform(0,src.rows)); intc=static_cast<int>(rng.un…

大家好,又见面了,我是你们的朋友全栈君。

图像处理算法1总结如下:

//添加椒盐噪声
void salt(Mat& src,int number)
{
	for (int i = 0; i < number; i++)
	{
		int r = static_cast<int>(rng.uniform(0, src.rows));
		int c = static_cast<int>(rng.uniform(0, src.cols));
		int k = (static_cast<int>(rng.uniform(0, 1000))&1);
		if(k==1)
		    src.at<uchar>(r, c) = 255;
		else
			src.at<uchar>(r, c) = 0;
	}
	return;
}
/*
* @ drt :高斯方差
* @ Medium :高斯均值
*/
int Get_Gauss(int Medium, int drt)
{
	//产生高斯样本,以U为均值,D为均方差
	double sum = 0;
	for (int i = 0; i<12; i++) sum += rand() / 32767.00;
	//计算机中rand()函数为-32767~+32767(2^15-1)
	//故sum+为0~1之间的均匀随机变量
	return int(Medium + drt*(sum - 6));
	//产生均值为U,标准差为D的高斯分布的样本,并返回
}
/*
* variance :高斯噪声的方差
*/
 
//添加高斯噪声
void ImgAddGaussNoise1(const uchar *srcimgbuff, uchar * dstImgbuff, int srcwith, int srcheigh, int chanels)
{
	assert(srcimgbuff != NULL && srcwith > 0 && srcheigh > 0);
	int bytecount = srcwith * srcheigh * chanels;
 
	for (size_t i = 0; i < bytecount; i++)
	{
		dstImgbuff[i] += Get_Gauss(20, 0.02);
	}
}
//中值求取
void Media(Mat* src, int indexrows, int indexcols, int* meanv, int ker)
{
	int lo = (ker - 1) / 2;
	vector<int>moreo;
	for (int i = indexrows - lo; i <= indexrows + lo; i++)
	{
		for (int j = indexcols - lo; j <= indexcols + lo; j++)
		{
			moreo.push_back(src->at<uchar>(i, j));
		}
	}
	sort(moreo.begin(), moreo.end());
	*meanv = moreo.at(ker * ker / 2);
	return;
}
//均值求取
void Meanvalue(Mat* src, int indexrows, int indexcols, float* meanv, int ker)
{
	int lo = (ker - 1) / 2;
	float total = 0;
	for (int i = indexrows - lo; i <= indexrows + lo; i++)
	{
		for (int j = indexcols - lo; j <= indexcols + lo; j++)
		{
			total += src->at<uchar>(i, j);
		}
	}
	*meanv = total / (ker * ker);
	return;
}
//像素方差
void Variance(Mat& src, vector<test>& hierachy, int ker)
{
	int row = src.rows;
	int col = src.cols;
	int lo = (ker - 1) / 2;
	for (int ir = lo; ir < row - lo; ir++)
	{
		for (int jc = lo; jc < col - lo; jc++)
		{
			float means;
			int var;
			//计算均值
			Meanvalue(&src, ir, jc, &means, ker);
			Vvalue(&src, ir, jc, &var, ker, means);
			test temp;
			temp.menval = var;
			temp.x = ir;
			temp.y = jc;
			hierachy.push_back(temp);
		}
	}
	return;
}
//局部方差求取
void Vvalue(Mat* src, int indexrows, int indexcols, int* vall, int ker, float mean)
{
	int lo = (ker - 1) / 2;
	float total = 0;
	for (int i = indexrows - lo; i <= indexrows + lo; i++)
	{
		for (int j = indexcols - lo; j <= indexcols + lo; j++)
		{
			total += pow((src->at<uchar>(i, j) - mean), 2);
		}
	}
	*vall = static_cast<int>(total);
	return;
}
//STL排序方式
bool SortByM1(const test &v1, const test &v2)//注意:本函数的参数的类型一定要与vector中元素的类型一致  
{
	return v1.menval < v2.menval;//升序排列  
}
//SSIM 结构相似比
Scalar getMSSIM(const Mat& i1, const Mat& i2)
{
	const double C1 = 6.5025, C2 = 58.5225;
	/***************************** INITS **********************************/
	int d = CV_32F;
 
	Mat I1, I2;
	i1.convertTo(I1, d);           // cannot calculate on one byte large values
	i2.convertTo(I2, d);
 
	int num = I1.channels();
	//cv::imshow("123", I1);
	//cv::waitKey();
 
	Mat I2_2 = I2.mul(I2);        // I2^2
	Mat I1_2 = I1.mul(I1);        // I1^2
	Mat I1_I2 = I1.mul(I2);        // I1 * I2
 
								   /*************************** END INITS **********************************/
 
	Mat mu1, mu2;   // PRELIMINARY COMPUTING
	GaussianBlur(I1, mu1, Size(11, 11), 1.5);
	GaussianBlur(I2, mu2, Size(11, 11), 1.5);
 
	Mat mu1_2 = mu1.mul(mu1);
	Mat mu2_2 = mu2.mul(mu2);
	Mat mu1_mu2 = mu1.mul(mu2);
 
	Mat sigma1_2, sigma2_2, sigma12;
 
	GaussianBlur(I1_2, sigma1_2, Size(11, 11), 1.5);
	sigma1_2 -= mu1_2;
 
	GaussianBlur(I2_2, sigma2_2, Size(11, 11), 1.5);
	sigma2_2 -= mu2_2;
 
	GaussianBlur(I1_I2, sigma12, Size(11, 11), 1.5);
	sigma12 -= mu1_mu2;
 
	/ FORMULA 
	Mat t1, t2, t3;
 
	t1 = 2 * mu1_mu2 + C1;
	t2 = 2 * sigma12 + C2;
	t3 = t1.mul(t2);              // t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))
 
	t1 = mu1_2 + mu2_2 + C1;
	t2 = sigma1_2 + sigma2_2 + C2;
	t1 = t1.mul(t2);               // t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))
 
	Mat ssim_map;
	divide(t3, t1, ssim_map);      // ssim_map =  t3./t1;
 
	Scalar mssim = mean(ssim_map); // mssim = average of ssim map
	return mssim;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145523.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Gerrit使用教程详解[通俗易懂]

    Gerrit使用教程详解[通俗易懂]个人觉得这几篇博客介绍挺详细的,收藏转发分享:1、gerrit使用教程(一)https://www.cnblogs.com/111testing/archive/2018/08/09/9450530.html2、git上传本地代码到远程仓库https://www.cnblogs.com/111testing/p/7663229.html3、gitlog查看提交历史https:/…

    2022年10月23日
  • (ADRC)自抗扰控制器学习总结(一)

    (ADRC)自抗扰控制器学习总结(一)ADRC自抗扰控制基本思想要点:1.标准型与总扰动,扩张状态与扰动整体辨识,微分信号生成与安排过渡过程以及扰动的消减与控制量产生。ADRC主要构成:1>跟踪微分器(TD) 解决由不连续或带随机噪声的量测信号,合理提取连续信号(跟踪给定)及微分信号的问题。 根据微分输出与最速综合函数,可以安排闭环系统的过渡过程。以单位阶跃信号为例,经过跟踪微分器的过渡,产生的输出效果

    2022年5月19日
  • laravel获取当前认证用户登录

    laravel获取当前认证用户登录

    2021年11月5日
  • django restful API 代码自动生成_阿里restful接口规范

    django restful API 代码自动生成_阿里restful接口规范restful接口规范什么是接口规范?接口规范就是为了采用不同的后台语言,也能使用同样的接口获取到同样的数据。如何写接口:接口规范是规范化书写接口的,写接口要写url、响应数据​注:如果将请求参

    2022年7月31日
  • #Java算法设计与分析1–递归算法

    #Java算法设计与分析1–递归算法1.递归算法1.1递归的概念所谓递归,就是程序方法在运行过程中自身调用自身。定义如下所示。fn(){ if(递归出口条件){ returnx;}else{ //somecodes…returnfn();}}1.2递归的使用条件1.2.1必须要有明确的递归出口所谓递归出口就是需要有明确的结束条件。1.2.2每次递归都要使问题的规模减小1.2.3递归的规模…

    2022年7月8日
  • 我的世界java版和基岩版对比_我的世界:盘点基岩版与JAVA版的差异,看完后选谁就一目了然了…

    我的世界java版和基岩版对比_我的世界:盘点基岩版与JAVA版的差异,看完后选谁就一目了然了…大家好,今天我们来讲讲基岩版与JAVA版的差异,根据个人爱好不同,看完后选谁就一目了然了。1.基岩版与Win10版的特性是相同的。JAVA版与Win10没什么相同的地方。2.基岩版是没有活塞bud的,而JAVA有更多bud状态。3.基岩版在红石方面会比较便捷,如基岩版的活塞可以推动容器,而JAVA版则没有这个特性。4.JAVA版有比基岩版更多的MOD。5.JAVA版的命名牌改成某个名字(忘记是什么…

    2022年7月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号