C++ OpenCV 图像可视加密技术(一)
图像可视加密技术可以用作在信息安全等多个方面,具有运行效率快、方便携带等多个特性
原理:隐藏的图案都可以分解为两张或者多张表面上看起来随机的黑白图案,每一个子图案称为一个可视密钥
图像可视加密效果如下所示:

具体实现如下:
1 //生成一个密文矩阵,矩阵中包含加密信息,如A 2 Mat A = Mat::zeros(256, 256, CV_8UC3); 3 A.setTo(Scalar(255, 255, 255)); 4 putText(A, "A", Point(150, 150), FONT_HERSHEY_SIMPLEX, 5, Scalar(0, 0, 255), 5); 5 //创建密文矩阵的Mask 6 Mat A_Mask = Mat::zeros(256, 256, CV_8UC1); 7 //定义两个个矩阵作为结果 8 Mat image1 = Mat::zeros(256, 256, CV_8UC3); 9 Mat image2 = Mat::zeros(256, 256, CV_8UC3); 10 RNG_MT19937 rng(10086); 11 for (int i = 0; i < image1.rows; ++i) { 12 for (int j = 0; j < image1.cols; ++j) { 13 14 //为两个矩阵添加随机噪点 15 double n = rng.uniform(0.0, 1.0); 16 if (n < 0.5) { 17 image1.at<Vec3b>(i, j) = Vec3b(255, 255, 255);//白色 18 image2.at<Vec3b>(i, j) = Vec3b(255, 255, 255);//白色 19 } 20 else { 21 image1.at<Vec3b>(i, j) = Vec3b(0, 0, 255);//红色 22 image2.at<Vec3b>(i, j) = Vec3b(0, 0, 0);//黑色 23 } 24 25 //创建Mask 26 if (A.at<Vec3b>(i, j) == Vec3b(0, 0, 255)) { 27 A_Mask.at<uchar>(i, j) = 1;//把密文信息像素点赋值为1 28 } 29 } 30 } 31 32 33 Mat A_Mask_Result; 34 bitwise_and(A, image2, A_Mask_Result, A_Mask); 35 36 //将密文Mask矩阵信息赋值给子密钥(子图)image1 37 for (int i = 0; i < A_Mask.rows; ++i) { 38 for (int j = 0; j < A_Mask.cols; ++j) { 39 if (A_Mask.at<uchar>(i, j)) { 40 //黑色 41 if (A_Mask_Result.at<Vec3b>(i, j) == Vec3b(0, 0, 0)) { 42 image1.at<Vec3b>(i, j) = Vec3b(255, 255, 255); 43 } 44 //红色 45 else { 46 image1.at<Vec3b>(i, j) = Vec3b(0, 0, 255); 47 } 48 } 49 } 50 } 51 52 //解密 53 Mat result; 54 bitwise_and(image1, image2, result);
结果:
矩阵A

A_Mask(密文信息A为像素值1,所以在256个灰度级别看起来全黑)

A_Mask_Result

image1

image2

result


浙公网安备 33010602011771号