opencv 一种图像加密的方法

在网上偶然看到图像加密的内容,就想着研究研究,搞清楚到底是怎么回事。

本文主要参考博文 http://blog.csdn.net/u013626386/article/details/39736611 

其为matlab实现方法,博主好好看了下,理解了其加密的原理, 然后自己用c++实现,现在记录其原理及代码。

1、生成与图片大小相对应的,具有随机性和规律性的数据。

void getEencryptListFromImageSize(Size imagesize, vector<int> &list1, vector<int> &list2, double paDou1, double paDou2, double paK)
{
	int elementNum = imagesize.width*imagesize.height;
	double x1 = (paDou1 + paK) / 2;
	double x2 = (paDou2 + paK) / 2;
	//double x1 = (paDou1 ) / 2;
	//double x2 = (paDou2 ) / 2;
	double y1, y2, nowx1, nowx2;
	int tem, k1, k2;
	double lastx1 = x1;
	double lastx2 = x2;
	for (int i = 0; i < elementNum; i++)
	{
		nowx1 = 4*lastx1*(double(1)- lastx1);
		nowx2 = 4*lastx2*(double(1) - lastx2);
		y1 = (double(1) / 3.1415926)*asin(sqrt(nowx1));
		y2 = (double(1) / 3.1415926)*asin(sqrt(nowx2));
		tem = floor(y1*pow(10, 8));
		k1 = tem % 256;
		tem = floor(y2*pow(10, 6));
		k2 = tem % 256;
		list1.push_back(k1);
		list2.push_back(k2);
		lastx1 = nowx1;
		lastx2 = nowx2;
	}
}
2、将图像与生成的数据进行相对应的位异或计算,就得到看起来杂乱无序的加密图像。加密后的图像,想要还原时,只需再次与生成的数据进行同样的计算即可。

Mat pictureDecrypt(Mat src, vector<int> list1, vector<int> list2)
{
	Mat dstImage = src.clone();
	int loop = 0;
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			int tem;
			if (loop % 2 == 0)
			{
				tem = list1[i*src.cols + j];

			}
			else
			{
				tem = list2[i*src.cols + j];

			}
			if (src.channels()==1)
			{
				int num = src.at<uchar>(i, j);
				int num1 = num^tem;
				dstImage.at<uchar>(i, j) = num1;
			}
			else if (src.channels() == 3)
			{
				int num0 = src.at<Vec3b>(i, j)[0];
				int num1 = src.at<Vec3b>(i, j)[1];
				int num2 = src.at<Vec3b>(i, j)[2];
				int res0 = num0^tem;
				int res1 = num1^tem;
				int res2 = num2^tem;
				dstImage.at<Vec3b>(i, j)[0] = res0;
				dstImage.at<Vec3b>(i, j)[1] = res1;
				dstImage.at<Vec3b>(i, j)[2] = res2;
			}
			loop = loop + 1;
			if (loop ==925444)
			{
				cout << "" << endl;
			}
		}
	}
	return dstImage;
}

3、下面展示效果

源图



加密后的图像


解密后的图像


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值