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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu 设置不见了_微信莫名其妙的被注销了

    ubuntu 设置不见了_微信莫名其妙的被注销了        今天学习GTK+,所以下载了源码包,然后安装了必要的依赖,装好后,因为默认安装是安装在/usr/local/include/目录下了,为了编程的方便,所以就建立了符号链接到/usr/include/目录下。       一晃就是一天了,现在打开某些程序,发现怎么显示不对,跟我的gentoo安装了gnome时的默认界面一样,很朴素的样子,怎么回事?一看Firefox还好,还没

    2022年9月15日
    2
  • pycharm中如何导入库_如何把手变成手控

    pycharm中如何导入库_如何把手变成手控大家都知道,Python是一个极其方便的由库构建的编程语言。比如机器学习的库sklearn,文件读取pandas,文件读写xlwt,xlrt,矩阵运算numpy等等等等等等等等等等,多到你无法想象!那到底如何导入Python库呢?我们今天就来学习一下~点击File->NewProject,创建一个PyCharm项目,然后点击File->Settings->P…

    2022年8月26日
    5
  • python基础教程 入门教程_python基础入门教程

    python基础教程 入门教程_python基础入门教程首先,我已经假定你已经看了无数遍的垃圾文章,然后依然搞不懂类和对象,但是呢起码知道有类和对象这么两个玩意儿。由于你没有编程经验,所以无法从学过的编程语言里通过类比去理解Python的‘类和对象’。咱们用生活中的例子来说说,建房子。类(class):相当于施工图纸(blueprint)对象(object):房子(已经建造好的)假设你手上有施工图纸(Blueprint),里面有房子的所有信…

    2022年8月29日
    2
  • 免费开源的服务器虚拟化Proxmox+分布式存储Ceph(二)

    免费开源的服务器虚拟化Proxmox+分布式存储Ceph(二)

    2021年6月16日
    109
  • Pycharm使用anaconda环境 (原环境 base)

    Pycharm使用anaconda环境 (原环境 base)Pycharm 使用 anaconda 环境 原环境 base 注意本教程是针对使用 anaconda 的新手 添加的是 anaconda 自带的 base 环境 首先打开或者新建一个 Python 项目 File gt Settings gt Project gt PythonInterp 然后在右边 PythonInterp 看一下又没有 anaconde 的选项 如果有 就直接选中 然后就可以了 如果没有那就继续看下去 如果没有默认读取 anaconda 的选项 那

    2025年9月19日
    0
  • Java的注解

    Java的注解一、注解的概念:注解并不是一开始就有的,JDK5之前是没有注解的,JDK5及其以后JDK版本才开始支持Java注解!Java注解(Annotation)也叫做元数据,以@注解名在代码中存在,它是一种在源代码中标注的特殊标记,可以标注源代码中的类、属性、方法、参数等代码,主要用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。1.1Java注解按照含有参数的个数分为三种:不带参数,语法结构为:@Annotation,例如@FunctionalInterface;带一个参数的注解,语

    2022年7月9日
    20

发表回复

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

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