错误:在赋值操作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作为计数器的变量名。