我希望制作一个实时应用程序,其中涉及到找到二进制掩模的边缘。如果可能的话,我需要一些快速的东西,没有GPU,每张图像运行时间希望低于0.0005秒,大小为(1000,1000)。我将使用以下示例二进制图像,大小为(1000,1000)。
(复制代码:)
(复制代码:)
import numpy as np
im=np.zeros((1000,1000),dtype=np.uint8)
im[400:600,400:600]=255
快速处理事务的第一种逻辑方式是使用OpenCV库:
import cv2
timeit.timeit(lambda:cv2.Laplacian(im,cv2.CV_8U),number=100)/100
0.0011617112159729003
如预期所示,结果如下: 拉普拉斯
我发现这种方法非常耗时。之后我尝试使用findContours:
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
那么,有没有人对如何加速我的算法有进一步的想法?我强调我希望这个算法用于二进制图像,所以我猜肯定有更好的实现方法。
scipy.ndimage.morphology.binary_dilation
和np.logical_*
函数。 - YXD