Python中从二进制掩模中快速检索轮廓掩模的方法

2024-10-01 02:19:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一个实时的应用程序,包括找到一个二进制掩码的边缘。我需要一些快速,没有GPU,如果可能的话,运行速度希望低于0.0005秒每幅图像,与大小(10001000)。我将使用以下二进制图像的示例,大小为(10001000)。在

(要复制的代码:)

import numpy as np
im=np.zeros((1000,1000),dtype=np.uint8)
im[400:600,400:600]=255

Image

快速完成任务的第一个逻辑方法是使用OpenCV库:

^{pr2}$

正如预期的结果: laplacian

我发现这样做很费时。在这之后,我试着寻找答案:

 def usingcontours(im):
    points=np.transpose(cv2.findContours(im,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)[1][0])
    tmp=np.zeros_like(im)
    tmp[tuple(points)]=255
    return tmp 
timeit.timeit(lambda:usingcontours(im),number=100)/100
0.0009052801132202148

结果和上面一样。 这是更好的,但仍然没有我想要的那么好。我继续使用numpy,最后用梯度近似拉普拉斯,尽管我知道这会更糟:

def usinggradient(im):
    tmp=np.gradient(im)
    return ((tmp[0]+tmp[1])>0).astype(np.uint8)
timeit.timeit(lambda:usinggradient(im),number=100)/100
0.018681130409240722

那么,有人对我如何加速算法有进一步的想法吗?我强调我希望这个算法用于二值图像,所以我想肯定有更好的实现。在


Tags: lambda图像numpyreturndefnp二进制zeros
1条回答
网友
1楼 · 发布于 2024-10-01 02:19:44

我用cv2.findContours选择了最快的一个来加快速度。在它中,我们可以替换那些昂贵的transpose,并用简单的^{}转换成元组部分,如-

idx = cv2.findContours(im,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)[1][0]
out = np.zeros_like(im)
out[idx[:,0,0],idx[:,0,1]] = 255

运行时测试-

^{pr2}$

因此,所提出的方法有一些微小的改进,但与轮廓发现本身相比,这似乎微不足道。在

我查看了^{}并运行了一个快速测试,似乎比OpenCV版本慢得多。在

相关问题 更多 >