C++ 和 OpenCV 实现的灰度图像转成一维之后,利用Lorenz超混沌系统加解密完整代码
时间: 2024-02-28 16:52:51 浏览: 26
以下是C++和OpenCV实现的灰度图像转成一维之后,利用Lorenz超混沌系统加解密的完整代码:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
double a = 10.0, b = 28.0, c = 8.0 / 3.0;
int imgSize, keyLen;
double x, y, z;
void lorenz(double &x, double &y, double &z) {
double dx = a * (y - x);
double dy = x * (b - z) - y;
double dz = x * y - c * z;
x += 0.01 * dx;
y += 0.01 * dy;
z += 0.01 * dz;
}
void generateKey(string &key) {
key = "";
for (int i = 0; i < keyLen; i++) {
lorenz(x, y, z);
int k = (int) (x * 1000) % 256;
key += (char) k;
}
}
void encrypt(Mat &img, string key) {
imgSize = img.rows * img.cols;
int index = 0;
for (int i = 0; i < img.rows; i++) {
for (int j = 0; j < img.cols; j++) {
uchar &p = img.at<uchar>(i, j);
p ^= key[index++ % keyLen];
}
}
}
void decrypt(Mat &img, string key) {
imgSize = img.rows * img.cols;
int index = 0;
for (int i = 0; i < img.rows; i++) {
for (int j = 0; j < img.cols; j++) {
uchar &p = img.at<uchar>(i, j);
p ^= key[index++ % keyLen];
}
}
}
int main() {
string key;
Mat img = imread("lena.png", IMREAD_GRAYSCALE);
keyLen = img.rows * img.cols / 8;
x = y = z = 1;
generateKey(key);
encrypt(img, key);
imwrite("encrypted.png", img);
decrypt(img, key);
imwrite("decrypted.png", img);
return 0;
}
```
其中,`lorenz`函数实现了Lorenz超混沌系统的迭代过程,`generateKey`函数生成了用于加解密的密钥,`encrypt`函数实现了加密过程,`decrypt`函数实现了解密过程。在加解密过程中,将每个像素点的灰度值与密钥进行异或操作,实现加密和解密。