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

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • vue判断字符串是否含有另一个字符串_js中判断是否包含某个字符串

    vue判断字符串是否含有另一个字符串_js中判断是否包含某个字符串String对象的方法1.indexOf()indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该方法返回-1。varstr=’你好啊双11!’;console.log(str.indexOf(‘!’)!=-1)//true2.search()search()方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字…

  • android错误之android.content.res.Resources$NotFoundException:

    错误:android.content.res.Resources$NotFoundException: String resource ID #0x1原因:一般发生在参数 int resId 错误,你把String赋值给int的resId,所以编译器找不到正确的resource于是报错。最简单的例子,检查一下你的Toast.makeText()啊textView.setText啊之类的函数

  • python 正则表达式判断_Python 正则表达式[通俗易懂]

    python 正则表达式判断_Python 正则表达式[通俗易懂]跟随练习:importreoriginal_string=r”ABC\-001″rexp_string=r’\w{3}\\\-\d{3}’result=re.match(rexp_string,original_string)original_string_1=”abcd”original_string_2=”abcd”original_string_…

  • 毕业设计之我的项目—-旅游管理系统的设计与实现[通俗易懂]

    毕业设计之我的项目—-旅游管理系统的设计与实现[通俗易懂]本项目需求来源于网络,有需要源码和交流的评论额?喜欢软件对软件有着很高程度认识的朋友也可以指出我的设计问题等等。欢迎与我交流角色分析角色:用户:管理员:功能分析用户:登录注册:修改个人信息预定酒店功能个人酒店订单查询:景点信息查询:酒店评价:景点评价:游记功能:增-查线路查询:轮播图:结伴游:…

  • 2.在Ubuntu中安装 PyCharm的步骤[通俗易懂]

    2.在Ubuntu中安装 PyCharm的步骤[通俗易懂]在Ubuntu下安装PyCharm软件的详细步骤介绍

    2022年10月31日
  • CentOS 6 Yum源更新「建议收藏」

    CentOS 6 Yum源更新「建议收藏」最近在CentOS6上安装软件一直报错,安装不了,换了163,清华,阿里yum源都不行,进去链接看才发现有关CentOS6yum源包全部下架了。官宣:CentOS6停止所有更新​​​​CentOS6已经随着2020年11月的结束进入了EOL(ReachesEndofLife)。所以在2020年12月2日,CentOS官方停止了对CentOS6的所有更新,并且下架了包括官方所有的CentOS6源,目前阿里、163、清华等CentOS6源已无法使用。以下官方redme文档的解释:.

发表回复

您的电子邮箱地址不会被公开。

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