Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在满足条件的情况下,找到与另一个像素相关的最近像素的最快方法。OpenCV Numpy_Python_Performance_Numpy_Opencv_Optimization - Fatal编程技术网

Python 在满足条件的情况下,找到与另一个像素相关的最近像素的最快方法。OpenCV Numpy

Python 在满足条件的情况下,找到与另一个像素相关的最近像素的最快方法。OpenCV Numpy,python,performance,numpy,opencv,optimization,Python,Performance,Numpy,Opencv,Optimization,我正在寻找最快的方式,我可以读取图像中,指定一个像素,并找到最接近的像素给我的条件像素 我最初有一个嵌套循环,它将遍历2D图像数组中的每个像素,检查条件,然后将其添加到新数组中。然后遍历新数组并对每个成员进行距离计算。 这是非常缓慢的,我相信它的时间复杂度是n^2 我现在正在进行距离计算,并以此对数组进行排序,这在使用numpy时非常快。但是,我仍然需要通过带有嵌套循环的2D排序数组来检查条件,这也是n^2的时间复杂度。不过,这确实节省了一些时间,因为我通常可以在阵列中更快地找到要查找的像素 i

我正在寻找最快的方式,我可以读取图像中,指定一个像素,并找到最接近的像素给我的条件像素

我最初有一个嵌套循环,它将遍历2D图像数组中的每个像素,检查条件,然后将其添加到新数组中。然后遍历新数组并对每个成员进行距离计算。 这是非常缓慢的,我相信它的时间复杂度是n^2

我现在正在进行距离计算,并以此对数组进行排序,这在使用numpy时非常快。但是,我仍然需要通过带有嵌套循环的2D排序数组来检查条件,这也是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降低到更合理的程度。

从目标像素开始螺旋式旋转,并在满足“条件”后立即停止。为方便起见,可以使用方形螺旋线(实际上是嵌套的正方形)


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

如果您说明了您的条件是什么,则可以将其全部矢量化。顺便说一句,与其测试sqrt(X)是否小于10,不如省去昂贵的sqrt(),只测试X是否小于100。啊,糟糕的是,我不认为这些条件与解决方案相关,除了它们存在的事实。pixelInLine用于告诉我们之前在程序中访问过哪些像素,colorCheck是一个函数,用于检查特定像素处的图像,以确定该像素是否是我们想要的颜色,numpy。任何部分都不包括黑色像素。我对你最后一句话的意思有点困惑。你说sqrt小于10是什么意思?我该在哪里做呢。感谢您的回复。您将距离计算为两个平方数的sqrt()。我建议您不要使用sqrt()。如果您提供一张示例图像,描述您的算法并显示您期望的结果,我不禁觉得您可能会得到更好的答案。请提供一张示例图像和期望的输出。这就是说,这是一个非常简单的计算,只需找到与条件匹配的所有像素,然后搜索与条件匹配的所有像素集,不应该限制太多。你可以用矢量化的方式来做这件事,而不是嵌套循环和搜索一堆额外的像素。@Program2323:当然,你不需要预先计算距离,这是一个很大的浪费。