Неправильные размеры при нормализации изображения - PullRequest
0 голосов
/ 07 мая 2018

Я получаю сообщение об ошибке в этом разделе кода

 X=imread ('Lighthouse.jpg'); %reads picture as int8 matrix  
figure, imagesc(X), colormap gray, title('original picture'), % display picture  
filter=[-1 0 1; -2 0 2; -1 0 1]; % builds Sobel filter matrix  
filter=single(filter); %convert double to single 
x=single(X); % convert int8 to single  
x=x/max(max(x)); %normalisation to [0,1] 

Я получаю ошибку:

Error using  / 
Inputs must be 2-D, or at least one input must be scalar.
To compute elementwise RDIVIDE, use RDIVIDE (./) instead.
Error in sobel (line 10)
x=x/max(max(x)); %normalisation to [0,1]

Также, когда я использую ./, как предложено, я получаю новую ошибку:

Array dimensions must match for binary array op.
Error in sobel (line 10)
x=x./max(max(x)); %normalisation to [0,1]

Я делаю что-то не так на этапе нормализации.

Как мне решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Когда я запускаю ваш код, появляется сообщение об ошибке «Использовать RDIVIDE (./)». реализовать это так:

x=x./max(max(x)); 

Это делит каждый слой RGB на его максимум. Возможно, вам придется повторить максимальные значения (думаю, это зависит от версии Matlab), используйте эту строку вместо

x=x./repmat(max(max(x)),size(X,1),size(X,2),1); 
0 голосов
/ 07 мая 2018

Пока Кадуцей отвечает правильно; нормализуется по всем трем цветам за один раз. Что, вероятно, лучше для вашего случая - rgb2gray, чтобы получить один цветной канал и затем вместо этого нормализовать его (используя x/max(x(:))).

X=imread ('lighthouse.png'); %reads picture as int8 matrix  
filter=[-1 0 1; -2 0 2; -1 0 1]; % builds Sobel filter matrix  
filter=single(filter); %convert double to single 
x = single(rgb2gray(X)); % rgb2gray gives a uint8, you want single
% x=x/max(x(:)); %normalisation to [0,1] , not needed here as x can directly be used
% for Sobel purposes as it's a grey scale image.

figure;
subplot(1,2,1)
imagesc(X)
colormap(gray)
title('original picture'), % display picture 
subplot(1,2,2)
imagesc(x)
colormap(gray)
title 'Grey scale'

enter image description here


Причиной первой ошибки является то, что max дает максимум по столбцам, и это 3D-матрица. max(max()), таким образом, дает 1D, вместо желаемого скаляра.

Тогда возникает вторая ошибка, потому что max(max()) дает массив, который не имеет того же количества записей, что и полная матрица (очевидно).

В основном, если size(x) = [row, column channels], size(max(x)) = [row channels] и size(max(max(x)) = [row]. Использование оператора двоеточия фактически делает всю трехмерную матрицу вектором из одного столбца, и, таким образом, max(x(:)) дает одно значение, которое является максимальным для всех строк, столбцов и каналов.

0 голосов
/ 07 мая 2018

Почему вы звоните макс дважды. Если я запускаю код с

x=x/max(x(:))

Я не получаю сообщение об ошибке. Это запускает матрицу в 1D.

...