提问人:andrew 提问时间:9/8/2023 最后编辑:andrew 更新时间:9/8/2023 访问量:42
用更高效的算法替换嵌套循环
Replace Nested loops with more efficient algorthm
问:
我正在解决一个问题,我需要通过沿着图像找到一条线来识别 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()
答: 暂无答案
评论