我想做一个实时的应用程序,包括找到一个二进制掩码的边缘。我需要一些快速,没有GPU,如果可能的话,运行速度希望低于0.0005秒每幅图像,与大小(10001000)。我将使用以下二进制图像的示例,大小为(10001000)。在
(要复制的代码:)
import numpy as np
im=np.zeros((1000,1000),dtype=np.uint8)
im[400:600,400:600]=255
快速完成任务的第一个逻辑方法是使用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
那么,有人对我如何加速算法有进一步的想法吗?我强调我希望这个算法用于二值图像,所以我想肯定有更好的实现。在
我用} 转换成元组部分,如-
cv2.findContours
选择了最快的一个来加快速度。在它中,我们可以替换那些昂贵的transpose
,并用简单的^{运行时测试-
^{pr2}$因此,所提出的方法有一些微小的改进,但与轮廓发现本身相比,这似乎微不足道。在
我查看了^{} 并运行了一个快速测试,似乎比OpenCV版本慢得多。在
相关问题 更多 >
编程相关推荐