Диплом ЦВЗ (1221233), страница 15
Текст из файла (страница 15)
vector<bitset<8>> cods;
for (int i = 0; i < allength; i++)
{
uchar a;
a = Cyphertext[i];
bitset<8>t(a);
cods.push_back(t);
}
return cods;
}
string ObrVisioner(string cryptotext, string CheckStart, string CheckFinish)
{
int size = cryptotext.length();
size_t found = cryptotext.find(CheckStart);
int l = CheckStart.length();
cryptotext.erase(found, l);
l = CheckFinish.size();
found = cryptotext.rfind(CheckFinish);
cryptotext.erase(found, l);
int t = cryptotext.size();
string codes;//оригинальное сообщение
//Расшифровывание
int A[256]; //алфавит шифра
for (int i = 0; i < 256; i++)
{
A[i] = i;
}
string K = "Key911";//ключ
int nk = K.length();
string keymodes; //модифицированный ключ
keymodes.push_back(K[0]);
t = (int)cryptotext.size();
for (int i = 1; i<t; i++)
{
int r = i%nk; //высчитываемый индекс
if (r>0)
{
keymodes.push_back(K[r]);
}
if (r == 0)
{
keymodes.push_back(K[nk - 1]);
}
}
int m, n;
for (int j = 0; j < t; j++)
{
for (int i = 0; i < 256; i++)
{
if (uchar(cryptotext[j]) == A[i])
{
m = i;
}
if (keymodes[j] == A[i])
{
n = i;
}
}
int r = (m - n + 256) % 256;
if (r > 0)
{
codes.push_back(A[r]);
}
if (r == 0)
{
codes.push_back(A[255]);
}
}
return codes;
}
//функции тестов
Mat Turn(Mat src)//поворот на 60 градусов
{
Mat dst = Mat::zeros(src.rows, src.cols, src.type());
Mat rot_mat(2, 3, CV_32FC1);
Point center = Point(src.rows / 2, src.cols / 2);
double angle = -90.0;
double scale = 1;
rot_mat = getRotationMatrix2D(center, angle, scale);
warpAffine(src, dst, rot_mat, dst.size());//преобразование поворотом
namedWindow("Turned", WINDOW_AUTOSIZE);
imshow("Turned", dst);
waitKey(0);
destroyWindow("Turned");
return dst;
}
Mat Resize(Mat src, int heigh, int widt)//изменение размера
{
Mat dst;
resize(src, dst, Size(), 0.5, 0.5, CV_INTER_AREA);//уменьшаем размер в 2 раза
heigh = heigh / 2;
widt = widt / 2;
namedWindow("Resized", WINDOW_AUTOSIZE);
imshow("Resized", dst);
waitKey(0);
destroyWindow("Resized");
return dst;
}
Mat Gaussian(Mat src)//сглаживание при помощи функции Гаусса
{
Mat dst;
GaussianBlur(src, dst, Size(3, 3), 0, 0);
namedWindow("Gauss", WINDOW_AUTOSIZE);
imshow("Gauss", dst);
waitKey(0);
destroyWindow("Gauss");
return dst;
}
Mat Chetkost(Mat src)//повышение чёткости
{
Mat dst;
float kernel[9];
kernel[0] = -0.1;
kernel[1] = -0.1;
kernel[2] = -0.1;
kernel[3] = -0.1;
kernel[4] = 2;
kernel[5] = -0.1;
kernel[6] = -0.1;
kernel[7] = -0.1;
kernel[8] = -0.1;
Mat kernel_matrix(3, 3, CV_32FC1, kernel);
filter2D(src, dst, -1, kernel_matrix, Point(-1, 1), 0, BORDER_DEFAULT);
namedWindow("Chetkost", WINDOW_AUTOSIZE);
imshow("Chetkost", dst);
waitKey(0);
destroyWindow("Chetkost");
return dst;
}
Mat brightness(Mat src)//увеличение яркости
{
Mat dst;
float kernel[9];
kernel[0] = -0.1;
kernel[1] = 0.2;
kernel[2] = -0.1;
kernel[3] = 0.2;
kernel[4] = 3;
kernel[5] = 0.2;
kernel[6] = -0.1;
kernel[7] = 0.2;
kernel[8] = -0.1;
Mat kernel_matrix(3, 3, CV_32FC1, kernel);
filter2D(src, dst, -1, kernel_matrix, Point(-1, 1), 0, BORDER_DEFAULT);
namedWindow("Bright", WINDOW_AUTOSIZE);
imshow("Bright", dst);
waitKey(0);
destroyWindow("Bright");
return dst;
}
Mat Dark(Mat src)//уменьшение яркости
{
Mat dst;
float kernel[9];
kernel[0] = -0.1;
kernel[1] = 0.1;
kernel[2] = -0.1;
kernel[3] = 0.1;
kernel[4] = 0.5;
kernel[5] = 0.1;
kernel[6] = -0.1;
kernel[7] = 0.1;
kernel[8] = -0.1;
Mat kernel_matrix(3, 3, CV_32FC1, kernel);
filter2D(src, dst, -1, kernel_matrix, Point(-1, 1), 0, BORDER_DEFAULT);
namedWindow("Dark", WINDOW_AUTOSIZE);
imshow("Dark", dst);
waitKey(0);
destroyWindow("Dark");
return dst;
}
Mat Erode(Mat src)
{
Mat dst;
int radius = 3;
Mat element = getStructuringElement(MORPH_ELLIPSE, cv::Size(2 ∙ radius + 1, 2 ∙ radius + 1), cv::Point(radius, radius));
erode(src, dst, element);
namedWindow("Erode", WINDOW_AUTOSIZE);
imshow("Erode", dst);
waitKey(0);
destroyWindow("Erode");
return dst;
}
Mat CutRight(Mat src, int heigh, int widt)
{
int news = widt∙0.8;
Mat dst(heigh, news, CV_8UC3);
for (int i = 0; i < heigh; i++)
{
for (int j = 0; j < news ∙ 3; j++)
{
dst.at<uchar>(i, j) = src.at<uchar>(i, j);
}
}
namedWindow("Cut", WINDOW_AUTOSIZE);
imshow("Cut", dst);
waitKey(0);
destroyWindow("Cut");
return dst;
}
Mat CutDown(Mat src, int heigh, int widt)
{
int news = heigh∙0.8;
Mat dst(news, widt, CV_8UC3);
for (int i = 0; i < news; i++)
{
for (int j = 0; j < widt ∙ 3; j++)
{
dst.at<uchar>(i, j) = src.at<uchar>(i, j);
}
}
namedWindow("Cut", WINDOW_AUTOSIZE);
imshow("Cut", dst);
waitKey(0);
destroyWindow("Cut");
return dst;
}
Mat JPEGComp(Mat src)
{
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
compression_params.push_back(70);
imwrite("Comp.jpg", src, compression_params);
imshow("Comp.jpg", src);
waitKey(0);
destroyWindow("Comp.jpg");
Mat dst = imread("Comp.jpg", CV_LOAD_IMAGE_COLOR);
return dst;
}
//показатели визуальных искажений
int MD(Mat cont, Mat stego)//максимальная разность
{
int max = abs(cont.at<uchar>(0, 0) - stego.at<uchar>(0, 0));
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
int md = abs(cont.at<uchar>(i, j) - stego.at<uchar>(i, j));
if (md>max)
{
max = md;
}
}
}
return max;
}
double AD(Mat cont, Mat stego)//средняя абсолютная разность
{
double sum = 0;
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum += abs(cont.at<uchar>(i, j) - stego.at<uchar>(i, j));
}
}
double ad = sum / (cont.rows∙cont.cols);
return ad;
}
double NAD(Mat cont, Mat stego)//нормированная средняя абсолютная разность
{
double sum1 = 0;
double sum2 = 0;
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum1 += abs(cont.at<uchar>(i, j) - stego.at<uchar>(i, j));
sum2 += cont.at<uchar>(i, j);
}
}
double nad = sum1 / sum2;
return nad;
}
double MSE(Mat cont, Mat stego)//среднеквадратическая ошибка
{
double sum = 0;
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum += pow(cont.at<uchar>(i, j) - stego.at<uchar>(i, j), 2);
}
}
double mse = sum / (cont.rows∙cont.cols);
return mse;
}
double NMSE(Mat cont, Mat stego)//нормированная среднеквадратическая ошибка
{
double sum1 = 0;
double sum2 = 0;
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum1 += pow(cont.at<uchar>(i, j) - stego.at<uchar>(i, j), 2);
sum2 += pow(cont.at<uchar>(i, j), 2);
}
}
double nmse = sum1 / sum2;
return nmse;
}
double SNR(Mat cont, Mat stego)//отношение "сигнал-шум"
{
double sum1 = 0;
double sum2 = 0;
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum1 += pow(cont.at<uchar>(i, j) - stego.at<uchar>(i, j), 2);
sum2 += pow(cont.at<uchar>(i, j), 2);
}
}
double snr = sum2 / sum1;
return snr;
}
double PSNR(Mat cont, Mat stego)//максимальное отношение "сигнал-шум"
{
double sum1 = 0;
int max = cont.at<uchar>(0, 0);
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum1 += pow(cont.at<uchar>(i, j) - stego.at<uchar>(i, j), 2);
int ps = cont.at<uchar>(i, j);
if (max < ps)
{
max = ps;
}
}
}
double psnr = cont.rows∙cont.cols ∙ pow(max, 2) / sum1;
return psnr;
}
double IF(Mat cont, Mat stego)//качество изображения
{
double sum1 = 0;
double sum2 = 0;
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum1 += pow(cont.at<uchar>(i, j) - stego.at<uchar>(i, j), 2);
sum2 += pow(cont.at<uchar>(i, j), 2);
}
}
double if1 = 1 - (sum1 / sum2);
return if1;
}
//LSB
void LSB(Mat Matvector[3], string text, int widt, int heigh, int contsize, int length)
{
string start = "P0ch@t0k";
string finish = "K5k1R9z@";
int allength = start.length() + finish.length() + length;
vector<bitset<8>> Cypher;//зашифрованный текст в бинарном виде
Cypher = ModVisioner(text, start, finish, length);
cout << "Генерирование ЦВЗ" << endl;
clock_t t1;
t1 = clock();
string Cyphertext;
for (int i = 0; i < allength; i++)
{
Cyphertext.push_back((uchar)Cypher[i].to_ulong());
}
vector<uchar> Cv;
for (int m = 0; m < 3; m++)
{
for (int i = 0; i < heigh; i++)
{
for (int j = 0; j < widt; j++)
{
Cv.push_back(Matvector[m].at<uchar>(i, j));
}
}
}
vector<uchar> Sv;//вектор изображения с ЦВЗ
vector<bitset<8>>v;
for (int m = 0; m < allength; m++)//текст в двоичной форме
{
bitset<8>b;
b = Cypher[m];
v.push_back(b);
}
int showraz = sqrt(allength ∙ 8);
Mat CVZ(showraz, showraz, CV_8U);
for (int i = 0; i < showraz; i++)
{
for (int j = 0; j < showraz; j++)
{
if (i∙showraz + j < allength ∙ 8)
{
if (v[(i∙showraz + j) / 8][(i∙showraz + j) % 8] == 0)
{
CVZ.at<uchar>(i, j) = 0;
}
if (v[(i∙showraz + j) / 8][(i∙showraz + j) % 8] == 1)
{
CVZ.at<uchar>(i, j) = 255;
}
}
}
}
t1 = clock() - t1;
cout << "Время генерирования ЦВЗ: " << (double)t1 / CLOCKS_PER_SEC << " секунд" << endl;
imwrite("LSBCVZ.tiff", CVZ);
namedWindow(" ЦВЗ", WINDOW_AUTOSIZE);
imshow(" ЦВЗ", CVZ);
waitKey(0);
destroyWindow("ЦВЗ");
cout << "Встраивание ЦВЗ" << endl;
clock_t t2 = clock();
for (int i = 0; i < contsize ∙ 3; i++)
{
bitset<8> P(Cv[i]);//замена младшего бита
if ((i % 2 == 0) && (i < allength ∙ 16))
{
int k = i / 16;