当我测试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。因为有时它是6,无论是正方形,矩形还是任何其他多边形。
更新:=
(1)The function page

最佳答案

您正在使用哪个版本的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,其中包括该图像减去其侵蚀。这个数组对应于我在第一次编辑中所具有的周长概念。
然后,通过对边界图像应用卷积和加权和来计算周长。我认为这样做是为了计算穿过文档中所述的边界像素中心的线的长度。


如果您想了解更多细节,请咨询一名开发人员。这是软件包中的一个非常新的功能。

关于python - 谁能解释为什么“skimage.measure.perimeter(img)”返回此结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12934156/

10-12 22:53