Как найти среднеквадратичную ошибку в Matlab

Вопрос:Есть ли способ найти среднюю квадратную ошибку в matlab между двумя изображениями A, B (скажем) в истинном цвете размерности 256 * 256 * 3? Математическая формула для матрицы M1 и M2 такова, что при mean sq err=1/n*n { summation (square[M1(i,j)-M2(i,j)])} где я обозначает строку, а j обозначает столбец Лучший ответ: Хорошо, начните писать! Ешьте один

Вопрос:

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

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

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

Лучший ответ:

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

Как мы формируем разницу двух изображений? Во-первых, преобразуйте их в двойные, если они являются изображениями 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. Преобразуйте это в вектор 1×3, используя функцию reshape. (Функция сжатия также поможет.) Упаковывая все это в одну строку, мы получаем это…

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

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

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

EDIT:

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

Ответ №1

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

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 256×256 uint8 img. errG = sum(abs(dG(:))); errB = sum(abs(dB(:))); sumErr = errR + errG + errB;

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

Ответ №2% 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); Ответ №3a % 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

Оцените статью
Добавить комментарий