2

在此处输入图像描述我正在尝试使用 DIPimage 对图像中的每个对象进行一些测量,但出现此错误:

Error using dip_measure
DIPlib Error in function dip_Measure.
DIPlib Error in function dip_ImageCheck: Data type not supported


Error in measure (line 209)
data = dip_measure(object_in,gray_in,measurementID,objectIDs,connectivity);

Error in Untitled (line 13)
msr = measure(b, [], ({'size', 'perimeter','podczeckShapes'}))

我该如何解决?

代码:

Image = rgb2gray(imread('pillsetc.png'));

BW = imbinarize(Image);
BW = imfill(BW,'holes');
imshow(BW);

[B,L] = bwboundaries(BW,'noholes');
k = 1;
b = B{k};
y  = b(:,2);
x  = b(:,1);

msr(k) = measure(BW, [], ({'size', 'perimeter','podczeckShapes'}))
sz = msr.size;
podczeckShapes = podczeckShapes;
4

1 回答 1

1

您的代码的一个问题是调用imfill. 因为图像周围都有明亮的值,所以认为有一个大物体有一个洞,而你的实际物体在这个洞内。imfill填充孔,使整个图像变白。

相反,我建议使用以下代码来删除框架:

Image = rgb2gray(imread('https://i.stack.imgur.com/fmqAF.jpg'));
BW = imbinarize(Image);

BW = BW - bpropagation(false(size(BW)), BW);

因为我们在 DIPimage 中使用了过滤器,所以该BW变量现在包含一个dip_image对象,而不是普通的 MATLAB 数组。dip_array(BW)提取内部的普通 MATLAB 数组。该dip_image对象的行为与 MATLAB 数组不同。例如,您只需键入其名称即可将其显示到交互式图形窗口:

BW

接下来,我们应用标签,以便我们知道测量数据中的哪个对象 ID 对应于哪个对象:

lab = label(BW);
dipshow(lab,'labels')

现在我们可以应用测量功能。如果我们使用BW作为输入,label就会调用它。既然我们已经有了这个结果,让我们直接使用它:

msr = measure(lab, [], {'size', 'perimeter','podczeckShapes'});

让我们检查对象 ID 8 的结果,这是一个大正方形:

sz = msr(8).size
square = msr(8).podczeckShapes(1)
triangle = msr(8).podczeckShapes(3)

您可以对测量结构进行其他操作,我建议您阅读文档。例如,我们可以从中删除最小物体的测量值,在我看来,这些物体看起来像噪音:

msr = msr(msr.size>100); % remove measurement for noise
于 2020-04-12T19:01:37.770 回答