图像处理 - 尝试在 Matlab 中计算质心时"the number of elements in B and I must be the same."分配错误



错误:在赋值操作A(I) = B中,B和I中的元素个数必须相同。

==>测试在22个质心(i)=k(i).质心;

test.m

    I=imread('1_1.jpg');
    I=rgb2gray(I);
    I2 = Thresholding(I);
    cc = bwconncomp(I2,8);
    n = cc.NumObjects;
    Area = zeros(n,1);
    Centroid = zeros(n,1);
    Perimeter = zeros(n,1);
    MajorAxis = zeros(n,1);
    MinorAxis = zeros(n,1);
    k = regionprops(cc, 'Area','Centroid','Perimeter','MajorAxisLength', 'MinorAxisLength');
    for i=1:n
    Area(i) = k(i).Area;
    Centroid(i)=k(i).Centroid;
    Perimeter(i) = k(i).Perimeter;
    MajorAxis(i) = k(i).MajorAxisLength(i);
    MinorAxis(i) = k(i).MinorAxisLength(i);
    end
    handdata(1,1) = mean(Area);
    handdata(2,1) = mean(Centroid);
    handdata(3,1) = mean(Perimeter);
    handdata(4,1) = mean(MajorAxis);
    handdata(5,1) = mean(MinorAxis);

Thresholding.m

function im = Thresholding(I);
[r,c] = size(I);
im = zeros(r,c);
for i=1:r
    for j=1:c
        if I(i,j)>105
            im(i,j)=1;
        end
    end
end
im = bwareaopen(im,5);
im = imfill(im, 'holes');
end

解决方案

质心场是一个大小为1x2的向量(用于保存y和x坐标)。因此,您需要相应地修改代码:

for循环外:

Centroid = zeros(n,2); %The centroids array should be nx2, to contain both x and y positions

for循环内:

Centroid(i,:)=k(i).Centroid; %fill the corresponded i'th row
MajorAxis(i) = k(i).MajorAxisLength; %remove the coordinate from MajorAxisLength and MinorAxisLength fields
MinorAxis(i) = k(i).MinorAxisLength;

基于这个原因,您还需要修改下面的代码行,因为mean(质心)是大小为1x2的向量。handdata将是一个4x1的向量,而质心平均值将被放置在一个不同的变量centroidData中。

handdata(1,1) = mean(Area);
handdata(2,1) = mean(Perimeter);
handdata(3,1) = mean(MajorAxis);
handdata(4,1) = mean(MinorAxis);
centroidData = mean(Centroid);

再提两个建议

1。在Thresholding函数中,您可以简单地写入

,而不是使用双for循环
im = I > 105;

2。在主for循环中(位于主脚本中),使用ii代替I作为计数器的变量名。

相关内容

最新更新