Mextrom
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору LuckyStrike Я пробовал делать так Код: using System; using System.Drawing; namespace PSNR { class Program { static void Main(string[] args) { string path1 = "d:/downloads/PSNR-example-base.png"; string path2 = "d:/downloads/PSNR-example-comp-30.jpg"; string path3 = "d:/downloads/PSNR-example-comp-90.jpg"; Bitmap bmp1 = (Bitmap)Bitmap.FromFile(path1); Bitmap bmp2 = (Bitmap)Bitmap.FromFile(path2); Bitmap bmp3 = (Bitmap)Bitmap.FromFile(path3); Console.WriteLine(CalcPSNR(bmp1, bmp1)); // должна получиться бесконечность Console.WriteLine(CalcPSNR(bmp1, bmp2)); Console.WriteLine(CalcPSNR(bmp1, bmp3)); } private static double CalcMSE(Bitmap bmp1, Bitmap bmp2) { double mse = 0; double mseR = 0; double mseG = 0; double mseB = 0; for (int i = 0; i < bmp1.Width; i++) { for (int j = 0; j < bmp1.Height; j++) { mseR += Math.Pow(bmp1.GetPixel(i, j).R - bmp2.GetPixel(i, j).R, 2); mseG += Math.Pow(bmp1.GetPixel(i, j).G - bmp2.GetPixel(i, j).G, 2); mseB += Math.Pow(bmp1.GetPixel(i, j).B - bmp2.GetPixel(i, j).B, 2); } } mse = (mseR + mseG + mseB) / ((bmp1.Width * bmp1.Height) * 3); return mse; } private static double CalcPSNR(Bitmap bmp1, Bitmap bmp2) { double max = Bitmap.GetPixelFormatSize(bmp1.PixelFormat); double psnr = 20.0 * Math.Log10(max / Math.Sqrt(CalcMSE(bmp1, bmp2))); return psnr; } } } | Картинки брал всё из той же статьи (английский вариант). Но у меня есть сомнения насчёт правильности алгоритма, т.к. результаты не совпали с числами в статье. Плюс к этому, я не знаю, каким брать max при различной глубине цвета изображений (при сравнении png (исходное изображение) и jpg (сжатое изображение), например). |