区域道具使用的周边

78次观看(过去30天)
粘土Swackhamer
粘土Swackhamer 2017年9月23日
回答: nsunjaya 2017年9月25日
你好,
我使用bwconncomp的输出作为输入到regionprops,以计算二值图像中的blobs的一些值。我计算的一个值是“solidity”,它是regionprops的直接输出。然而,我也对计算圆度感兴趣,我将其定义为4*pi*Area/周长^2。然而,我总是得到大于1的值,这是出乎意料的。通过在一些人工二值图像上运行bwconncomp和regionprops,其中一些像素被任意设置为1来表示粒子,我可以知道regionprops并不以我通常认为的方式计算周长。有人知道周长计算对于非常小的“on”像素簇失败了吗,或者在regionprops所做的事情背后有一些原理吗,我只是不理解它?
我将发布我用来排除故障的代码:
%生成一个空矩阵
A = 0 (5,5)
在上面放一个小的十字形粒子。
A (2,2:4) = 1
A (1:3, 3) = 1
%叫bwconncomp
Cc = bwconncomp(a)
%叫regionprops
= regionprops(cc,“周长”“稳健”“区域”
%的报告值
p = blobFacts。周长
s = blobFacts。可靠性
a = blobFacts。区域
%手动计算圆度
C = (4* *a)/p²
这给出的循环度为1.9865,高于1(这是我直觉认为的最大可能的循环度)。粒子的面积是5,这是预期的,但周长是5.6240,我似乎不知道regionprops是如何得到这个值的。提前谢谢,
粘土

接受的答案

nsunjaya
nsunjaya 2017年9月25日
“regionprops”中的“周长”计算是根据下面文中解释的公式进行的:
点Vossepoel和A.W.M. Smeulders,“有限长度直线表示中的向量码概率和度量误差”,《计算机图形学与图像处理》,第20卷,第4期,1982年12月,第347-364页。
你也可以参考下面的博客文章,它给出了使用的算法的总体概述(请注意这不是一个官方文档):
你可以看到周长是通过regionprops函数中名为"computePerimeterFromBoundary"的局部函数计算出来的,它对应于上面文章和博客文章中讨论的公式:
周长= sum(isEven)*0.980 + sum(~isEven)*1.406 - sum(isCorner)*0.091;

更多答案(1)

马特·J
马特·J 2017年9月23日
编辑:马特·J 2017年9月23日
我认为下面2x2正方形的例子更容易讨论。我假设你期望计算出的周长是8,因为这是一个理想面积为4的正方形的理论周长。这就是regionprops遍历边界像素边缘的计算结果。对于大多数形状,这将给成像对象的周长一个非常差的近似值,所以我认为很清楚为什么regionprops不这样做。
根据regionprops的文档,我希望计算出的周长为4。在文档中,这听起来像是计算从中心到中心穿过边界像素,累积像素间距离。为什么结果是3.5560,我就是不知道。然而,即使计算周长为4,在公式中也会得到圆度= >1。也就是说,除非修改面积计算,以便只计算以像素中心为界的区域的面积(在本例中为1)。您可以使用polyarea()来实现这一点。
底线:regionprops计算面积的方法与计算周长的方法是不一致的,所以你的圆度公式确实会在小像素集群中失效。
> >一个
一个=
0 0 0 0 0 0
0 1 1 0 0
0 1 1 0 0
0 0 0 0 0 0
0 0 0 0 0 0
> > regionprops (,“区域”“周长”
ans =
结构体字段:
面积:4
周边:3.5560
7评论
图像分析
图像分析 2017年9月24日
在bwarea()中有一个类似的不寻常的面积计算,它不是像regionprops()中那样严格的像素计数,而是一个加权的像素面积,取决于像素是位于外边缘、外角还是内角。

登录发表评论。

社区寻宝

在MATLAB中央找到宝藏,并发现社区可以如何帮助你!

开始狩猎!

翻译的