函数陷入死循环,找不到原因

Function stuck in infinite loop, cannot find reason

该代码应该获取每个像素的 rgb 值并将其存储在二维数组中(例如像素 [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

上面的方法,pixels是一个二维数组,radius,width,height都是整数

我已经使用 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]]

(单独说明一下,您的模糊内核似乎没有用相同的边缘条件处理不同的图像边界)。

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

这些变化在这个例子中:

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

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

这确实花了很长时间 运行,完成后我会更新时间信息。