Диссертация 1 (1189900), страница 16
Текст из файла (страница 16)
{
sum1 = 0;
Продолжение прил. Б
sum2 = 0;
if (i == 0)
{
sum1 = Wave.at<float>(i)*c0 + Wave.at<float>(i + 1)*c7 + Wave.at<float>(size - 6)*c6 + Wave.at<float>(size - 5)*c1 + Wave.at<float>(size - 4)*c4 + Wave.at<float>(size - 3)*c3 + Wave.at<float>(size - 2)*c2 + Wave.at<float>(size - 1)*c5;
sum2 = Wave.at<float>(i)*c1 - c6*Wave.at<float>(i + 1) + c7*Wave.at<float>(size - 6) - c0*Wave.at<float>(size - 5) + c5*Wave.at<float>(size - 4) - c2*Wave.at<float>(size - 3) + c3*Wave.at<float>(size - 2) - c4*Wave.at<float>(size - 1);
}
if (i == 2)
{
sum1 = Wave.at<float>(i-2)*c2 + Wave.at<float>(i-1)*c5 + Wave.at<float>(i)*c0 + Wave.at<float>(i + 1)*c7 + Wave.at<float>(size -4)*c6 + Wave.at<float>(size - 3)*c1 + Wave.at<float>(size - 2)*c4 + Wave.at<float>(size - 1)*c3;
sum2 = Wave.at<float>(i-2)*c3 - c4*Wave.at<float>(i -1) + c1*Wave.at<float>(i) - c6*Wave.at<float>(i+1) + c7*Wave.at<float>(size - 4) - c0*Wave.at<float>(size - 3) + c5*Wave.at<float>(size - 2) - c2*Wave.at<float>(size - 1);
}
if (i == 4)
{
sum1 = Wave.at<float>(i-4)*c4 + Wave.at<float>(i -3)*c3 + Wave.at<float>(i-2)*c2 + Wave.at<float>(i-1)*c5 + Wave.at<float>(i)*c0 + Wave.at<float>(i+1)*c7 + Wave.at<float>(size - 2)*c6 + Wave.at<float>(size - 1)*c1;
sum2 = Wave.at<float>(i)*c5 - c2*Wave.at<float>(i + 1) + c3*Wave.at<float>(i + 2) - c4*Wave.at<float>(i + 3) + c1*Wave.at<float>(i+4) - c6*Wave.at<float>(i+5) + c7*Wave.at<float>(size - 2) - c0*Wave.at<float>(size - 1);
}
if (i >=6)
{
sum1 = Wave.at<float>(i-6)*c6 + Wave.at<float>(i -5)*c1 + Wave.at<float>(i-4)*c4 + Wave.at<float>(i-3)*c3 + Wave.at<float>(i-2)*c2 + Wave.at<float>(i-1)*c5 + Wave.at<float>(i)*c0 + Wave.at<float>(i+1)*c7;
sum2 = Wave.at<float>(i-6)*c7 - c0*Wave.at<float>(i-5) + c5*Wave.at<float>(i-4) - c2*Wave.at<float>(i-3) + c3*Wave.at<float>(i-2) - c4*Wave.at<float>(i-1) + c1*Wave.at<float>(i) - c6*Wave.at<float>(i+1);
}
result.at<float>(i) = sum1*c;
result.at<float>(i + 1) = sum2*c;
}
result = result.reshape(1, rows);
return result;
}
double sigma1(int x) //вспомогательная функция для алгоритма Коха
{
double sigma;
if (x == 0)
{
Продолжение прил. Б
sigma = 1 / sqrt(2);
}
if (x > 0)
{
sigma = 1;
}
return sigma;
}
//показатели визуальных искажений
int MD(Mat cont, Mat stego)//максимальная разность
{
int max = abs(cont.at<uchar>(0, 0) - stego.at<uchar>(0, 0));
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
int md = abs(cont.at<uchar>(i, j) - stego.at<uchar>(i, j));
if (md>max)
{
max = md;
}
}
}
return max;
}
double AD(Mat cont, Mat stego)//средняя абсолютная разность
{
double sum = 0;
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum += abs(cont.at<uchar>(i, j) - stego.at<uchar>(i, j));
}
}
double ad = sum / (cont.rows*cont.cols);
return ad;
}
double NAD(Mat cont, Mat stego)//нормированная средняя абсолютная разность
{
double sum1 = 0;
double sum2 = 0;
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum1 += abs(cont.at<uchar>(i, j) - stego.at<uchar>(i, j));
sum2 += cont.at<uchar>(i, j);
}
}
double nad = sum1 / sum2;
return nad;
Продолжение прил. Б
}
double MSE(Mat cont, Mat stego)//среднеквадратическая ошибка
{
double sum = 0;
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum += pow(cont.at<uchar>(i, j) - stego.at<uchar>(i, j), 2);
}
}
double mse = sum / (cont.rows*cont.cols);
return mse;
}
double NMSE(Mat cont, Mat stego)//нормированная среднеквадратическая ошибка
{
double sum1 = 0;
double sum2 = 0;
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum1 += pow(cont.at<uchar>(i, j) - stego.at<uchar>(i, j), 2);
sum2 += pow(cont.at<uchar>(i, j), 2);
}
}
double nmse = sum1 / sum2;
return nmse;
}
double SNR(Mat cont, Mat stego)//отношение "сигнал-шум"
{
double sum1 = 0;
double sum2 = 0;
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum1 += pow(cont.at<uchar>(i, j) - stego.at<uchar>(i, j), 2);
sum2 += pow(cont.at<uchar>(i, j), 2);
}
}
double snr = sum2 / sum1;
return snr;
}
double PSNR(Mat cont, Mat stego)//максимальное отношение "сигнал-шум"
{
double sum1 = 0;
int max = cont.at<uchar>(0, 0);
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum1 += pow(cont.at<uchar>(i, j) - stego.at<uchar>(i, j), 2);
int ps = cont.at<uchar>(i, j);
if (max < ps)
Продолжение прил. Б
{
max = ps;
}
}
}
double psnr = cont.rows*cont.cols * pow(max, 2) / sum1;
return psnr;
}
double IF(Mat cont, Mat stego)//качество изображения
{
double sum1 = 0;
double sum2 = 0;
for (int i = 0; i < cont.rows; i++)
{
for (int j = 0; j < cont.cols; j++)
{
sum1 += pow(cont.at<uchar>(i, j) - stego.at<uchar>(i, j), 2);
sum2 += pow(cont.at<uchar>(i, j), 2);
}
}
double if1 = 1 - (sum1 / sum2);
return if1;
}
//функции тестов
Mat Turn(Mat src)//поворот на 60 градусов
{
Mat dst = Mat::zeros(src.rows, src.cols, src.type());
Mat rot_mat(2, 3, CV_32FC1);
Point center = Point(src.rows / 2, src.cols / 2);
double angle = -90.0;
double scale = 1;
rot_mat = getRotationMatrix2D(center, angle, scale);
warpAffine(src, dst, rot_mat, dst.size());//преобразование поворотом
namedWindow("Turned", WINDOW_AUTOSIZE);
Mat dst1;
if (dst.channels() == 1)
{
dst.convertTo(dst1, CV_8U);
}
if (dst.channels() == 3)
{
dst.convertTo(dst1, CV_8UC3);
}
imshow("Turned", dst1);
waitKey(0);
destroyWindow("Turned");
return dst;
}
Mat Resize(Mat src, int heigh, int widt)//изменение размера
{
Mat dst;
Продолжение прил. Б
resize(src, dst, Size(), 0.5, 0.5, CV_INTER_AREA);//уменьшаем размер в 2 раза
heigh = heigh / 2;
widt = widt / 2;
Mat dst1;
if (dst.channels() == 1)
{
dst.convertTo(dst1, CV_8U);
}
if (dst.channels() == 3)
{
dst.convertTo(dst1, CV_8UC3);
}
namedWindow("Resized", WINDOW_AUTOSIZE);
imshow("Resized", dst1);
waitKey(0);
destroyWindow("Resized");
return dst;
}
Mat Gaussian(Mat src)//сглаживание при помощи функции Гаусса
{
Mat dst;
GaussianBlur(src, dst, Size(3, 3), 0, 0);
Mat dst1;
if (dst.channels() == 1)
{
dst.convertTo(dst1, CV_8U);
}
if (dst.channels() == 3)
{
dst.convertTo(dst1, CV_8UC3);
}
namedWindow("Gauss", WINDOW_AUTOSIZE);
imshow("Gauss", dst1);
waitKey(0);
destroyWindow("Gauss");
return dst;
}
Mat Chetkost(Mat src)//повышение чёткости
{
Mat dst;
float kernel[9];
kernel[0] = -0.1;
kernel[1] = -0.1;
kernel[2] = -0.1;
kernel[3] = -0.1;
kernel[4] = 2;
kernel[5] = -0.1;
kernel[6] = -0.1;
kernel[7] = -0.1;
kernel[8] = -0.1;
Mat kernel_matrix(3, 3, CV_32FC1, kernel);
filter2D(src, dst, -1, kernel_matrix, Point(-1, 1), 0, BORDER_DEFAULT);
Mat dst1;
if (dst.channels() == 1)
{
Продолжение прил. Б
dst.convertTo(dst1, CV_8U);
}
if (dst.channels() == 3)
{
dst.convertTo(dst1, CV_8UC3);
}
namedWindow("Chetkost", WINDOW_AUTOSIZE);
imshow("Chetkost", dst1);
waitKey(0);
destroyWindow("Chetkost");
return dst;
}
Mat brightness(Mat src)//увеличение яркости
{
Mat dst;
float kernel[9];
kernel[0] = -0.1;
kernel[1] = 0.2;
kernel[2] = -0.1;
kernel[3] = 0.2;
kernel[4] = 3;
kernel[5] = 0.2;
kernel[6] = -0.1;
kernel[7] = 0.2;
kernel[8] = -0.1;
Mat kernel_matrix(3, 3, CV_32FC1, kernel);
filter2D(src, dst, -1, kernel_matrix, Point(-1, 1), 0, BORDER_DEFAULT);
Mat dst1;
if (dst.channels() == 1)
{
dst.convertTo(dst1, CV_8U);
}
if (dst.channels() == 3)
{
dst.convertTo(dst1, CV_8UC3);
}
namedWindow("Bright", WINDOW_AUTOSIZE);
imshow("Bright", dst1);
waitKey(0);
destroyWindow("Bright");
return dst;
}
Mat Dark(Mat src)//уменьшение яркости
{
Mat dst;
float kernel[9];
kernel[0] = -0.1;
kernel[1] = 0.1;
kernel[2] = -0.1;
kernel[3] = 0.1;
kernel[4] = 0.5;
Продолжение прил. Б
kernel[5] = 0.1;
kernel[6] = -0.1;
kernel[7] = 0.1;
kernel[8] = -0.1;
Mat kernel_matrix(3, 3, CV_32FC1, kernel);
filter2D(src, dst, -1, kernel_matrix, Point(-1, 1), 0, BORDER_DEFAULT);
Mat dst1;
if (dst.channels() == 1)
{
dst.convertTo(dst1, CV_8U);
}
if (dst.channels() == 3)
{
dst.convertTo(dst1, CV_8UC3);
}
namedWindow("Dark", WINDOW_AUTOSIZE);
imshow("Dark", dst1);
waitKey(0);
destroyWindow("Dark");
return dst;
}
Mat Erode(Mat src)
{
Mat dst;
int radius = 3;
Mat element = getStructuringElement(MORPH_ELLIPSE, cv::Size(2 * radius + 1, 2 * radius + 1), cv::Point(radius, radius));
erode(src, dst, element);
Mat dst1;
if (dst.channels() == 1)
{
dst.convertTo(dst1, CV_8U);
}
if (dst.channels() == 3)
{
dst.convertTo(dst1, CV_8UC3);
}
namedWindow("Erode", WINDOW_AUTOSIZE);
imshow("Erode", dst1);
waitKey(0);
destroyWindow("Erode");
return dst;
}
Mat CutRight(Mat src, int heigh, int widt)
{
src.convertTo(src, CV_32FC3, 1.0, 0.0);
int i, j;
int news = widt*0.8;
Mat dst;
if (src.channels() == 3)
{
Mat dst1(heigh, news, CV_32FC3);
for (i = 0; i < heigh; i++)
{
Продолжение прил. Б
for (j = 0; j < news * 3; j++)
{
dst1.at<float>(i, j) = src.at<float>(i, j);
}
}
dst = dst1;
}
if (src.channels() == 1)
{
Mat dst2(heigh, news, CV_32FC1);
for (i = 0; i < heigh; i++)
{
for (j = 0; j < news; 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)
{