2

有人可以解释一下为什么 Matlab 中的“圆度”是由 (4*Area*pi)/(Perimeter^2) 计算的,而在 Podczeck 形状中它是 Area/(Pi/4*sp^2) https://qiftp .tudelft.nl/dipref/FeatureShape.html)?还是只是简单地定义不同?

我试图在 Matlab 中编写 Podczeck 形状圆度代码,我假设“MaxFeretDiameter”垂直于“MinFeretDiameter”,对吗?

代码:

clc;
clear all;
close all;

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

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

[B,L] = bwboundaries(BW,'noholes');

i=2; 
stat = regionprops(BW, 'Area', 'Circularity', 'MaxFeretProperties', 'MinFeretProperties');
OArea = stat(i).Area;
OMaxFeretProperties = stat(i).MaxFeretDiameter; 
OMinFeretProperties = stat(i).MinFeretDiameter;   
OCircularityPodzeck = OArea/(Pi/4 * (OMaxFeretProperties^2))
OCircularityMatlab = stat(i).Circularity
4

1 回答 1

1

中的“循环性”度量regionprops定义为

Circularity = (4 Area π)/(Perimeter²)

对于一个圆, whereArea = π r²Perimeter = 2 π r,结果为:

Circularity = (4 π r² π)/((2 π r)²) = (4 π² r²)/(4 π² r²) = 1

对于任何其他形状,周长会相对较长(这是圆形的特征!),因此“圆形”度量会更小。

Podczeck's Circularity 是一个不同的度量。它被定义为

Podczeck Circularity = Area/(π/4 Height²)

在您链接的文档中,它指的Heightsp,并将其定义为“Feret 直径垂直于s”,并将其定义s为“最短的 Feret 直径”。因此,sp是最小边界框两侧中最大的一个。

对于一个圆,最小边界框Height等于直径。我们再次替换:

Podczeck Circularity = (π r²)/(π/4 (2 r)²) = (π r²)/(π/4 4 r²) = 1

对于任何其他形状,高度会相对较大,因此 Podczeck 圆度测量值会更小。


请注意,最大和最小 Feret 直径不一定是垂直的。一个简单的例子是正方形:最大直径是正方形的对角线;最小的直径是高度或宽度;这两个彼此成45度角。Podczeck 圆度测量使用垂直于最小投影的项目大小,对于正方形,最小投影等于最小投影,并且小于最大投影。最小的投影和它的垂直投影形成了最小的边界矩形(通常情况下,虽然显然不一定是这种情况?)。但是,regionprops具有轴对齐的“边界框”,因此不适合。我不知道如何从regionprops.

您必须遵循的方法是使用 'PixelList' 输出和regionprops'MinFeretAngle'。'PixelList' 是属于对象的像素坐标列表。您将根据“MinFeretAngle”旋转这些坐标,这样轴对齐的边界矩形现在对应于最小边界矩形。然后,您可以通过获取旋转坐标的最小值和最大值来确定框的大小。

于 2020-04-15T16:41:46.770 回答