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

Я хочу вычислить эту формулу в matlab

[m,n,d]=size(img1);
matrix1=sum(abs(img1-img2));
a= matrix1/ m*n ;
b=a*100;

, где img1, img2 - два изображения измерения 512 * 512 * 3

Цель состоит в том, чтобы получить одно числовое значение,но я получаю матрицу.Формула actaul в случае матрицы A, B с i строками и j столбцами равна = (summation [abs(A(i,j)- B(i,j))] / m*n ) * 100, чтобы получить процентиль. Я знаю, что это очень просто, но я думаю, что мне чего-то не хватает !!!

Ответы [ 2 ]

3 голосов
/ 11 сентября 2010

Тот факт, что матрицы изображений являются трехмерными, указывает на то, что они являются настоящими цветными RGB-изображениями . Для матрицы M первая цветовая плоскость M(:,:,1) является красным компонентом, вторая цветовая плоскость M(:,:,2) является зеленым компонентом, а третья цветовая плоскость M(:,:,3) является синим компонентом. Поскольку вы обсуждаете суммирование только по первым двум измерениям в своей формуле, вам придется выяснить, как вы хотите поступить с третьим измерением. Вот несколько вариантов:

  • Примените вашу формулу к каждой цветовой плоскости : Вы можете сделать это, дважды вызвав функцию SUM , один раз для суммирования по столбцам, затем снова для суммирования результата по строки Результатом matrix1 будет матрица 1 на 1 на 3, которая может быть преобразована в трехэлементный вектор-столбец с помощью функции SQUEEZE . Каждый элемент в векторе будет суммированием по каждой цветовой плоскости:

    matrix1 = squeeze(sum(sum(abs(img1-img2),1),2));
    

    Теперь вы можете использовать поэлементные операторы умножения и деления .* и ./ для вычисления окончательных результатов:

    a = matrix1./(m*n);
    b = a.*100;
    
  • Преобразование изображений в оттенки серого : Если вам нужна только интенсивность цвета, вы можете преобразовать изображения RGB в истинном цвете в 2-D изображения с интенсивностью серого с помощью функции RGB2GRAY из Инструментов обработки изображений :

    img1 = rgb2gray(img1);
    img2 = rgb2gray(img2);
    

    Затем вы можете либо дважды вызвать SUM для суммирования по строкам и столбцам, либо использовать индексирование по одиночному двоеточию , чтобы преобразовать каждое изображение в вектор-столбец и вызвать SUM один раз:

    matrix1 = sum(sum(abs(img1-img2)));
    %# OR...
    matrix1 = sum(abs(img1(:)-img2(:)));
    

Одна дополнительная заметка ...

Если данные вашего изображения хранятся как целочисленный тип , вы, вероятно, захотите сначала преобразовать данные изображения в с плавающей точкой двойной точности , выполнив следующие действия:

img1 = double(img1);
img2 = double(img2);

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

2 голосов
/ 11 сентября 2010

Функция сумм возвращает матрицу.http://faculty.petra.ac.id/resmana/private/matlab-help/techdoc/ref/sum.html Ваша матрица1 делится на скаляр (равный 512 * 512) - так что это также приводит к матрице.Я полагаю, что вместо этого вы хотели бы разделить на матрицу m на n.

Также вам нужно заключить в скобки m * n, если вы хотите разделить на скаляр.

Редактировать Matrix1 - это вектор строки 1x512, поэтому вы должны разделить его на вектор столбца 512x1, чтобы получить скаляр.Основываясь на вашей формуле, я думаю, что вы ищете вектор столбца, в котором каждый индекс содержит скаляр, равный 512 * 512, но, пожалуйста, уточните, для чего вы хотите решить - то есть, что вы подразумеваете под процентилем?

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