python 轮廓矩阵_二进制二维矩阵的python轮廓

我想计算一个二元NxM矩阵中一个形状的凸壳。凸壳算法需要一个坐标列表,所以我采用纽比。阿尔格何处(im)具有所有形状点坐标。但是,这些点中的大多数并没有对凸包起作用(它们位于形状的内部)。因为凸包计算时间至少与输入的点数成正比,所以我设计了一个想法,预先过滤掉过多无用的点,只通过那些跨越轮廓的点。这个想法很简单,对于二进制NxM矩阵中的每一行,我只取最小和最大的索引。例如:im = np.array([[1,1,1,0],

[1,0,1,1],

[1,1,0,1],

[0,0,0,0],

[0,1,1,1]], dtype=np.bool)

outline = somefunc(im)

然后大纲应该是(在元组中或者作为一个5x2 numpy数组,我不介意):

^{pr2}$

任何紧围绕这个形状(im)的凸壳,必须是这些点(轮廓)的子集。换句话说,如果“somefunc()”能够有效地过滤内部点,那么它将为凸壳计算节省时间。在

我有一些代码可以实现上面的技巧,但我希望有人有一个更聪明(读得更快)的方法,因为我需要运行它很多次。我的密码是:# I have a 2D binary field. random for the purpose of demonstration.

import numpy as np

im = np.random.random((320,360)) > 0.9

# This is my algorithm so far. Notice that coords is sorted.

coords = np.argwhere(im)

left = np.roll(coords[:,0], 1, axis=0) != coords[:,0]

outline = np.vstack([coords[left], coords[left[1:]], coords[-1]])

我的另一个想法是使用Python的reduce(),这样我只需要运行一次坐标列表。但我很难找到一个好的约化函数。在

任何帮助都将不胜感激!在

编辑

同时,我发现了一种从im直接到outline的更快的方法。至少对于大图像来说,这要快得多。在显然没有外部解决方案的情况下,我把它作为这个问题的解决方案。在

不过,如果有人知道更快的方法,请大声说出来:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值