【发布时间】:2019-09-11 15:56:36
【问题描述】:
我正在寻找可以读取图像、指定像素并在给定条件下找到离该像素最近的像素的最快方法。
我最初有一个嵌套循环,它将遍历我的 2D 图像数组中的每个像素,检查条件,而不是将其添加到新数组中。然后遍历新数组并对每个成员进行距离计算。 这非常慢,我相信它的时间复杂度为 n^2。
我现在正在做距离计算,并以此对数组进行排序,这在使用 numpy 时非常快。但是我仍然必须通过嵌套循环检查那个二维排序数组来检查条件,这又是 n^2 的时间复杂度。它确实节省了一些时间,因为我通常可以在数组中更快地找到我正在寻找的像素。
img2=cv2.imread(filename)
distances = numpy.sqrt((img2[:,:] - currR) ** 2 + (img2[:,:] - currC) ** 2)
nearest = numpy.sort(distances)
for row in range(nearest.shape[0]):
for col in range(nearest.shape[1]):
if pixelInLine[row*imgCol + col] == 0 and colorCheck(row,col) and numpy.any(img2[row, col] != 0):
#do my calculations on the specified pixel. and break the loop
我不确定如何进一步优化这一点,并可能将时间复杂度从 n^2 降低到更合理的水平。
【问题讨论】:
-
如果您说明您的条件是什么,则可以将其全部矢量化。顺便说一句,与其测试 sqrt(X) 是否小于 10,不如省去昂贵的 sqrt(),只测试 X 是否小于 100。
-
啊,我的错,我不认为条件句与解决方案相关,除了它们存在的事实。 pixelInLine 用于告诉我们之前在程序中已经访问过哪些像素,colorCheck 是一个函数,用于检查特定像素处的图像以查看该像素是否是我们想要的颜色,而 numpy.any 部分不包括黑色像素。我对你最后一句话的意思有点困惑。你是什么意思测试sqrt小于10?我在哪里这样做。感谢您的回复。
-
您将距离计算为两个平方数的 sqrt()。我建议你不要使用 sqrt()。
-
我不禁感到,如果您提供示例图像、描述您的算法并显示您期望的结果,您可能会得到更好的答案。
-
提供示例图像和预期输出。也就是说,这是一个非常简单的计算,它不应该太严格,只找到匹配条件的所有像素,然后搜索匹配条件的所有像素集。您可以通过矢量化方式执行此操作,而不是嵌套循环并搜索一堆额外的像素。
标签: python performance numpy opencv optimization