Пока Кадуцей отвечает правильно; нормализуется по всем трем цветам за один раз. Что, вероятно, лучше для вашего случая - 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](https://i.stack.imgur.com/CWb4Z.png)
Причиной первой ошибки является то, что max
дает максимум по столбцам, и это 3D-матрица. max(max())
, таким образом, дает 1D, вместо желаемого скаляра.
Тогда возникает вторая ошибка, потому что max(max())
дает массив, который не имеет того же количества записей, что и полная матрица (очевидно).
В основном, если size(x) = [row, column channels]
, size(max(x)) = [row channels]
и size(max(max(x)) = [row]
. Использование оператора двоеточия фактически делает всю трехмерную матрицу вектором из одного столбца, и, таким образом, max(x(:))
дает одно значение, которое является максимальным для всех строк, столбцов и каналов.