作者m24 (m24)
看板C_Sharp
标题[问题]影像处理PSNR
时间Thu Nov 22 14:53:35 2012
我想确认我的PSNR是否正确。
所以我以WIKI的图来做测试
http://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio
他的Q=10, PSNR 31.45dB
因此我以此张做为测试图,算出结果如下
宽为320的PSNR=25.0154
宽为640的PSNR=25.61
宽为800的PSNR=25.99
宽为1024的PSNR=26.575
宽为1280的PSNR=27.044
宽为2028的PSNR=28.88289
...就是没有一个是31.45dB
以下为主要程式(我不太会排版):
--------------------------
private void button2_Click(object sender, EventArgs e) {
double se = 0;
OpenFileDialog openFileDialog2 = new OpenFileDialog();
openFileDialog2.InitialDirectory = "d:\\CODE\\images\\";
if (openFileDialog2.ShowDialog() == DialogResult.OK) {
ImageForm MyImage =
new ImageForm(openFileDialog2.FileName);//create object
pictureBox2.Image =
Image.FromFile(openFileDialog2.FileName);
CurrentImage2 = MyImage;
}
if (CurrentImage1 != null) {
int[, ,] rgbData1 = CurrentImage1.getRGBData();//GEG rgb MATRIX
int[, ,] rgbData2 = CurrentImage2.getRGBData();
if (rgbData1.GetLength(1) == rgbData2.GetLength(1)
&& rgbData1.GetLength(0) == rgbData2.GetLength(0)) {
int h = rgbData1.GetLength(1);//goat:768
int w = rgbData1.GetLength(0);//goat:1024
for (int k = 0; k < 3; k++) {
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
se = se +
(rgbData1[x, y, k] - rgbData2[x, y, k]) *
(rgbData1[x, y, k] - rgbData2[x, y, k]);
}
}
}
double psnr, mse;
mse = (double)se / ((double)h * (double)w * 3);
psnr = 10 * (Math.Log10(255 * 255 / mse));
lblPSNR.Text = psnr.ToString();
} else {
MessageBox.Show("请载入正确图形");
}
} else {
MessageBox.Show("请先载入图形");
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.249.32.1
1F:推 rainbow001:MAX代错?2^bit-1.... 11/22 16:51
2F:→ m24:那不是2^8-1=256-1=255麽? 11/22 17:16
3F:→ rainbow001:你有是过单纯算一种颜色吗? 11/22 17:23
4F:→ rainbow001: ^试 11/22 17:24
5F:→ rainbow001:原图为32bit PNG,不知道c#读出来会不会有差异? 11/22 17:38
6F:→ m24:我用scilab取出图中的最大值,结果是255。但VS中的C#我还试 11/22 17:56
7F:→ m24:那我是要用2^32-1麽? 11/22 17:58
8F:→ m24:我明天再用好了。 11/22 17:59