有人能解释一下为什么Matlab中的"圆度"是用(4*Area*pi(/(Perimeter^2(计算的,而在波德切克形状中是Area/(pi/4*sp^2(https://qiftp.tudelft.nl/dipref/FeatureShape.html)?还是只是简单地定义不同?
我试着在Matlab中写一个波德切克形状圆度代码,我假设"MaxFeretDiameter"垂直于"MinFeretDiamiter",我是对的吗?
代码:
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
regionprops
中的"Circularity"度量定义为
Circularity = (4 Area π)/(Perimeter²)
对于一个圆圈,其中Area = π r²
和Perimeter = 2 π r
,得出:
Circularity = (4 π r² π)/((2 π r)²) = (4 π² r²)/(4 π² r²) = 1
对于任何其他形状,周长都会相对较长(这是圆的特征!(,因此"圆度"测量值会更小。
波德切克的循环性是一个不同的衡量标准。它被定义为
Podczeck Circularity = Area/(π/4 Height²)
在您链接的文档中,它将Height
称为sp
,并将其定义为"垂直于s
的套圈直径",将s
定义为"最短套圈直径"。因此,sp
是最小边界框的两侧中最大的。
对于圆,最小边界框的Height
等于直径。我们再次替代:
Podczeck Circularity = (π r²)/(π/4 (2 r)²) = (π r²)/(π/4 4 r²) = 1
对于任何其他形状,高度都会相对较大,因此波德切克圆度度量会较小。
请注意,Feret的最大和最小直径不一定垂直。一个简单的例子是正方形:最大的直径是正方形的对角线;最小直径是高度或宽度;这两者相距45度。波德切克圆度度量使用垂直于最小投影的投影大小,对于正方形,该大小等于最小投影,小于最大投影。最小投影及其垂直投影形成最小边界矩形(通常,尽管显然情况并非如此?(。但是,regionprops
具有轴对齐的"BoundingBox",因此不适用。我不知道如何从regionprops
中获得所需的值。
您必须遵循的方法是使用regionprops
的"PixelList"输出和"MinFeretAngle"PixelList是属于对象的像素坐标列表。您可以根据"MinFeretAngle"旋转这些坐标,使轴对齐的边界矩形现在对应于最小边界矩形。然后,可以通过获取旋转坐标的最小值和最大值来确定长方体的大小。