标准化图像时尺寸错误

时间:2018-05-07 07:03:28

标签: matlab image-processing matrix sobel

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

Class MyClass : System.IComparable
{
    [int] $Value
    MyClass([int] $v)
    {
        $this.Value = $v
    }
    [int] CompareTo($that)
    {
        return $this.Value - $that.Value
    }
}

$instance1 = [MyClass]::new(1)
$instance2 = [MyClass]::new(2)

Write-Output ($instance1 -lt $instance2)
#Output: True
Write-Output ($instance1 -le $instance2)
#Output: True
Write-Output ($instance1 -ge $instance2)
#Output: False
Write-Output ($instance1 -gt $instance2)
#Output: False

我得到的错误:

 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] 时,我收到新错误:

./

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

如何解决此问题?

3 个答案:

答案 0 :(得分:2)

为什么你叫max两次。如果我用

运行代码
x=x/max(x(:))

我没有收到错误。这将以1D运行矩阵。

答案 1 :(得分:2)

虽然Caduceus' answer是正确的;它一次性对所有三种颜色进行标准化。对于您的情况,可能更好的是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]。使用冒号运算符实际上使整个3D矩阵成为单个列向量,max(x(:))因此提供单个值,这是所有行,列和通道的最大值。

答案 2 :(得分:-2)

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

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

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

x=x./repmat(max(max(x)),size(X,1),size(X,2),1);