Логическая ошибка при расчете среднеквадратичной ошибки - PullRequest
0 голосов
/ 21 марта 2011
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])

Код работает без ошибок. Размер: 256 * 256 * 3 RGB. Тем не мение, Есть 2 вопроса:

  1. Теперь, по логике, MSE должен был быть нулевым для диапазонов RGB, поскольку умножение результата c на 4.0 должно повернуть операцию вспять. Но MSE выходит на 1.1361 1.2780 1.2902 То же самое наблюдается при тестировании с b=0.27.*a; затем c=3.703703704.*b;
  2. В формуле MSE при удалении двойного типа данных ошибка сводится к 0.5346 0.6132 0.6275

Может ли кто-нибудь объяснить это ясно, почему это происходит и каково лекарство?

1 Ответ

3 голосов
/ 21 марта 2011

Посмотрите на тип данных вашей переменной a. Вероятно, это uint8, что означает, что b также становится uint8, содержащим округленные значения - другими словами, вы теряете два бита информации на пиксель.

Вы упоминаете "двойной тип данных", но я не вижу, где вы используете его в своем коде.

Если вы начали с а = двойной (imread ( 'pix1.jpg')); тогда ваш MSE должен быть почти равен нулю (я бы ожидал, что он будет порядка 256 * 256 * 3 * eps (то есть ошибка округления)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...