Диссертация 1 (1189900), страница 17
Текст из файла (страница 17)
dst.convertTo(dst3, CV_8UC3);
}
namedWindow("Cut", WINDOW_AUTOSIZE);
imshow("Cut", dst3);
waitKey(0);
destroyWindow("Cut");
return dst;
}
Mat CutDown(Mat src, int heigh, int widt)
{
src.convertTo(src, CV_32FC3, 1.0, 0.0);
int i, j;
int news = heigh*0.8;
Mat dst;
if (src.channels() == 3)
{
Mat dst1(news, widt, CV_32FC3);
for (i = 0; i < news; i++)
{
for (j = 0; j < widt * 3; j++)
{
dst1.at<float>(i, j) = src.at<float>(i, j);
}
}
dst = dst1;
}
if (src.channels() == 1)
{
Mat dst2(news, widt, CV_32FC1);
for (i = 0; i < news; i++)
{
Продолжение прил. Б
for (j = 0; j < widt * 3; j++)
{
dst2.at<float>(i, j) = src.at<float>(i, j);
}
}
dst = dst2;
}
Mat dst3;
if (dst.channels() == 1)
{
dst.convertTo(dst3, CV_8U);
}
if (dst.channels() == 3)
{
dst.convertTo(dst3, CV_8UC3);
}
namedWindow("Cut", WINDOW_AUTOSIZE);
imshow("Cut", dst3);
waitKey(0);
destroyWindow("Cut");
return dst;
}
Mat JPEGComp(Mat src)
{
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
int x;
cout << "Введите коэффициент сжатия в процентах" << endl;
cin >> x;
compression_params.push_back(x);
Mat src1;
Mat dst;
imwrite("Comp.jpg", src, compression_params);
dst = imread("Comp.jpg",CV_LOAD_IMAGE_COLOR);
Mat dst1;
if (dst.channels() == 1)
{
dst.convertTo(dst1, CV_8U);
}
if (src.channels() == 3)
{
dst.convertTo(dst1, CV_8UC3);
}
imshow("Comp.jpg", dst1);
waitKey(0);
destroyWindow("Comp.jpg");
return dst;
}
Mat Attack(Mat FResult, int heigh, int widt)
{
cout << endl << endl;
cout << "Моделирование атак на стегосистему" << endl;
int x;
cout << "Выберите атаку" << endl;
Продолжение прил. Б
cout << "1. Изменение размера изображения" << endl;
cout << "2. Поворот изображения" << endl;
cout << "3. Фильтры Гаусса " << endl;
cout << "4. Изменение контрастности изображения" << endl;
cout << "5. Увеличение яркости изображения" << endl;
cout << "6. Уменьшение яркости изображения" << endl;
cout << "7. Эрозия изображения" << endl;
cout << "8. Обрезание изображения справа " << endl;
cout << "9. Обрезание изображения снизу " << endl;
cout << "10. Сжатие в JPEG " << endl;
cout << endl;
cin >> x;
switch (x)
{
case 1:
cout << "Изменить размер изображения " << endl;
FResult = Resize(FResult, widt, heigh);
break;
case 2:
cout << "Повернуть изображение" << endl;
FResult = Turn(FResult);
break;
case 3:
cout << "Применить фильтры Гаусса" << endl;
FResult = Gaussian(FResult);
break;
case 4:
cout << "Увеличить контрастность изображения" << endl;
FResult = Chetkost(FResult);
break;
case 5:
cout << "Увеличить яркость изображения" << endl;
FResult = brightness(FResult);
break;
case 6:
cout << "Затемнить изображение" << endl;
FResult = Dark(FResult);
break;
case 7:
cout << "Провести эрозию изображения" << endl;
FResult = Erode(FResult);
break;
case 8:
cout << "Обрезать изображение справа" << endl;
FResult = CutRight(FResult, heigh, widt);
break;
case 9:
cout << "Обрезать изображение снизу" << endl;
FResult = CutDown(FResult, heigh, widt);
break;
case 10:
cout << "Сжать в JPEG" << endl;
FResult = JPEGComp(FResult);
break;
default:
cout << "Канал без атаки" << endl;
break;
Продолжение прил. Б
}
return FResult;
}
//Алгоритм Сангхави
void Sanghavi(Mat imag, string text)
{
int channels = imag.channels();
Mat image;
imag.convertTo(imag, CV_32F, 1.0, 0.0);
Mat Matvector[3];
Mat charimage;
int i, j,k;
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;
//Sanghavi 4 уровня
vector <Mat> L1, L2, L3, L4;
//генерирование ЦВЗ
vector<bitset<8>> B1;
int length = text.length();
uchar temp;
for (i = 0; i < length; i++)
{
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 (i = 0; i < CVZsize; i++)
{
for (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 = clock();
L1 = WaveletDec(image);
L2 = WaveletDec(L1[0]);
L3 = WaveletDec(L2[0]);
//встраивание ЦВЗ
int k1, km;
Mat array = L3[2].reshape(1, 1);
if (text.size() * 40 >= array.cols)
{
cout << "Изображение мало для встраивания" << endl;
int fg;
cin >> fg;
}
float max, min,temp1;
for (i = 0; i < length; i++)
{
for (j = 0; j < 8; j++)
{
k1 = (i * 8 + j) * 5;
km = k1;
max = array.at<float>(k1);
min = array.at<float>(k1);
if (B1[i][j] == 1)
{
for (k = k1 + 1; k < k1 + 5; k++)
{
if (array.at<float>(k) > max)
{
max = array.at<float>(k);
km = k;
}
}
}
if (B1[i][j] == 0)
{
for (k = k1 + 1; k < k1 + 5; k++)
{
if (array.at<float>(k) < min)
{
min = array.at<float>(k);
km = k;
}
}
}
temp1 = array.at<float>(k1);
array.at<float>(k1) = array.at<float>(km);
array.at<float>(km) = temp1;
Продолжение прил. Б
}
}
L3[2] = array.reshape(0, L3[1].rows);
//вейвлет-восстановление
vector <Mat>LR1, LR2, LR3, LR4;
Mat imr;
LR3 = L3;
Mat LL2 = WaveletRec(LR3, L2[0].rows, L2[0].cols);
LR2.push_back(LL2);
for (i = 1; i <= 3; i++)
{
LR2.push_back(L2[i]);
}
Mat LL1 = WaveletRec(LR2, L1[0].rows, L1[0].cols);
LR1.push_back(LL1);
for (i = 1; i <= 3; i++)
{
LR1.push_back(L1[i]);
}
imr = WaveletRec(LR1, rows, cols);
t1 = clock() - t1;
cout << "Время встраивания ЦВЗ: " << (double)t1 / CLOCKS_PER_SEC << " секунд" << endl;
Mat imrs;
imr.convertTo(imrs, CV_8U);
Mat FResult;
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 tt2 = clock();
vector <Mat> LI1, LI2, LI3, LI4;
LI1 = WaveletDec(imr);
LI2 = WaveletDec(LI1[0]);
LI3 = WaveletDec(LI2[0]);
//извлечение ЦВЗ
for (i = 0; i < length; i++)
{
bitset<8>t1;
for (j = 0; j < 8; j++)
{
t1[j] = 0;
}
B2.push_back(t1);
}
int c;
Mat Array = LI3[2].reshape(1, 1);
uchar t2;
for (i = 0; i < length; i++)
{
for (j = 0; j < 8; j++)
{
c = 0;
k1 = (i * 8 + j) * 5;
if (k1+4 >= Array.cols)
{
break;
}
for (k = 1; k < 5; k++)
{
if (Array.at<float>(k1) > Array.at<float>(k1 + k))
{
c++;
}
}
Продолжение прил. Б
if (c > 2)
{
B2[i][j] = 1;
}
if (c <= 2)
{
B2[i][j] = 0;
}
}
t2 = B2[i].to_ulong();
gettext.push_back(t2);
}
tt2 = clock() - tt2;
cout << "Время извлечения ЦВЗ: " << (double)tt2 / CLOCKS_PER_SEC << " секунд" << endl;
cout << gettext<<endl;
}
// Алгоритм квантования Сохейли
void Soheili(Mat imag, string text)
{
int Q; //шаг квантования
cout << "Введите шаг квантования" << endl;
cin >> Q;
int i, j,k;
int channels = imag.channels();
Mat image;
imag.convertTo(imag, CV_32F, 1.0, 0.0);
Mat Matvector[3];
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;
vector<bitset<8>> B1; //битовое сообщение
int length = text.length();
uchar temp;
for (i = 0; i < length; i++)
{
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 (i = 0; i < CVZsize; i++)
{
for (j = 0; j < CVZsize; j++)
Продолжение прил. Б
{