【问题标题】:Fastest way of finding nearest pixel in relation to another pixel while satisying conditions. OpenCV Numpy在满足条件的同时找到与另一个像素相关的最近像素的最快方法。 OpenCV Numpy
【发布时间】: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


【解决方案1】:

从目标像素盘旋而去,一旦满足“条件”就停止。为方便起见,您可以使用方形螺旋(实际上是嵌套方形)。

如果距离是欧几里得,则搜索成本将介于 2d² 和 4d² 之间,其中 d 是到命中的距离。

【讨论】:

  • @Program232323:当然,你不预先计算距离,这是一个很大的浪费。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2018-07-13
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
相关资源
最近更新 更多