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' 旋转这些坐标,这样轴对齐的边界矩形现在对应于最小边界矩形。然后,您可以通过取旋转坐标的最小值和最大值来确定框的大小。
有人可以解释一下为什么 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' 旋转这些坐标,这样轴对齐的边界矩形现在对应于最小边界矩形。然后,您可以通过取旋转坐标的最小值和最大值来确定框的大小。