用更高效的算法替换嵌套循环

Replace Nested loops with more efficient algorthm

提问人:andrew 提问时间:9/8/2023 最后编辑:andrew 更新时间:9/8/2023 访问量:42

问:

我正在解决一个问题,我需要通过沿着图像找到一条线来识别 600x600 图像中的对象(遮罩后),该线可以最大化矩阵中的元素数量。

我的代码现在有 4 个嵌套循环来实现这一点。正如你所看到的,这是非常低效的,想知道是否有人知道如何做得更好?

从某种意义上说,代码应该在图像中尝试几条可能的线条,沿着这条线从图像中提取元素,并使用求和。迭代完成后,将识别具有最大元素数的行。

因此,这个问题不仅仅是如何替换嵌套循环,我需要一些东西来尝试大量具有各种 m 和 c 的行组合:y = mx + c。

我也尝试在 y = mx + c 中只迭代 m 和 c,但是,该行将用于识别矩阵的元素,因此需要整数。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

def maskImg(img, sensit=0.85):
    maxval = img.max()
    minval = sensit * maxval
    mask = (img >= minval) & (img <= maxval)
    return np.where(mask, 1, 0)

img_path = r"..."
img = mpimg.imread(img_path)[400:1000, 150:750].mean(axis=2)
img1 = maskImg(img)

plt.figure()
plt.imshow(img1)

sum_points = []

for x2 in range(0, 60):
    for x1 in range(540, 600):
        for y1 in range(0, 60):
            for y2 in range(540, 600):
                x_coords = np.linspace(x1, x2, img1.shape[0], dtype=int)
                y_coords = np.linspace(y1, y2, img1.shape[1], dtype=int)
                
                # Extract pixel values along the diagonal using array indexing
                pixel_values_on_line = img1[x_coords, y_coords]
                
                sum_points.append([(x_coords, y_coords), pixel_values_on_line.sum()])

max_coords, max_sum = max(sum_points, key=lambda x: x[1])

x, y = max_coords

plt.plot(x, y)
plt.show()

嵌套 Python 算法

评论

0赞 Barmar 9/8/2023
使用计算机视觉库怎么样?
0赞 andrew 9/8/2023
你有特定的功能吗?没想到会有这样的函数存在,问题是我想检测线的角度。
0赞 nisakova 9/8/2023
这个包可能会有所帮助 pypi.org/project/opencv-python
3赞 Seon 9/8/2023
您可能对 Hough 变换感兴趣
0赞 andrew 9/9/2023
我刚刚测试了 Hough 变换,它确实非常适合对象,非常感谢您推荐它!

答: 暂无答案