Диссертация 1 (1189900), страница 19
Текст из файла (страница 19)
int re = 0;
for (i = 0; i < Nc1; i++)
{
Mat C(N, N, CV_8UC1);
for (j = 0; j < N; j++)
{
for (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++)
{
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));
}
}
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 (k = 0; k < length * 8; k++)
{
om1 = fabs(Sigma1[k][x1][y1]);
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 (i = 0; i < length; i++)
{
ftext.push_back(finalcodes[i]);
}
t2 = clock() - t2;
cout << "Время извлечения ЦВЗ: " << (double)t2 / CLOCKS_PER_SEC << " секунд" << endl;
cout << "Исходное сообщение" << endl;
cout << ftext << endl;
}
//собственная схема
void Proposed(Mat imag, string text)
{
double P; //шаг квантования
cout << "Введите порог разности" << endl;
cin >> P;
int channels = imag.channels();
Mat image;
Mat Matvector[3];
imag.convertTo(imag, CV_32F, 1.0, 0.0);
Mat charimage;
if (channels == 1) //чёрно-белое изображение
{
image = imag;
image.convertTo(charimage, CV_8U);
}
if (channels == 3) //цветное изображение
{
split(imag, Matvector);
image = Matvector[0];//встраивание в синюю компоненту
image.convertTo(charimage, CV_8U);
}
int rows = image.rows;
int cols = image.cols;
int N = 4;//размер блока
vector <Mat> L1, L2, L3;
vector<bitset<8>> B1;
int length = text.length();
for (int i = 0; i < length; i++)
{
uchar temp = (uchar)text[i];
bitset<8>p((temp));
B1.push_back(p);
}
int CVZsize = ceil(sqrt(length * 8));
Mat CVZ(CVZsize, CVZsize, CV_8U);
for (int i = 0; i < CVZsize; i++)
Продолжение прил. Б
{
for (int j = 0; j < CVZsize; j++)
{
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;
t1 = clock();*/
LARGE_INTEGER frequency;
LARGE_INTEGER t1, t2,t3,t4;
double elapsedTime;
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&t1);
L1 = WaveletDec(image);
int N1 = L1[0].rows / N;
int N2 = L1[0].cols / N;
if (8 * text.size() > N1*N2)
{
cout << "Изображение слишком мало для встраивания" << endl;
int fg;
cin >> fg;
}
//разбиение на сегменты и встраивание
//коэффициенты блоков, в которые ведется встраивание
cout << "Встраивание ЦВЗ" << endl;
int x1 = 2;
int y1 = 3;
int x2 = 3;
int y2 = 2;
double k1, k2;
int it = 0;
for (int i = 0; i < N1; i++)
{
if (i > 0)
{
y1 += N;
y2 += N;
x1 = 1;
x2 = 0;
}
for (int j = 0; j < N2; j++)
{
it++;
if (it >= text.size() * 8)
Продолжение прил. Б
{
break;
}
if (j > 0)
{
x1 += N;
x2 += N;
}
k1 = fabs(L1[0].at<float>(y1, x1));
k2 = fabs(L1[0].at<float>(y2, x2));
double z1;
double z2;
if (L1[0].at<float>(y1, x1) >= 0)
{
z1 = 1;
}
if (L1[0].at<float>(y1, x1) < 0)
{
z1 = -1;
}
if (L1[0].at<float>(y2, x2) >= 0)
{
z2 = 1;
}
if (L1[0].at<float>(y2, x2) < 0)
{
z2 = -1;
}
if ((B1[(i*N2 + j) / 8][(i*N2 + j) % 8] == 0) && (k1 - k2 <= P))
{
k1 = P / 2 + k2 + 1;
k2 -= P / 2;
}
if ((B1[(i*N2 + j) / 8][(i*N2 + j) % 8] == 1) && (k1 - k2 >= -P))
{
k2 = P / 2 + k1 + 1;
k1 -= P / 2;
}
L1[0].at<float>(y1, x1) = z1*k1;
L1[0].at<float>(y2, x2) = z2*k2;
}
}
//вейвлет-восстановление
vector <Mat>LR1;
Mat imr;
LR1 = L1;
imr = WaveletRec(LR1, rows, cols);
QueryPerformanceCounter(&t2);
elapsedTime = (float)(t2.QuadPart - t1.QuadPart) / frequency.QuadPart;
/*t1 = clock() - t1;*/
cout << "Время встраивания ЦВЗ: " << elapsedTime<< " секунд" << endl;
Mat imrs;
imr.convertTo(imrs, CV_8U);
Mat FResult(rows, cols, CV_32FC3);
if (channels == 1)
{
namedWindow("Wavelet Reconstruction", 1);
imshow("Wavelet Reconstruction", imrs);
waitKey(0);
Продолжение прил. Б
FResult = imr;
}
if (channels == 3)
{
vector<Mat>Vec;
Vec.push_back(imr);
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, imrs);
double ad = AD(charimage, imrs);
double nad = NAD(charimage, imrs);
double mse = MSE(charimage, imrs);
double nmse = NMSE(charimage, imrs);
double snr = SNR(charimage, imrs);
double psnr = PSNR(charimage, imrs);
double If = IF(charimage, imrs);
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)
{
imr = FResult;
}
if (channels == 3)
{
split(FResult, Matvector);
Matvector[0].convertTo(imr, CV_32FC1, 1.0, 0.0);
}
//обратный ход
string gettext;
vector<bitset<8>> B2;
//вейвлет-разложение
/*clock_t t2 = clock();*/
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&t1);
vector <Mat> LI1;
LI1 = WaveletDec(imr);
//извлечение ЦВЗ
for (int i = 0; i < length; i++)
{
bitset<8>t1;
for (int j = 0; j < 8; j++)
Продолжение прил. Б
{
t1[j] = 0;
}
B2.push_back(t1);
}
////коэффициенты
x1 = 2;
y1 = 3;
x2 = 3;
y2 = 2;
it = 0;
N1 = LI1[0].rows / N;
N2 = LI1[0].cols / N;
for (int i = 0; i < N1; i++)
{
if ((y1 >= LI1[0].rows) || (y2 >= LI1[0].rows))
{
break;
}
if (i > 0)
{
y1 += N;
y2 += N;
x1 = 1;
x2 = 0;
}
for (int j = 0; j < N2; j++)
{
it++;
if (j > 0)
{
x1 += N;
x2 += N;
}
if (it >= text.size() * 8)
{
break;
}
if ((x1 >= LI1[0].cols) || (x2 >= LI1[0].cols))
{
break;
}
k1 = fabs(LI1[0].at<float>(y1, x1));
k2 = fabs(LI1[0].at<float>(y2, x2));
double z1;
double z2;
if (LI1[0].at<float>(y1, x1) >= 0)
{
z1 = 1;
}
if (LI1[0].at<float>(y1, x1) < 0)
{
z1 = -1;
}
if (LI1[0].at<float>(y2, x2) >= 0)
{
z2 = 1;
}
Продолжение прил. Б
if (LI1[0].at<float>(y2, x2) < 0)
{
z2 = -1;
}
if (k1 - k2 > P)
{
B2[(i*N2 + j) / 8][(i*N2 + j) % 8] = 0;
}
if (k1 - k2 < -P)
{
B2[(i*N2 + j) / 8][(i*N2 + j) % 8] = 1;
}
}
}
/*t2 = clock() - t2;*/
QueryPerformanceCounter(&t2);
elapsedTime = (float)(t2.QuadPart - t1.QuadPart) / frequency.QuadPart;
cout << "Время извлечения ЦВЗ: " << elapsedTime << " секунд" << endl;
uchar s;
for (int i = 0; i < text.size(); i++)
{
s = B2[i].to_ulong();
gettext.push_back(s);
}
cout << gettext << endl;
}
int main()
{
setlocale(LC_ALL, "Russian");
cout << "Программный комплекс, реализующий алгоритмы генерирования и встраивания ЦВЗ в изображения, а также методы их сравнения" << endl;
cout << "Исследование проведено в рамках магистерской диссертации.2017" << endl;
cout << "Введите путь до текстового файла" << endl;
char* textfile = new char[];
cin >> textfile;
std::ifstream a(textfile);
string text;
a.seekg(0, ios_base::end);
text.resize(a.tellg());
a.seekg(0, ios_base::beg);
a.read((char*)text.data(), text.size());
a.close();
cout << text << endl<<endl;
cout << "Введите путь до изображения" << endl;
string filename;
cin >> filename;
Mat image=imread (filename,CV_LOAD_IMAGE_COLOR);
imshow("image", image);
waitKey(0); // key press to close window
//Menu
cout << "Главное меню для выбора метода генерирования и встраивания ЦВЗ" << endl;
int x;
cout << "Выберите метод" << endl;
cout << "1. Собственный алгоритм" << endl;
cout << "2.Алгоритм Коха" << endl;
cout << "3.Алгоритм Сангхави" << endl;
Продолжение прил. Б
cout << "4.Алгоритм Сохейли" << endl;
cout << endl;
cin >> x;
switch (x)
{
//предлагаемый алгоритм
case 1:
cout << "Выбран собственный алгоритм " << endl;
Proposed(image,text);
break;
//Алгоритм Коха
case 2:
cout << "Выбран алгоритм Коха" << endl;
Kox(image,text);
break;
case 3:
cout << "Выбран алгоритм Сангхави" << endl;
Sanghavi(image,text);
break;
case 4:
cout << "Выбран алгоритм Сохейли" << endl;
Soheili(image,text);
break;
default:
cout << "Алгоритм не был выбран" << endl;
break;
}
int z;
cin >> z;
return 0;
}