MATLAB ConnectedComponentLabeler 在 for 循环中不起作用

MATLAB ConnectedComponentLabeler does not work in for loop

我正在尝试使用 regionprops 函数获取一组二进制图像的偏心率和坚固性值。我使用 vision.ConnectedComponentLabeler 函数获得标签矩阵。

这是我目前的代码:

files = getFiles('images');
ecc = zeros(length(files)); %eccentricity values
sol = zeros(length(files)); %solidity values

ccl = vision.ConnectedComponentLabeler;

for i=1:length(files)
 
    I = imread(files{i});
    
    [L NUM] = step(ccl, I);


    for j=1:NUM
      L = changem(L==j, 1, j); %*
    end

    stats = regionprops(L, 'all');

    ecc(i) = stats.Eccentricity;
    sol(i) = stats.Solidity;

end

但是,当我 运行 这样做时,我收到一条错误消息,指出标有 *:

的行

Error using ConnectedComponentLabeler/step

Variable-size input signals are not supported when the OutputDataType property is set to 'Automatic'.'

我不明白 MATLAB 在说什么,也不知道如何摆脱它。

编辑

我已经返回 bwlabel 功能,现在没有问题了。

这个错误有点难以理解,但我可以解释它的确切含义。当您使用 CVST Connected Components Labeller 时,它假定您将要与函数 一起使用的所有图像都具有相同的大小 。发生该错误是因为看起来图像不是......因此关于 "Variable-size input signals".

的概念

Automatic” 属性表示图片输出的数据类型是自动的,也就是说你不用担心输出的数据类型是不是uint8, uint16, etc. 如果你想去掉这个错误,你需要手动设置这个labeller产生的图像的输出数据类型,或者OutputDataType 属性 到是静态的。希望您正在阅读的目录中的图像都是相同的数据类型,因此将此字段覆盖为此函数接受的数据类型。可用类型为 uint8uint16uint32。因此,假设您的图像是 uint8,例如,在您 运行 循环之前执行此操作:

ccl = vision.ConnectedComponentLabeler;
ccl.OutputDataType = 'uint8';

现在 运行 您的代码,它应该可以工作了。请记住,输入 需要 logical 才能产生任何有意义的输出。

小评论

当图像处理工具箱 bwlabel 功能以完全相同的方式工作时,为什么要使用 CVST Connected Component Labeller?当您使用 regionprops 时,您可以访问图像处理工具箱,因此您应该可以使用它。它使用起来更简单,不需要设置:http://www.mathworks.com/help/images/ref/bwlabel.html