Как найти среднеквадратическую ошибку в Matlab - PullRequest
2 голосов
/ 11 сентября 2010

Есть ли способ найти среднеквадратичную ошибку в matlab между двумя изображениями A, B (скажем) в истинном цвете измерения 256 * 256 * 3? Математическая формула для матрицы, скажем, M1 и M2 такая же, как в

mean sq err=1/n*n { summation (square[M1(i,j)-M2(i,j)])}

где i обозначает строку, а j обозначает столбец

Ответы [ 4 ]

22 голосов
/ 12 сентября 2010

Ну, начните писать! Ешьте программного слона (даже самого маленького) по одному байту за раз!

Как мы формируем разницу двух изображений? Во-первых, преобразуйте их в двойные, если они являются изображениями uint8, как это обычно бывает. СДЕЛАЙ ЭТО! ПОПЫТАЙСЯ! Научитесь писать код Matlab, делая это по частям, чтобы вы могли следить за тем, что сделали.

Прежде всего, вы не сказали нам, будет ли это MSE по всем трем каналам. Ваша формула говорит, что мы должны получить разные MSE для каждого из красного, зеленого и синего каналов.

double(M1) - double(M2)

Теперь, как бы вы образовали квадрат каждой разности? Используйте оператор. ^.

(double(M1) - double(M2)).^2

Далее, среднеквадратическая ошибка подразумевает, что мы берем среднее значение по всем строкам и столбцам. Простой способ сделать это с помощью средней функции. Этот вызов принимает среднее значение по строкам.

mean((double(M1) - double(M2)).^2,2)

А следующий выводит среднее значение по столбцам.

mean(mean((double(M1) - double(M2)).^2,2),1)

Результатом будет вектор 1x1x3. Преобразуйте это в вектор 1x3, используя функцию изменения формы. (Функция сжатия также поможет.) Упаковав все это в одну строку, мы получим это ...

MSE = reshape(mean(mean((double(M1) - double(M2)).^2,2),1),[1,3]);

Если вам это кажется сложным, то лучше всего разбить его на несколько строк с комментариями, напоминающими вам о том, что вы сделали позже.

Но дело в том, что вы создаете операцию в Matlab, разбивая ее на управляемые части.

EDIT:

Во многих случаях люди хотят RMSE (среднеквадратичная ошибка), у которой единицы совпадают с вашими исходными числами. Это просто квадратный корень из MSE.

4 голосов
/ 13 сентября 2010

Среднеквадратичная ошибка для каждого канала независимо:

R1 = M1(:,:,1);
G1 = M1(:,:,2);
B1 = M1(:,:,3);

R2 = M2(:,:,1);
G2 = M2(:,:,2);
B2 = M2(:,:,3);

dR = int32(R1) - int32(R2);
dG = int32(G1) - int32(G2);
dB = int32(B1) - int32(B2);

mseR = mean(dR(:).^2);
mseG = mean(dG(:).^2);
mseB = mean(dB(:).^2);

Если это часть алгоритма регистрации изображения, вы можете покончить с квадратным термином:

R1 = M1(:,:,1);
G1 = M1(:,:,2);
B1 = M1(:,:,3);

R2 = M2(:,:,1);
G2 = M2(:,:,2);
B2 = M2(:,:,3);

dR = int32(R1) - int32(R2);
dG = int32(G1) - int32(G2);
dB = int32(B1) - int32(B2);

errR = sum(abs(dR(:))); % 32bits sufficient for sum of 256x256 uint8 img.
errG = sum(abs(dG(:)));
errB = sum(abs(dB(:)));

sumErr = errR + errG + errB;

Для дополнительной производительности вы также можете рассмотреть возможность преобразования в один канал и пространственной понижающей дискретизации, хотя эффективность этого будет зависеть от содержимого изображения.

3 голосов
/ 11 апреля 2014
% MSE & PSNR for a grayscale image (cameraman.tif) & its filtered versions
clear
clc
im=imread('cameraman.tif');
im=im2double(im);
h1=1/9*ones(3,3);
imf1=imfilter(im,h1,'replicate');% 'corr'
h2=1/25*ones(5,5);
imf2=imfilter(im,h2,'replicate');% 'corr'

MSE1=mean(mean((im-imf1).^2));
MSE2=mean(mean((im-imf2).^2));
MaxI=1;% the maximum possible pixel value of the images.
PSNR1=10*log10((MaxI^2)/MSE1);
PSNR2=10*log10((MaxI^2)/MSE2);
1 голос
/ 20 апреля 2013
a % your array1
b %your array2

m1=0;

for i=1:N
     m1=m1+(actual_effort(i)-Esti_effort1(i))^2;

end

RMSE1=sqrt((1/N)*m1); 
disp('Root Mean Square Error for Equation1=')
RMSE1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...