img = imread('47.jpg');
ecc=regionprops(img,'Eccentricity');
ecc =
255x1 struct array with fields:
Eccentricity
ecc(255)
ans =
Eccentricity: 0.2851
ecc(1)
ans =
Eccentricity: 0.4740
========================= ecc是struct数据类型的变量。它将保存所有255个对象的值。但是,我想找到一个偏心率并考虑所有这些值的平均值。
有没有办法找到结构值的平均值?
我试过循环。计算总和除以总数。对象但是MATLAB不允许对struct data varible进行添加。
=======================================
img = imread('47.jpg');
ecc=regionprops(img,'Eccentricity');
numObj = numel(ecc);
sum=0;
index=1;
for k = 1: numObj
temp=ecc(index);
**sum=temp+sum;**
index=k+1;
end
imgEcc = sum/numObj;
**??? Undefined function or method 'plus' for input arguments of type 'struct'.**
===========================================
请提供您的意见。
答案 0 :(得分:0)
在循环中,您必须引用字段名称来访问数据:
for k = 1: numObj
temp=ecc.Eccentricity(index);
sum=temp+sum;
index=k+1;
end
imgEcc = sum/numObj;
更有效的方法是使用ecc.Eccentricity
本身是以逗号分隔的值列表的事实从结构数组中提取所有偏心率:
Eccentricities = [ecc.Eccentricity];
这与Matlab处理结构数组的方式类似[ecc(1).Eccentricity, ecc(2).Eccentricity,...]
。
由于偏心率现在是双数组,因此您可以使用mean
:
EccentricityBar = mean(Eccentricities);
如果struct数组中的数据不是标量,则值提取的语义取决于字段中数据的形状。
无论字段数据是行向量(1xN
),列向量(Nx1
)还是矩阵(MxN
),通过将字段引用包装在正方形中形成的矩阵大括号总是由逗号分隔的连接组成。
换句话说,如果我们有一个带有字段foo
的结构数组bar
,则以下两行是等效的:
baz1 = [foo(1:3).bar];
baz2 = [foo(1).bar,foo(2).bar,foo(3).bar];
要访问baz
数组的某些元素,需要了解foo(k).bar
中数据的形状。
如果数据是长度为N
的行向量,则可以使用下标和步幅N
来提取struct数组中的原始列:
col1 = baz(1:N:end);
col2 = baz(2:N:end);
...
col# = baz(#:N:end);
如果数据是长度为N
的列向量,则struct数组中的原始行是baz
的行:
row1 = baz(1,:);
row2 = baz(2,:);
...
row# = baz(#,:);
对于矩阵数据,上述两种方法的组合可以在哪里查看。
例如,如果您的结构数组data
的字段Centroid
在x
中具有y
和1x2 array
质心位置,那么我们可以提取像
centroids = [data.Centroid];
xbar = centroids(1:2:end);
ybar = centroids(2:2:end);
然而,如果质心位置是2x1 array
,我们会像
centroids = [data.Centroid];
xbar = centroids(1,:);
ybar = centroids(2,:);