Python 函数卡在无限循环中,找不到原因

Python 函数卡在无限循环中,找不到原因,python,python-3.x,loops,infinite-loop,Python,Python 3.x,Loops,Infinite Loop,代码应该获取每个像素rgb值并将其存储在2d数组中(例如,像素[pixelNumber][r,g,b]),然后将其发送到用户定义的方法,在这种情况下,模糊它(使用高斯模糊)。宽度和高度是从图像中获取的像素宽度和高度定义,半径是用户定义的半径,像素的平均值将模糊。 它给了我一个0除的错误 weight_r = pixels[j][0] * weight weight_g = pixels[j][1] * weight weight_b = pixels[j][2] * weight 在此之前,我

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

方法,像素是一个2d数组,半径、宽度和高度都是整数。

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

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

我已经准确地复制了您的代码,使用了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)


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

因为这不是一个递归方法,所以你应该在
while
循环中被阻塞。@ZeinabAbbasimazar我使用的是r_temp=r_temp-1,这不应该最终将其降低到0并关闭while循环吗?我不能用这段代码重现无限循环。对于
像素的各种列表以及兼容的半径、宽度和高度参数,它会按预期终止并生成结果。你调用它的确切参数集是什么?添加
print(r\u temp)
并观察它是什么,我认为你有大量的像素,所以这也是需要的long@ChrisFaffler无限循环还是很长的计算时间?因为它不是递归方法,你应该在
while
循环中被卡住。@ZeinabAbbasimazar我使用的是r_temp=r_temp-1,这不应该最终将其降低到0并关闭while循环吗?我无法用此代码重现无限循环。对于
像素的各种列表以及兼容的半径、宽度和高度参数,它会按预期终止并生成结果。你调用它的确切参数集是什么?添加
print(r\u temp)
并观察它是什么,我认为你有大量的像素,所以这也是需要的long@ChrisFaffler无限循环还是长计算时间?我在while循环中看到了无限循环的行为。如果这很重要的话,我使用的是python 3。你能详细说明一下你最后的陈述吗?我是个新手coding@ChrisFaffler不,这不是无限循环。这只是花了很长时间。这是一个更大范围的问题。基本思想是去掉模的内容,只需在高度和宽度上迭代。现在你正在做一个N^2的双循环,其中N是像素数!这意味着您正在做一个M^4的循环,其中M是边长(如果是正方形图像)。您希望将高度和宽度降低到接近H x W的顺序(因为半径为1)。您是正确的,我在第一个for循环的正下方添加了print(I),在第二个for循环的正下方添加了print(j),宽度和高度值为256,它在第二个for循环中循环65536次,每个第一个循环,然后需要循环65536次。我猜我的代码非常慢,没有陷入无限循环。感谢您的帮助。半径将不绑定到1,而是由用户定义的。如何减少第二个循环的大小?我在while循环中看到了无限循环的行为。如果这很重要的话,我使用的是python 3。你能详细说明一下你最后的陈述吗?我是个新手coding@ChrisFaffler不,这不是无限循环。这只是花了很长时间。这是一个更大范围的问题。基本思想是去掉模的内容,只需在高度和宽度上迭代。现在你正在做一个N^2的双循环,其中N是像素数!这意味着您正在做一个M^4的循环,其中M是边长(如果是正方形图像)。您希望将高度和宽度降低到接近H x W的顺序(因为半径为1)。您是正确的,我在第一个for循环的正下方添加了print(I),在第二个for循环的正下方添加了print(j),宽度和高度值为256,它在第二个for循环中循环65536次,每个第一个循环,然后需要循环65536次。我猜我的代码非常慢,没有陷入无限循环。感谢您的帮助。半径将不绑定到1,而是由用户定义的。我将如何减少第二个循环的大小?