停止 Floodfill 算法
Stopping Floodfill algorithm
我受困于我的洪水填充算法:它在 "normally" 不应该...
的那一刻停止
情况如下:我有一个 512*512 像素的矩阵,其值是 50 或 100 左右。 50 的值正在形成一个正方形,我想将其更改为一个值为 255 的正方形(使用 floodfill 算法)。
def FF(matrix,x,y,h): #h is chosen <=50
stack=[]
matrix[x,y]=255
stack.append((x,y))
while stack!=[]:
(x,y)=stack[0]
stack.pop()
if matrix[x-1,y] <= h: #Pixel North
matrix[x-1,y]=255
stack.append((x-1,y))
if matrix[x,y+1] <= h: #Pixel East
matrix[x,y+1]=255
stack.append((x,y+1))
if matrix[x+1,y] <= h: #Pixel South
matrix[x+1,y]=255
stack.append((x+1,y))
if matrix[x,y-1] <= h: #Pixel West
matrix[x,y-1]=255
stack.append((x,y-1))
if matrix[x-1,y+1] <= h: #Pixel North East
matrix[x-1,y+1]=255
stack.append((x-1,y+1))
if matrix[x+1,y+1] <= h: #Pixel South East
matrix[x+1,y+1]=255
stack.append((x+1,y+1))
if matrix[x+1,y-1] <= h: #Pixel South West
matrix[x+1,y-1]=255
stack.append((x+1,y-1))
if matrix[x-1,y-1] <= h: #Pixel North West
matrix[x-1,y-1]=255
stack.append((x-1,y-1))
else:
print ('... finished')
return
我不知道为什么,但代码运行了 10 次,但不会更多。
谢谢Q
问题出在这里:
(x,y)=stack[0] # get the first element of the list
stack.pop() # remove the *last* element
由于您获得了第一个元素,但删除了最后一个元素,因此有可能(就像并且可能总是这样),不会 将评估所有被推送的元素在堆栈上。
尽管如此,您还是太复杂了。简单地写:
def FF(matrix,x,y,h): #h is chosen <=50
stack=[(x,y)]
m,n = matrix.shape
while stack:
x,y = stack.pop()
if 0 <= x < m and 0 <= y < n and matrix[x,y] <= h: # check bounds and height
matrix[x,y] = 255 # set the value
stack.append((x-1,y-1)) # add all directions to the stack, we check later
stack.append((x,y-1))
stack.append((x+1,y-1))
stack.append((x-1,y))
stack.append((x+1,y))
stack.append((x-1,y+1))
stack.append((x,y+1))
stack.append((x+1,y+1))
我受困于我的洪水填充算法:它在 "normally" 不应该...
的那一刻停止情况如下:我有一个 512*512 像素的矩阵,其值是 50 或 100 左右。 50 的值正在形成一个正方形,我想将其更改为一个值为 255 的正方形(使用 floodfill 算法)。
def FF(matrix,x,y,h): #h is chosen <=50
stack=[]
matrix[x,y]=255
stack.append((x,y))
while stack!=[]:
(x,y)=stack[0]
stack.pop()
if matrix[x-1,y] <= h: #Pixel North
matrix[x-1,y]=255
stack.append((x-1,y))
if matrix[x,y+1] <= h: #Pixel East
matrix[x,y+1]=255
stack.append((x,y+1))
if matrix[x+1,y] <= h: #Pixel South
matrix[x+1,y]=255
stack.append((x+1,y))
if matrix[x,y-1] <= h: #Pixel West
matrix[x,y-1]=255
stack.append((x,y-1))
if matrix[x-1,y+1] <= h: #Pixel North East
matrix[x-1,y+1]=255
stack.append((x-1,y+1))
if matrix[x+1,y+1] <= h: #Pixel South East
matrix[x+1,y+1]=255
stack.append((x+1,y+1))
if matrix[x+1,y-1] <= h: #Pixel South West
matrix[x+1,y-1]=255
stack.append((x+1,y-1))
if matrix[x-1,y-1] <= h: #Pixel North West
matrix[x-1,y-1]=255
stack.append((x-1,y-1))
else:
print ('... finished')
return
我不知道为什么,但代码运行了 10 次,但不会更多。
谢谢Q
问题出在这里:
(x,y)=stack[0] # get the first element of the list
stack.pop() # remove the *last* element
由于您获得了第一个元素,但删除了最后一个元素,因此有可能(就像并且可能总是这样),不会 将评估所有被推送的元素在堆栈上。
尽管如此,您还是太复杂了。简单地写:
def FF(matrix,x,y,h): #h is chosen <=50
stack=[(x,y)]
m,n = matrix.shape
while stack:
x,y = stack.pop()
if 0 <= x < m and 0 <= y < n and matrix[x,y] <= h: # check bounds and height
matrix[x,y] = 255 # set the value
stack.append((x-1,y-1)) # add all directions to the stack, we check later
stack.append((x,y-1))
stack.append((x+1,y-1))
stack.append((x-1,y))
stack.append((x+1,y))
stack.append((x-1,y+1))
stack.append((x,y+1))
stack.append((x+1,y+1))