Arhn - архитектура программирования

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

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

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

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

11.09.2010

  • Вы пробовали статистику или наборы инструментов для разработки фильтров? help <toolboxname> 11.09.2010

Ответы:


1

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

Как мы образуем разность двух изображений? Во-первых, конвертируйте их в двойники, если они являются изображениями 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, разбивая ее на управляемые части.

РЕДАКТИРОВАТЬ:

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

11.09.2010
  • Большое спасибо .. также приветствуется поддержка. 12.09.2010
  • Почему индекс 2, отличный от квадратного члена, в mean((double(M1) - double(M2)).^2,2) представляет строки? Я имею в виду, что в Matlab 1 означает строки, а 2 — столбец или наоборот? Пожалуйста, уточните. 14.09.2010
  • Хороший вопрос. Моя формулировка могла ввести в заблуждение. Если X является матрицей формы NxMxP, sum(X,2) формирует сумму по столбцам X, т. е. ВТОРОЕ измерение X, производя результат, который имеет форму Nx1xP. 15.09.2010

  • 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);
    
    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;
    

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

    13.09.2010
  • Спасибо и за этот метод. Разве не нужно делить результат MSe на количество точек выборки? Как и в реальной математической формуле, он делится на n квадрат, где n = количество точек выборки, выбранных случайным образом. 14.09.2010
  • даже ваш ответ правильный, но почему-то я не могу выбрать оба ответа как правильные!! Может быть, на этом форуме мы не можем принять 2 ответа одновременно, я думаю. 18.09.2010
  • Разделение происходит внутри призыва означать. › Т.е. среднее значение == (сумма (дельта. ^ 2) / nPoints) 20.09.2010
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..