【发布时间】:2018-12-08 00:51:38
【问题描述】:
我想在不使用 scipy 包 distance_trnsform_edt() 的情况下以最快的方式找到二进制图像的距离变换。图像是 256 x 256。我不想使用 scipy 的原因是因为在 tensorflow 中使用它很困难。每次我想使用这个包时,我都需要开始一个新的会话,这需要很多时间。所以我想做一个只使用numpy的自定义函数。
我的方法如下:找到图像中所有 1 和所有 0 的坐标。找到每个零像素 (a) 和一个像素 (b) 之间的欧几里德距离,然后每个 (a) 位置的值是到 a (b) 像素的最小距离。我为每个 0 像素执行此操作。生成的图像具有与原始二值图相同的尺寸。我的尝试如下所示。
我尝试尽可能快地做到这一点,不使用循环,只使用矢量化。但是我的功能仍然不能像 scipy 包那样快。当我对代码进行计时时,看起来分配给变量“a”的时间最长。但是不知道有没有办法加快速度。
如果有人对解决这个距离变换问题的不同算法有任何其他建议,或者可以指导我使用 python 中的其他实现,将不胜感激。
def get_dst_transform_img(og): #og is a numpy array of original image
ones_loc = np.where(og == 1)
ones = np.asarray(ones_loc).T # coords of all ones in og
zeros_loc = np.where(og == 0)
zeros = np.asarray(zeros_loc).T # coords of all zeros in og
a = -2 * np.dot(zeros, ones.T)
b = np.sum(np.square(ones), axis=1)
c = np.sum(np.square(zeros), axis=1)[:,np.newaxis]
dists = a + b + c
dists = np.sqrt(dists.min(axis=1)) # min dist of each zero pixel to one pixel
x = og.shape[0]
y = og.shape[1]
dist_transform = np.zeros((x,y))
dist_transform[zeros[:,0], zeros[:,1]] = dists
plt.figure()
plt.imshow(dist_transform)
【问题讨论】:
-
关于优化工作代码的问题更适合发到Code Review。
-
@andrew_reece:请阅读代码审查的主题。这个问题不是,因为它要求更快的不同算法,它不是要求审查编写的代码。
-
@user4500293:你已经实现了一个蛮力算法,还有许多其他算法更有效。您需要精确的欧几里得距离,还是整数近似就足够了?
-
整数近似也可以
-
@user4500293:请在您的评论中包含
@Cris,以便我收到通知。它使沟通更容易。今晚我会在这里为你写一个答案。请删除您在 Code Review 上的重复问题,重复发布是不合适的,我认为这个问题在这里比那里更适合。谢谢!
标签: python numpy computer-vision