Regionprops 与 PodczeckShapes/DIPimage 圆度问题 - Matlab

Regionprops vs. PodczeckShapes/DIPimage Circularity question - Matlab

有人可以解释一下为什么 Matlab 中的 'Circularity' 是通过 (4*Area*pi)/(Perimeter^2) 计算的,而在 Podczeck Shape 中是 Area/(Pi/4* sp^2) https://qiftp.tudelft.nl/dipref/FeatureShape.html)?还是只是定义不同?

我尝试在 Matlab 中编写一个 Podczeck Shape 圆度代码,我假设“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

regionprops 中的 'Circularity' 度量定义为

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

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

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

对于任何其他形状,周长都会相对较长(这是圆的特点!),因此'Circularity'尺寸会较小。

Podczeck 的循环度是一种不同的衡量标准。它被定义为

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

在文档中,您 link 将 Height 称为 sp,并将其定义为 "Feret diameter perpendicular to s",并将 s 定义为 [=46] =].因此,sp 是最小边界框两侧中最大的。

对于圆,最小边界框 Height 等于直径。我们再次代入:

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

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


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

中获取所需的值

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