DIPimage 测量缺失参数
DIPimage measure missing argument
我正在尝试使用 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;
您的代码的一个问题是对 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 数组。例如,您可以通过键入其名称将其显示为交互式图形 window:
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)
你还可以用测量结构做其他事情,我建议你阅读the documentation。例如,我们可以从中删除最小对象的测量值,在我看来这就像噪声:
msr = msr(msr.size>100); % remove measurement for noise
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;
您的代码的一个问题是对 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 数组。例如,您可以通过键入其名称将其显示为交互式图形 window:
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)
你还可以用测量结构做其他事情,我建议你阅读the documentation。例如,我们可以从中删除最小对象的测量值,在我看来这就像噪声:
msr = msr(msr.size>100); % remove measurement for noise