Диплом ЦВЗ (1221233), страница 16
Текст из файла (страница 16)
int l = (i % 16) / 2;
P[0] = v[k][l];
}
else
{
P[0] = rand() % 2;
}
Sv.push_back((uchar)P.to_ulong());
}
Mat Vector1(heigh, widt, CV_8UC1);
Mat Vector2(heigh, widt, CV_8UC1);
Mat Vector3(heigh, widt, CV_8UC1);
vector<Mat> Vector;
Vector.push_back(Vector1);
Vector.push_back(Vector2);
Vector.push_back(Vector3);
for (int m = 0; m < 3; m++)
{
for (int i = 0; i < heigh; i++)
{
for (int j = 0; j < widt; j++)
{
Vector[m].at<uchar>(i, j) = Sv[m∙heigh∙widt + widt∙i + j];
}
}
}
Mat FResult(heigh, widt, CV_8UC3);
merge(Vector, FResult);
imwrite("mergedLSB.tiff", FResult);
t2 = clock() - t2;
cout << "Время встраивания ЦВЗ: " << (double)t2 / CLOCKS_PER_SEC << " секунд";
namedWindow("Изображение с ЦВЗ", WINDOW_AUTOSIZE);
imshow("Изображение с ЦВЗ", FResult);
waitKey(0);
destroyWindow("Изображение с ЦВЗ");
//показатели визуального искажения
int md = MD(Matvector[0], Vector[0]);
double ad = AD(Matvector[0], Vector[0]);
double nad = NAD(Matvector[0], Vector[0]);
double mse = MSE(Matvector[0], Vector[0]);
double nmse = NMSE(Matvector[0], Vector[0]);
double snr = SNR(Matvector[0], Vector[0]);
double psnr = PSNR(Matvector[0], Vector[0]);
double If = IF(Matvector[0], Vector[0]);
cout << endl;
cout << "Показатели визуального искажения" << endl;
cout << "Максимальная разность значений пикселов: " << md << endl;
cout << "Средняя абсолютная разность значений пикселов: " << ad << endl;
cout << "Нормированная средняя абсолютная разность: " << nad << endl;
cout << "Отношение сигнал-шум: " << snr << endl;
cout << "Максимальное отношение сигнал-шум: " << psnr << endl;
cout << "Качество изображения: " << If ∙ 100 << "%" << endl;
/∙FResult=Resize(FResult, widt, heigh);∙/
/∙FResult = Turn(FResult);∙/
//FResult=Gaussian(FResult);
/∙FResult = Chetkost(FResult);∙/
//FResult = brightness(FResult);
/∙FResult = Dark(FResult);∙/
/∙FResult = Erode(FResult);∙/
/∙FResult = CutRight(FResult, heigh, widt);∙/
//FResult = CutDown(FResult, heigh, widt);
/∙FResult = JPEGComp(FResult);∙/
heigh = FResult.rows;
widt = FResult.cols;
//Обратный ход
cout << "Извлечение ЦВЗ" << endl;
clock_t t3 = clock();
Mat SVector[3];
vector<uchar>Sv1;
split(FResult, SVector);
for (int m = 0; m < 3; m++)//преобразуем матрицу в вектор
{
for (int i = 0; i < heigh; i++)
{
for (int j = 0; j < widt; j++)
{
uchar temp1 = SVector[m].at<uchar>(i, j);
Sv1.push_back(temp1);
}
}
}
string cryptotext;
for (int i = 0; i < Sv1.size() / 16; i++)
{
bitset<8>temp1;
for (int j = 0; j < 8; j++)
{
bitset<8>P1(Sv1[i ∙ 16 + j ∙ 2]);
temp1[j] = P1[0];
}
uchar symb = (uchar)temp1.to_ulong();
cryptotext.push_back(symb);
}
size_t found = cryptotext.find(start);
string fcrypt;
if (found == -1)
{
cout << "Doesn't work" << endl;
int zz1;
cin >> zz1;
}
size_t found1 = cryptotext.find(finish);
if (found1 == -1)
{
cout << "Doesn't work" << endl;
int zz2;
cin >> zz2;
}
if ((found != -1) && (found1 != -1))
{
fcrypt = cryptotext.substr(found, allength);
}
string Ourresult = ObrVisioner(fcrypt, start, finish);
t3 = clock() - t3;
cout << "Исходное сообщение" << endl;
cout << Ourresult << endl;
cout << "Время извлечения: " << (double)t3 / CLOCKS_PER_SEC << " секунд";
}
//Kutter
void Kutter(char∙ filename, Mat Matvector[3], string text, int widt, int heigh, int contsize, int length)
{
Mat start(heigh, widt, CV_8UC1);
for (int i = 0; i < heigh; i++)
{
for (int j = 0; j < widt; j++)
{
start.at<uchar>(i, j) = Matvector[0].at<uchar>(i, j);
}
}
Mat image_gray;//градации серого
image_gray = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);
clock_t t1;
t1 = clock();
//генерация ключей
int K0 = 125;
int round = 6;
int Ks[12];
Ks[0] = K0;
for (int i = 1; i < 12; i++)
{
int t = Ks[i - 1] ∙ Ks[i - 1];
char∙ temp = new char[];
_itoa(t, temp, 10);
char∙ temp1 = new char[];
strncpy(temp1, temp, 3);
Ks[i] = atoi(temp1);
if (Ks[i] > 255)
{
char∙ temp2 = new char[];
_itoa(Ks[i], temp2, 10);
char∙ temp3 = new char[];
strncpy(temp3, temp2, 2);
Ks[i] = atoi(temp3);
}
}
cout << "Генерирование ЦВЗ" << endl;
vector<bitset<8>> B1;
for (int i = 0; i < length; i++)
{
uchar temp = (uchar)text[i];
bitset<8>p((temp));
B1.push_back(p);
}
t1 = clock() - t1;
cout << "Время генерирования ЦВЗ: " << (double)t1 / CLOCKS_PER_SEC << " секунд" << endl;
int tau = 200;
double v = 0.05;
Mat CVZ(heigh, widt, CV_8UC1);
clock_t t2;
t2 = clock();
//генерация координат
for (int i = 0; i < length ∙ tau ∙ 8; i++)
{
int x = i / widt;
int y = i% widt;
for (int s = 0; s < 6; s++)
{
bitset<8>FSl(Ks[2 ∙ s]);
bitset<8>SSl(y);
bitset<8>summ;
summ = FSl ^ SSl;
int fsum = summ.to_ulong();
x = (x + fsum) % heigh;
bitset<8>FSl1(Ks[2 ∙ s + 1]);
bitset<8>SSl1(x);
bitset<8>summ1;
summ1 = FSl1^SSl1;
int fsum1 = summ1.to_ulong();
y = (y + fsum1) % widt;
}
int j = i / tau;
int k = j / 8;
int m = j % 8;
int aa = (2 ∙ B1[k][m] - 1)∙v∙image_gray.at<uchar>(x, y);
CVZ.at<uchar>(x, y) = abs(aa);
double a = Matvector[0].at<uchar>(x, y) + (2 ∙ B1[k][m] - 1)∙v∙image_gray.at<uchar>(x, y);
Matvector[0].at<uchar>(x, y) = (uchar)a;
if (Matvector[0].at<uchar>(x, y) > 255)
{
Matvector[0].at<uchar>(x, y) = 255;
}
if (Matvector[0].at<uchar>(x, y) < 0)
{
Matvector[0].at<uchar>(x, y) = 0;
}
}
t2 = clock() - t2;
clock_t tt2;
imwrite("KutterCVZ.tiff", CVZ);
namedWindow(" ЦВЗ", WINDOW_AUTOSIZE);
imshow(" ЦВЗ", CVZ);
waitKey(0);
destroyWindow("ЦВЗ");
tt2 = clock();
vector<Mat>Vec;
Vec.push_back(Matvector[0]);
Vec.push_back(Matvector[1]);
Vec.push_back(Matvector[2]);
Mat FResult(heigh, widt, CV_8UC3);
merge(Vec, FResult);
imwrite("mergedKutter.tiff", FResult);
tt2 = clock() - tt2;
t2 += tt2;
cout << "Время генерирования координат и встраивания ЦВЗ: " << (double)t2 / CLOCKS_PER_SEC << " секунд" << endl;
namedWindow("Изображение с ЦВЗ", WINDOW_AUTOSIZE);
imshow("Изображение с ЦВЗ", FResult);
waitKey(0);
destroyWindow("Изображение с ЦВЗ");
int md = MD(start, Matvector[0]);
double ad = AD(start, Matvector[0]);
double nad = NAD(start, Matvector[0]);
double mse = MSE(start, Matvector[0]);
double nmse = NMSE(start, Matvector[0]);
double snr = SNR(start, Matvector[0]);
double psnr = PSNR(start, Matvector[0]);
double If = IF(start, Matvector[0]);
cout << endl;
cout << "Показатели визуального искажения" << endl;
cout << "Максимальная разность значений пикселов: " << md << endl;
cout << "Средняя абсолютная разность значений пикселов: " << ad << endl;
cout << "Нормированная средняя абсолютная разность: " << nad << endl;
cout << "Отношение сигнал-шум: " << snr << endl;
cout << "Максимальное отношение сигнал-шум: " << psnr << endl;
cout << "Качество изображения: " << If ∙ 100 << "%" << endl;
int h1 = heigh;
int w1 = widt;
/∙FResult=Resize(FResult, widt, heigh);∙/
/∙FResult = Turn(FResult);∙/
/∙FResult=Gaussian(FResult);∙/
/∙FResult = Chetkost(FResult);∙/
/∙FResult = brightness(FResult);∙/
/∙FResult = Dark(FResult);∙/
/∙FResult = Erode(FResult);∙/
/∙FResult = CutRight(FResult, heigh, widt);∙/
/∙FResult = CutDown(FResult, heigh, widt);∙/
/∙FResult = JPEGComp(FResult);∙/
heigh = FResult.rows;
widt = FResult.cols;
//Извлечение ЦВЗ
cout << "Извлечение ЦВЗ" << endl;
clock_t t3;
t3 = clock();
Mat Matvector1[3];
vector<uchar> ocenka;
vector<uchar>real;
split(FResult, Matvector1);
vector<bitset<8>>gettext;//встроенное сообщение
for (int i = 0; i < length; i++)
{
bitset<8>temp;
gettext.push_back(temp);
}
int t = 0;
for (int i = 0; i < tau∙length ∙ 8; i++)
{
int x = i / w1;
int y = i% w1;
for (int s = 0; s < 6; s++)
{
bitset<8>FSl(Ks[2 ∙ s]);
bitset<8>SSl(y);
bitset<8>summ;
summ = FSl ^ SSl;
int fsum = (int)(summ.to_ulong());
x = (x + fsum) % h1;
bitset<8>FSl1(Ks[2 ∙ s + 1]);
bitset<8>SSl1(x);
bitset<8>summ1;
summ1 = FSl1^SSl1;
int fsum1 = (int)(summ1.to_ulong());
y = (y + fsum1) % w1;
}
int sigma = 3;//длина креста
int sigma1;
int sigma2;
int sigma3;
int sigma4;
if ((x >= sigma) && (x < heigh - sigma))
{
sigma1 = -sigma;
sigma2 = sigma;
}
if (x < sigma)
{
sigma1 = -x;
sigma2 = sigma;
}
if (x >= heigh - sigma)
{
sigma1 = -sigma;
sigma2 = heigh - x - 1;
}
if ((y >= sigma) && (y < widt - sigma))
{
sigma3 = -sigma;
sigma4 = sigma;
}
if (y < sigma)
{
sigma3 = -y;
sigma4 = sigma;
}
if (y >= widt - sigma)
{
sigma3 = -sigma;
sigma4 = widt - y - 1;
}
int gsum = 0;
int vsum = 0;
if ((x < heigh) && (y < widt))
{
for (int a = sigma1; a <= sigma2; a++)
{
vsum += Matvector1[0].at<uchar>(x + a, y);
}
for (int a = sigma3; a <= sigma4; a++)
{
gsum += Matvector1[0].at<uchar>(x, y + a);
}
uchar f = Matvector1[0].at<uchar>(x, y);
uchar m = (vsum + gsum - 2 ∙ Matvector1[0].at<uchar>(x, y)) / (sigma2 - sigma1 + sigma4 - sigma3);
ocenka.push_back(m);
real.push_back(Matvector1[0].at<uchar>(x, y));
}
t++;
if (t >= tau)
{
int sum = 0;
for (int ii = 0; ii < ocenka.size(); ii++)
{
sum += ocenka[ii] - real[ii];
}
double delta = 0.0;
delta = 1 / (double)ocenka.size()∙(double)sum;
ocenka.clear();
real.clear();
int j = i / tau;
int k = j / 8;
int m = j % 8;
if (delta <= 0)
{
gettext[k][m] = 0;
}
if (delta > 0)
{
gettext[k][m] = 1;
}
t = 0;
}
}
string Ftext;
cout << endl << endl;
for (int i = 0; i < length; i++)
{
unsigned long a = gettext[i].to_ulong();
uchar aa = a;
Ftext.push_back(aa);
}
t3 = clock() - t3;
cout << "Время извлечения ЦВЗ: " << (double)t3 / CLOCKS_PER_SEC << " секунд" << endl;
cout << "Исходное сообщение" << endl;
cout << Ftext << endl;
}
//Алгоритм Коха
void Kox(Mat Matvector[3], string text, int widt, int heigh, int contsize, int length)
{
Mat start(heigh, widt, CV_8UC1);
for (int i = 0; i < heigh; i++)
{
for (int j = 0; j < widt; j++)
{
start.at<uchar>(i, j) = Matvector[0].at<uchar>(i, j);
}
}
cout << "Генерирование ЦВЗ" << endl;
clock_t t1 = clock();
int N = 8;//размер блока
int Nc = contsize / (N∙N);
if (8 ∙ text.size() > Nc)
{