作者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