2011-03-21 72 views
0
a=imread('pic1.jpg'); 
b=0.25*a; 
c=4.0*b; 
figure; 
imshow(c); 
MSE = reshape(mean(mean(((a) - (c)).^2,2),1),[1,3]) 

代码正常工作没有任何错误。 a的大小是256 * 256 * 3 RGB类型。然而, 有2个问题:计算均方误差时的逻辑错误

  1. 现在从逻辑上讲,应该MSE以来的结果乘以c。与4.0应该扭转操作一直是RGB带零。但是MSE现在是1.1361 1.2780 1.2902当用b=0.27.*a进行测试时观察到了同样的结果;然后c=3.703703704.*b;
  2. 在MSE公式,对消除双数据类型,错误最小化0.5346 0.6132 0.6275

谁能解释透彻为什么发生这种情况,什么是补救?

回答

3

查看变量的数据类型a。这可能是一个uint8,这意味着b也会变成uint8,其中包含四舍五入的值 - 换言之,每个像素会丢失两位信息。

您提到了“double data type”,但我没有看到在代码中使用它的位置。

如果你从 开始a = double(imread('pix1.jpg')); 那么你的MSE应该几乎为零(我认为它的数量级为256 * 256 * 3 * eps(即舍入误差))。

+0

“你提到”双数据类型“,但我没有看到你在代码中使用它的地方。”如果我正在使用uint8,那么在MSE公式中,如果我将MSE =重塑(平均值((double(a) - double(c))^ 2,2),1),[1,3]),那么错误值是不同的。这发生在我发布查询的时候(当时是一个uint8类型的),但是在你解释之后不再存在。谢谢。 – SKM 2011-03-21 18:52:23