У меня есть два изображения (оригинальные и шумные). Я расчитываю PSNR. Я сделал это для цветных RGB-изображений, но я не знаю, как это сделать с оттенками серого. Поскольку я читаю, расчет MSE отличается. Для RGB я делаю это, как вы можете увидеть в следующий код (я использую Visual C#):Расчет MSE для изображений в оттенках серого
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);
Здесь я манипулируя с R, G, B из pixels.But я не знаю, что я должен взять в случае изображений в оттенках серого. Могу ли я использовать RGB, потому что он действительно дает некоторые результаты, или я должен взять что-то еще?
Этот ответ содержит много действительных точек, но предполагает, что исходное преобразование оттенков серого -> RGB, используемое .NET, присваивает равный вес компонентам R, G и B. Есть ли какие-либо документы по этому поводу? всегда считал, что он использует некоторое распределение, сохраняющее яркость, как Y = 0.2126 R + 0.7152 G + 0.0722 B. Без учета происхождения распределения RGB вы все же можете утверждать, что яркость - лучший подход к PSNR в изображениях в оттенках серого. –
Фактически, единственное различие заключается в том, что вы перемещаете RGB перед преобразованием в серый. метод, который я применил, действительно немного наивен. если вам нужна яркость, тогда вы хотите «int gray = (int) (R * 0.3 + G * 0.59 + B * 0.11)» (отредактирован ответ) –
Оглядываясь назад, мой комментарий о преобразовании .NET grayscale -> RGB - действительно, ковер. Я оставлю его там как постоянный знак стыда. :) –