1

我在此代码部分中遇到了一些错误

 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]

我在规范化步骤中做错了什么。

我该如何解决这个问题?

4

3 回答 3

2

你为什么叫 max 两次。如果我运行代码

x=x/max(x(:))

我没有收到错误。这在一维中运行矩阵。

于 2018-05-07T07:28:45.927 回答
2

虽然Caduceus 的回答是正确的;它一次性对所有三种颜色进行标准化。对您的情况可能更好的是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'

在此处输入图像描述


第一个错误的原因是它max给出了按列的最大值,这是一个 3D 矩阵。max(max())因此给出一维的,而不是所需的标量。

然后发生第二个错误,因为max(max())给出了一个数组,该数组的条目数与完整矩阵的条目数不同(显然)。

基本上 如果size(x) = [row, column channels]和。使用冒号运算符实际上使整个 3D 矩阵成为一个单列向量,因此给出了一个值,它是所有行、列和通道中的最大值。size(max(x)) = [row channels]size(max(max(x)) = [row]max(x(:))

于 2018-05-07T08:29:28.523 回答
-2

当我运行您的代码时,错误消息显示“使用 RDIVIDE (./)”。像这样实现它:

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

这将每个 RGB 层除以其最大值。您可能必须复制最大值(我想这取决于 matlab 版本),请改用这一行

x=x./repmat(max(max(x)),size(X,1),size(X,2),1); 
于 2018-05-07T07:31:35.437 回答