【问题标题】:Function stuck in infinite loop, cannot find reason函数陷入无限循环,找不到原因
【发布时间】:2018-05-06 07:21:17
【问题描述】:

代码应该获取每个像素 rgb 值并将其存储在二维数组中(例如,pixels[pixelNumber][r, g, b]),然后将其发送到用户定义的方法,在这种情况下,模糊它(使用高斯模糊)。宽度和高度是从图像中获取的像素宽度和高度定义,半径是用户定义的半径,其中像素被平均化为模糊。 它在

处给了我一个除以 0 的错误
weight_r = pixels[j][0] * weight
weight_g = pixels[j][1] * weight
weight_b = pixels[j][2] * weight

在我将 total_weight 从 0 更改为 1 之前,在第一个 for 循环下方定义时,如果有帮助的话

def blur(pixels, radius, width, height):
    for i in range(len(pixels)):
        total_weight = 1
        pix_weight = 0
        r_temp = radius
        pixels_2 = copy.deepcopy(pixels)
        x = i % width
        y = (i // width) + 1
        for j in range(len(pixels)):
            x_2 = j % width
            y_2 = (j // width) + 1
            dist = math.sqrt(((x_2 - x) ** 2) + ((y_2 - y) ** 2))
            while(r_temp > 0):
                if((x_2 - radius == x or x_2 + radius == x) and (y_2 - radius == y or y_2 + radius == y) and dist != 0):
                    weight = ((math.e ** (-((dist ** 2) / (2 * (radius ** 2))))) / (2 * math.pi * (radius ** 2)))
                    total_weight = total_weight + weight
                    weight_r = pixels[j][0] * weight
                    weight_g = pixels[j][1] * weight
                    weight_b = pixels[j][2] * weight
                    pix_weight = pix_weight + weight_r + weight_g + weight_b
                r_temp = r_temp - 1
        final_blur = int((pix_weight / total_weight) / 255)
        pixels_2[i][0] = int(pixels[i][0] * final_blur)
        pixels_2[i][1] = int(pixels[i][1] * final_blur)
        pixels_2[i][2] = int(pixels[i][2] * final_blur)
    return pixels_2

上面的方法,像素是一个二维数组,半径、宽度、高度都是整数。

【问题讨论】:

  • 既然你这不是递归方法,你应该一直卡在while循环中。
  • @ZeinabAbbasimazar 我正在使用 r_temp = r_temp - 1,但最终不应该将其降低到 0 并关闭 while 循环吗?
  • 我无法使用此代码重现无限循环。对于pixels 的各种列表列表以及兼容的半径、宽度和高度参数,它会按预期终止并产生结果。您调用它的确切参数集是什么?
  • 添加 print(r_temp) 并观察它的作用 我认为您有大量像素,所以这需要的时间太长了
  • @ChrisFaffler 无限循环还是计算时间长?

标签: python python-3.x loops infinite-loop


【解决方案1】:

我已经完全复制了您的代码,使用 Python 2.7.11 和下面的一些示例参数,但我无法重现无限循环。您看到哪些参数存在无限循环行为?

In [13]: p = [[1, 1, 1, 1, 1], 
              [1, 1, 1, 1, 1], 
              [1, 1, 1, 1 ,1], 
              [1, 1, 1, 1, 1], 
              [1, 1, 1, 1, 1]]

In [14]: r = 3

In [15]: w, h = 5, 5

In [16]: blur(p, r, w, h)
Out[16]: 
[[1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1],
 [0, 0, 0, 1, 1]]

(另外,您的模糊内核似乎没有使用相同的边缘条件处理不同的图像边界)。

添加您在 cmets 中提到您使用的是 256x256 图像 - 并且只是为了检查我尝试使用 256 ** 2 条目(所有像素列表)制作示例的格式,其中每个像素都是一个 3 元素列表。我现在知道这可能就是你想要的。

这些变化在这个例子中:

In [19]: p = [[1, 1, 1] for _ in range(256 ** 2)]

In [20]: %timeit blur(p, 1, 256, 256)

这确实需要很长时间才能运行,完成后我会更新时间信息。

【讨论】:

  • 我在 while 循环中看到了无限循环行为。如果这很重要,我在 python 3 上。您能否详细说明您的最后陈述?我对编码有点陌生
  • @ChrisFaffler 不,这不是无限循环。只是需要 很长 时间。
  • 这是一个更大范围的问题。基本思想是摆脱模数,只迭代高度和宽度。现在您正在执行 N^2 双循环,其中 N 是 像素数! 这意味着您正在执行 M^4 循环,其中 M 是边长(如果是方形图像)。您希望将其减小到接近 H x W 的高度和宽度的顺序(因为您的半径为 1)。
  • 你是对的,我在第一个 for 循环下方添加了 print(i),在第二个循环下方添加了 print(j),宽度和高度值为 256,它循环通过第二个 for每个第一个循环循环 65536 次,然后需要循环 65536 次。我想我的代码只是真的很慢而且没有陷入无限循环。感谢您的帮助。
  • 半径不会被绑定到1,它是用户定义的。我将如何减少第二个循环的大小?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2021-12-17
  • 1970-01-01
  • 2019-10-13
  • 2020-05-13
相关资源
最近更新 更多