Зразок роботи
Приложение решает следующие задачи:
— запрос имени файла с изображением у пользователя;
— загрузка файла с изображением;
— уменьшение изображения в 2 раза методом INTER_AREA;
— восстановление изображения (обратное увеличение в 2 раза) с использованием всех доступных методов интерполяции;
— определение качества восстановления для каждого из методов интерполяции с использованием метрик PSNR и MSSIM;
— вывод результатов.
Рассмотрим реализацию каждой из задач подробней.
Запрос имени файла с изображением у пользователя
string file_name;
cout << "File to open: ";
getline (cin, file_name);
Загрузка файла с изображением
Учитывая ряд проблем, которые могут возникнуть при обработке файла с изображением, его загрузка и считывание в объект Mat производится в блоке try-catch
Mat original;
try
{
original = imread(file_name, IMREAD_COLOR); // Read the file
namedWindow("Source image", WINDOW_AUTOSIZE);// Create a window for display
imshow("Source image", original); // Show source image
}
catch (Exception& e)
{
const char* err_msg = e.what();
cout << "Open file exception caught: " << err_msg << endl;
waitKey(0);
return 1;
}
Уменьшение изображения в 2 раза
Согласно документации OpenCV для уменьшения изображений предпочтительным является метод интерполяции INTER_AREA [37].
Mat src;
resize (original, src, Size(), 0.5, 0.5, INTER_AREA);
namedWindow("Reduced image", WINDOW_AUTOSIZE);
imshow("Reduced image", src);
Восстановление изображения c использованием всех доступных методов интерполяции
Для билинейной интерполяции:
Mat bilinear;
resize (src, bilinear, original.size(), 0, 0, INTER_LINEAR);
namedWindow("Bilinear interpolation", WINDOW_AUTOSIZE);
imshow("Bilinear interpolation", bilinear);
method[0] = "bilinear";
psnr[0] = getPSNR (original, bilinear);
mssim[0] = getMSSIM (original, bilinear);
для других методов – аналогично.
Определение качества восстановления для каждого из методов интерполяции с использованием метрик PSNR и MSSIM
Для сохранения результатов по каждому из методов используем массивы
double psnr[5];
Scalar mssim[5];
Вывод результатов
printf ("Method \tPSNR, dB\tMSSIM:R,%%\tG,%%\tB,%%\n");
printf ("___________________________________________________________________\n");
for (int i = 0; i<5; i++)
{
if (psnr[i] == -1.0)
mssim[i].val[0] = mssim[i].val[1] = mssim[i].val[2] = 0.0;
printf("%s \t %.3lf\t\t %.1lf\t %.1lf\t %.1lf\n", method[i].c_str(), psnr[i], mssim[i].val[2]*100,
mssim[i].val[1]*100, mssim[i].val[0]*100);
}
Таким образом, приложение выполняет все поставленные задачи.