任何人都可以解释为什么`skimage.measure.perimeter(img)`返回这个结果?

时间:2012-10-17 12:17:42

标签: python image-processing scikits scikit-image

当我测试scikit-image方法时,我遇到skimage.measure.perimeter(image)但无法解释此函数的输出。

import numpy as np  
image=np.zeros((100,100))  
image[10:30,10:30]=1                   # this creates a white square  
from skimage.measure import perimeter  
x=perimeter(image)  
print x                               #Should be (20+20+20+20) = 80  
76.0        <<<<<<<<<< it returns this value

我是否误解了这个函数应该返回什么。我知道周长是围绕某个区域的路径 注: -
(1)计算出的周长与返回周长之间的差异并不总是为4.as有时它可以是6,无论它是方形矩形还是任何其他多边形。
更新:=
(1)The function page

2 个答案:

答案 0 :(得分:2)

您使用的是哪个版本的skimage? 版本0.6和github sources没有skimage.measure.perimeter函数。

另外,我认为你的意思是第3行:image[10:30, 10:30] = 1

修改

好的,我想我明白了。该函数在版本0.7.1中的_regionprops.py中定义。 结果76实际上是正确的。它计算白色方形的周长(20,20)。

您认为每一方占20像素,总计为80像素。但通过这样做,你可以计算两倍的角点像素。删除您最终的边角像素,周长为76像素。

对于其他形状,差异可能不是4像素。

修改2

查看源代码和文档:

  • regionprops的文档说周长是周长的近似值:
  

将轮廓近似为直线的物体周长       使用4连接通过边界像素的中心。

  • 代码计算一个border_image,它由图像减去其侵蚀组成。这个数组对应于我在第一次编辑中的周长的想法。

  • 然后通过对边框图像应用卷积和加权和来计算周边。我认为这是为了计算通过边界像素中心的线的长度,如文档中所述。

如果您需要更多详细信息,请咨询开发人员。这是包中一个非常新的功能。

答案 1 :(得分:-1)

代码测量每个连接像素的中心到中心