Диссертация 1 (1189900), страница 18
Текст из файла (страница 18)
if (i*CVZsize + j < length * 8)
{
if (B1[(i*CVZsize + j) / 8][(i*CVZsize + j) % 8] == 0)
{
CVZ.at<uchar>(i, j) = 0;
}
if (B1[(i*CVZsize + j) / 8][(i*CVZsize + j) % 8] == 1)
{
CVZ.at<uchar>(i, j) = 255;
}
}
}
}
namedWindow(" ЦВЗ", WINDOW_AUTOSIZE);
imshow(" ЦВЗ", CVZ);
waitKey(0);
destroyWindow("ЦВЗ");
//вейвлет-разложение контейнера
clock_t t1 = clock();
vector< Mat > L1, L2;
L1 = WaveletDec(image);
L2 = WaveletDec(L1[0]);
Mat LL=L2[0].reshape(1, 1);
//разбиение на подблоки
int wsize = text.length() * 8;
int n = 2; //уровень разложения
int K = LL.cols / wsize/ (n*n);
Mat LL1 = LL;
int m; //множитель
//встраивание
for (k = 0; k < K; k++)
{
for (i = 0; i < text.length(); i++)
{
for (j = 0; j < 8; j++)
{
m = LL.at <float>(k*wsize+i*8+j) / Q;
if (B1[i][j] == 1)
{
if ((LL.at <float>(k*wsize + i * 8 + j) > m*Q) && (LL.at <float>(k*wsize + i * 8 + j) <= (m + 0.5)*Q))
{
LL1.at <float>(k*wsize + i * 8 + j) = m*Q;
}
if ((LL.at <float>(k*wsize + i * 8 + j) > (m+0.5)*Q) && (LL.at <float>(k*wsize + i * 8 + j) <= (m +1)*Q))
{
LL1.at <float>(k*wsize + i * 8 + j) = (m+1)*Q;
}
}
if (B1[i][j] == 0)
{
LL1.at <float>(k*wsize + i * 8 + j) = (m + 0.5)*Q;
}
Продолжение прил. Б
}
}
}
LL1 = LL1.reshape(1, L2[0].rows);
//вейвлет-восстановление
vector <Mat> IL1, IL2;
IL2.push_back(LL1);
for (int i = 1; i < 4; i++)
{
IL2.push_back(L2[i]);
}
Mat temp2 = WaveletRec(IL2, L1[0].rows,L1[0].cols);
IL1.push_back(temp2);
for (int i = 1; i < 4; i++)
{
IL1.push_back(L1[i]);
}
Mat RW = WaveletRec(IL1, image.rows, image.cols);
t1 = clock() - t1;
cout << "Время встраивания ЦВЗ: " << (double)t1 / CLOCKS_PER_SEC << " секунд" << endl;
Mat RWI;
RW.convertTo(RWI, CV_8U);
Mat FResult;
if (channels == 1) //чёрно-белое
{
namedWindow("Wavelet Reconstruction", 1);
imshow("Wavelet Reconstruction", RWI);
waitKey(0);
FResult = RW;
}
if (channels == 3) //цветное
{
vector<Mat>Vec;
Vec.push_back(RW);
Vec.push_back(Matvector[1]);
Vec.push_back(Matvector[2]);
merge(Vec, FResult);
Mat Fresult1;
FResult.convertTo(Fresult1, CV_8UC3);
namedWindow("Wavelet Reconstruction", 1);
imshow("Wavelet Reconstruction", Fresult1);
waitKey(0);
}
//проверка качества
int md = MD(charimage, RWI);
double ad = AD(charimage, RWI);
double nad = NAD(charimage, RWI);
double mse = MSE(charimage, RWI);
double nmse = NMSE(charimage, RWI);
double snr = SNR(charimage, RWI);
double psnr = PSNR(charimage, RWI);
double If = IF(charimage, RWI);
cout << endl;
cout << "Показатели визуального искажения" << endl;
cout << "Максимальная разность значений пикселов: " << md << endl;
cout << "Средняя абсолютная разность значений пикселов: " << ad << endl;
cout << "Нормированная средняя абсолютная разность: " << nad << endl;
Продолжение прил. Б
cout << "Отношение сигнал-шум: " << snr << endl;
cout << "Максимальное отношение сигнал-шум: " << psnr << endl;
cout << "Качество изображения: " << If * 100 << "%" << endl;
//моделирование атак
FResult = Attack(FResult, rows, cols);
rows = FResult.rows;
cols = FResult.cols;
if (channels == 1)
{
RW = FResult;
}
if (channels == 3)
{
split(FResult, Matvector);
Matvector[0].convertTo(RW, CV_32FC1, 1.0, 0.0);
}
//обратный ход
clock_t tt2 = clock();
vector <Mat> LW1, LW2, LW3;
LW1 = WaveletDec(RW);
LW2 = WaveletDec(LW1[0]);
LW2[0] =LW2[0].reshape(1, 1);
//извлечение ЦВЗ
vector <bitset<8>> B2;
for (k = 0; k < K; k++)
{
for (i = 0; i < text.length(); i++)
{
bitset<8> temp;
for (j = 0; j < 8; j++)
{
m = LW2[0].at <float>(k*wsize + i * 8 + j) / Q;
if ((LW2[0].at <float>(k*wsize + i * 8 + j) > (m+0.75)*Q) || (LW2[0].at <float>(k*wsize + i * 8 + j) <= (m + 0.25)*Q))
{
temp.at(j) = 1;
}
if ((LW2[0].at <float>(k*wsize + i * 8 + j) > (m + 0.25)*Q) && (LW2[0].at <float>(k*wsize + i * 8 + j) <= (m + 0.75)*Q))
{
temp.at(j) = 0;
}
}
B2.push_back(temp);
}
}
//анализ результатов
vector<int> summ (text.length() * 8);
for (k = 0; k < K; k++)
{
for (i = 0; i < text.length(); i++)
{
for (j = 0; j < 8; j++)
{
summ[i * 8 + j] += B2[k*text.length() + i][j];
}
}
}
Продолжение прил. Б
string gettext;
uchar t;
for (i = 0; i < text.length(); i++)
{
bitset<8>temp2;
for (j = 0; j < 8; j++)
{
if (summ[i * 8 + j] >= K / 2)
{
temp2[j] = 1;
}
else
{
temp2[j] = 0;
}
}
t = temp2.to_ulong();
gettext.push_back(t);
}
tt2 = clock() - tt2;
cout << "Время извлечения ЦВЗ: " << (double)tt2 / CLOCKS_PER_SEC << " секунд" << endl;
cout << gettext << endl;
}
//Алгоритм Коха
void Kox(Mat imag, string text)
{
double P; //шаг квантования
cout << "Введите порог разности" << endl;
cin >> P;
int i, j, k;
int channels = imag.channels();
int widt = imag.cols;
int heigh = imag.rows;
int contsize = widt*heigh;
int length = text.length();
Mat start(heigh,widt,CV_8UC1);
Mat Matvector[3];
if (channels == 1) //чёрно-белое изображение
{
start = imag;
}
if (channels == 3) //цветное изображение
{
split(imag, Matvector);
for (i = 0; i < heigh; i++)
{
for (j = 0; j < widt; j++)
{
start.at<uchar>(i, j) = Matvector[0].at<uchar>(i, j);
}
}
}
int N = 8;//размер блока
int Nc = contsize / (N*N);
if (8 * text.size() > Nc)
{
Продолжение прил. Б
cout << "Изображение слишком мало для встраивания" << endl;
int fg;
cin >> fg;
}
vector<bitset<8>> M;
uchar temp;
for (i = 0; i < length; i++)
{
temp = (uchar)text[i];
bitset<8>m((temp));
M.push_back(m);
}
cout << "Встраивание ЦВЗ" << endl;
clock_t t1 = clock();
//разбиение на сегменты
vector<Mat>coofs;
int c = 0;
int r = 0;
for (i = 0; i < Nc; i++)
{
Mat C(N, N, CV_8UC1);
for (j = 0; j < N; j++)
{
for (k = 0; k < N; k++)
{
if ((c + j < heigh) && (r + k < widt))
{
C.at<uchar>(j, k) = Matvector[0].at<uchar>(c + j, r + k);
}
}
}
r += N;
if (r >= widt)
{
c += N;
r = 0;
}
coofs.push_back(C);
}
//Вычисление коэффициентов ДКП
vector<double**> sigma;
for (int b = 0; b < Nc; b++)
{
double** s = new double*[N];
for (int m = 0; m < N; m++)
{
double* si = new double[N];
s[m] = si;
}
for (int v = 0; v < N; v++)
{
for (int v1 = 0; v1 < N; v1++)
{
double summ = 0;
for (i = 0; i < N; i++)
{
Продолжение прил. Б
for (j = 0; j < N; j++)
{
summ += coofs[b].at<uchar>(i, j)*cos(CV_PI*v * (2 * i + 1) / (2 * N))*cos(CV_PI*v1 * (2 * j + 1) / (2 * N));
}
}
double znach = (sigma1(v)*sigma1(v1) / (sqrt(2 * N)))*summ;
s[v][v1] = znach;
}
}
sigma.push_back(s);
}
//коэффициенты
int x1 = 4;
int y1 = 5;
int x2 = 5;
int y2 = 4;
//встраивание
vector<double**> sigmaM;
sigmaM = sigma;
double om1;
double om2;
double z1;
double z2;
for (j = 0; j < length; j++)
{
for (i = 0; i < N; i++)
{
double ** sigmas = new double*[N];
for (int m = 0; m < N; m++)
{
double* si = new double[N];
sigmas[m] = si;
}
for (int i1 = 0; i1 < N; i1++)
{
for (int i2 = 0; i2 < N; i2++)
{
sigmas[i1][i2] = sigma[N*j + i][i1][i2];
}
}
om1 = fabs(sigmas[x1][y1]);
om2 = fabs(sigmas[x2][y2]);
if (sigmas[x1][y1] >= 0)
{
z1 = 1;
}
if (sigmas[x1][y1] < 0)
{
z1 = -1;
}
Продолжение прил. Б
If (sigmas[x2][y2] >= 0)
{
z2 = 1;
}
if (sigmas[x2][y2] < 0)
{
z2 = -1;
}
if ((M[j][i] == 0) && (om1 - om2 <= P))
{
om1 = P / 2 + om2 + 1;
om2 -= P / 2;
}
if ((M[j][i] == 1) && (om1 - om2 >= -P))
{
om2 = P / 2 + om1 + 1;
om1 -= P / 2;
}
sigmas[x1][y1] = z1*om1;
sigmas[x2][y2] = z2*om2;
sigmaM[j * N + i] = sigmas;
}
}
//обратное ДКП
vector<double**>Cms;
double summ, znach;
for (int b = 0; b < Nc; b++)
{
double** s = new double*[N];
for (int m = 0; m < N; m++)
{
double* si = new double[N];
s[m] = si;
}
for (int x = 0; x < N; x++)
{
for (int y = 0; y < N; y++)
{
summ = 0;
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
summ += sigma1(i)*sigma1(j)*sigmaM[b][i][j] * cos(CV_PI*i * (2 * x + 1) / (2 * N))*cos(CV_PI*j * (2 * y + 1) / (2 * N));
}
}
znach = summ / (sqrt(2 * N));
s[x][y] = znach;
}
}
Cms.push_back(s);
Продолжение прил. Б
}
//нахождение минимума и максимума для нормировки
vector<double>max1;
vector<double>min1;
double maxv = Cms[0][0][0];
double minv = Cms[0][0][0];
for (i = 0; i < Nc; i++)
{
for (j = 0; j < N; j++)
{
for (k = 0; k < N; k++)
{
if (Cms[i][j][k]>maxv)
{
maxv = Cms[i][j][k];
}
if (Cms[i][j][k] < minv)
{
minv = Cms[i][j][k];
}
}
}
}
//нормировка и присвоение значений
int c1 = 0;
int r1 = 0;
double temp2;
for (i = 0; i < Nc; i++)
{
for (j = 0; j < N; j++)
{
for (k = 0; k < N; k++)
{
temp2 = (Cms[i][j][k] + minv) * 255 / (minv + maxv);
if ((c1 + j < heigh) && (r1 + k < widt))
{
Matvector[0].at<uchar>(c1 + j, r1 + k) = (uchar)temp;
}
}
}
r1 += N;
if (r1 >= widt)
{
c1 += N;
r1 = 0;
}
}
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);
t1 = clock() - t1;
cout << "Время встраивания ЦВЗ: " << (double)t1 / 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;
FResult = Attack(FResult, heigh, widt);
heigh = FResult.rows;
widt = FResult.cols;
//извлечение ЦВЗ
cout << "Извлечение ЦВЗ" << endl;
clock_t t2 = clock();
int Nc1 = widt*heigh / (N*N);
//разбиение на сегменты
vector<Mat>coofs1;
int ce = 0;