我有1797个Mnist图像,需要为其提取两个特征(FilledArea,EulerNumber)。我知道如何在Matlab中做到这一点。我的特征矩阵在Matlab中具有(并且是正确的)1797 * 2的大小(每个维度为1797)

Matlab代码(正常工作)

for i = 1:2*N
    img = regionprops(BW(:,:,i),'FilledArea', 'Solidity');
    features(i, 1) = img.EulerNumber;
    features(i, 2) = img.FilledArea;
    clear img;
end


我想用Skimage regionprops在python中做同样的事情,但是对于1797张图像,我得到了29350 * 2个功能(每个功能为29350个道具),根据我的理解,应该是1797 * 2

python代码(无法正常工作)

digits = datasets.load_digits()
label_img = digits.images
rps = regionprops(label_img, cache=False)
print(len([r.area for r in rps]))  #29350
print(len([r.euler_number for r in rps]))  #29350


我的方法可能有什么问题?为什么每个功能都有29350个元素而不是1797?

最佳答案

就像在Matlab中需要一个for循环来计算每个图像的属性一样,在Python中也需要一个for循环来执行相同的操作。当前,您正在计算形状为(1797、8、8)的单个3D图像的属性,而不是形状为(8、8)的1797 2D图像的属性。这是您所需要的等效的Python代码:

features = []
for image in digits.images:
    labels = (image > 0).astype(int)  # only one object in the image
    props = regionprops(labels, image)[0]  # only one object
    features.append((props.euler_number, props.filled_area))

10-06 05:52