Диплом ЦВЗ (1221233), страница 17
Текст из файла (страница 17)
cout << "Изображение слишком мало для встраивания" << endl;
int fg;
cin >> fg;
}
//разбиение на сегменты
vector<Mat>coofs;
int c = 0;
int r = 0;
for (int i = 0; i < Nc; i++)
{
Mat C(N, N, CV_8UC1);
for (int j = 0; j < N; j++)
{
for (int 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 (int i = 0; i < N; i++)
{
for (int 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);
}
t1 = clock() - t1;
cout << "Время генерирования ЦВЗ: " << (double)t1 / CLOCKS_PER_SEC << " секунд" << endl;
//коэффициенты
int x1 = 4;
int y1 = 5;
int x2 = 5;
int y2 = 4;
double P = 1;//разность
//встраивание
cout << "Встраивание ЦВЗ" << endl;
clock_t t2 = clock();
vector<double∙∙> sigmaM;
sigmaM = sigma;
vector<bitset<8>> M;
for (int i = 0; i < length; i++)
{
uchar temp = (uchar)text[i];
bitset<8>m((temp));
M.push_back(m);
}
for (int j = 0; j < length; j++)
{
for (int 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];
}
}
double om1 = fabs(sigmas[x1][y1]);
double om2 = fabs(sigmas[x2][y2]);
double z1;
double z2;
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;
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++)
{
double summ = 0;
for (int i = 0; i < N; i++)
{
for (int 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));
}
}
double 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 (int i = 0; i < Nc; i++)
{
for (int j = 0; j < N; j++)
{
for (int 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;
for (int i = 0; i < Nc; i++)
{
for (int j = 0; j < N; j++)
{
for (int k = 0; k < N; k++)
{
double temp = (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);
imwrite("mergedKox.tiff", FResult);
t2 = clock() - t2;
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;
/∙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();
int Nc1 = widt∙heigh / (N∙N);
//разбиение на сегменты
vector<Mat>coofs1;
int ce = 0;
int re = 0;
for (int i = 0; i < Nc1; i++)
{
Mat C(N, N, CV_8UC1);
for (int j = 0; j < N; j++)
{
for (int k = 0; k < N; k++)
{
if ((ce + j < heigh) && (re + k < widt))
{
C.at<uchar>(j, k) = Matvector[0].at<uchar>(ce + j, re + k);
}
}
}
re += N;
if (re >= widt)
{
ce += N;
re = 0;
}
coofs1.push_back(C);
}
//дискретное косинусное преобразование
vector<double∙∙> Sigma1;
for (int b = 0; b < Nc1; 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 (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
summ += coofs1[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;
}
}
Sigma1.push_back(s);
}
int it = 0;
vector<uchar>finalcodes;
bitset<8>cod;
for (int k = 0; k < length ∙ 8; k++)
{
double om1 = fabs(Sigma1[k][x1][y1]);
double om2 = fabs(Sigma1[k][x2][y2]);
if (om1>om2)
{
cod[it] = 0;
}
if (om1 < om2)
{
cod[it] = 1;
}
if (it < 8)
{
it++;
}
if (it == 8)
{
it = 0;
finalcodes.push_back(cod.to_ulong());
bitset<8>cod;
}
}
string ftext;
for (int i = 0; i < length; i++)
{
ftext.push_back(finalcodes[i]);
}
t3 = clock() - t3;
cout << "Время извлечения ЦВЗ: " << (double)t3 / CLOCKS_PER_SEC << " секунд" << endl;
cout << "Исходное сообщение" << endl;
cout << ftext << endl;
}
//алгоритм Смита расширения спектра
void Smith(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∙∙ F = new int∙[heigh];//массив ортогональных базисных функций
for (int m = 0; m < heigh; m++)
{
int∙ si = new int[widt];
F[m] = si;
}
int d = -1;
for (int x = 0; x < heigh; x++)
{
d = -d;
for (int y = 0; y < widt; y++)
{
F[x][y] = d;
d = -d;
}
}
int Nf = 256;//количество базисных функций
int n1 = heigh / sqrt(Nf);
int n2 = widt / sqrt(Nf);
//Генерация ПСП(LFSR)
bitset<8> mu(212);
int s = 141;
int Rdec[256];
Rdec[0] = s;
bitset<8>Rbin(Rdec[0]);
for (int i = 1; i < Nf - 1; i++)
{
bitset<1>bit = 0;
for (int j = 0; j < 8; j++)
{
if (mu[j] == 1)
{
bit = Rbin[j] ^ bit[0];
}
}
bitset<8>R = Rbin;
Rbin[0] = bit[0];
for (int j = 1; j < 8; j++)
{
Rbin[j] = R[j - 1];
}
Rdec[i] = Rbin.to_ulong();
}
Rdec[Nf - 1] = 0;
vector<int∙∙>f;//вектор базисов
for (int i = 0; i < Nf; i++)
{
int∙∙ fi = new int∙[heigh];
for (int m = 0; m < heigh; m++)
{
int∙ si = new int[widt];
for (int k = 0; k < widt; k++)
{
si[k] = 0;
}
fi[m] = si;
}
f.push_back(fi);
}
int c1 = 0;
for (int i = 0; i < Nf; i++)
{
int r1 = (n2∙i) % widt;
int r2 = r1 + n2;
for (int i1 = 0; i1 < n1; i1++)
{
for (int i2 = 0; i2 < n2; i2++)
{
f[Rdec[i]][c1 + i1][r1 + i2] = F[c1 + i1][r1 + i2];
}
}
if (r2 >= widt)
{
c1 += n1;
}
}
vector<int>delta;//погрешность ортогональности
for (int i = 0; i < Nf; i++)
{
int del = 0;
for (int x = 0; x < heigh; x++)
{
for (int y = 0; y < widt; y++)
{
int acs = Matvector[0].at<uchar>(x, y);
del += f[i][x][y] ∙ Matvector[0].at<uchar>(x, y);
}
}
delta.push_back(del);
}
//модуляция
if (Nf < length ∙ 8)
{
cout << "Размер изображения недостаточен для встраивания текста" << endl;
int asd;
cin >> asd;
}
vector<int>mes;
for (int i = 0; i < length; i++)
{
uchar a = (uchar)text[i];
for (int j = 0; j < 8; j++)
{
int b = a % 2;
a /= 2;
mes.push_back(b);
}
}
for (int j = 0; j < length ∙ 8; j++)
{
if (mes[j] == 0)
{
mes[j] = -1;
}
}
int∙∙ E = new int∙[heigh];
for (int i = 0; i < heigh; i++)
{
int∙ e = new int[widt];
E[i] = e;
}
for (int x = 0; x < heigh; x++)
{
for (int y = 0; y < widt; y++)
{
int sum = 0;
for (int i = 0; i < length ∙ 8; i++)
{
sum += mes[i] ∙ f[i][x][y];
}
E[x][y] = sum;
}