2016-06-26 103 views
-3

错误:在赋值A(I)= B中,B和I中的元素数必须相同。尝试在Matlab中计算质心时发生Getiing错误

错误在==>测试在22质心(i)= k(i).Centroid;

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 

回答

0

重心字段是1×2大小的向量(用于保持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(Centroid)是一个大小为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.In的阈值函数,而不是使用双for循环可以简单的写

im = I > 105; 

2.in主要用于循环(位于主要脚本)use ii instead of i作为您的计数器的变量名称。

+0

我应该改变handdata(2,1)= mean(Centroid)into => ?? –

+0

看到我更新的答案 – drorco

+0

似乎没有错误。但是,它也没有给我任何答案。因为,成交价值是NaN。我该如何解决它? –