Flood Fill Algorithm Python

前端 未结 3 1279
孤城傲影
孤城傲影 2020-12-29 14:42

So I\'m trying to create a flood fill algorithm and I keep getting a recursion error with this. The algorithm seems to have infinite recursion and I cannot pinpoint why. I

3条回答
  •  粉色の甜心
    2020-12-29 15:29

    This has not been tested but is based mostly off the code you provided. It should work and provides an alternative method of implementing the floodfill algorithm. The function could be more efficient.

    import PIL
    import random
    import collections
    
    WHITE = 255, 255, 255
    BLACK = 0, 0, 0
    RED = 255, 0, 0
    
    def main(width, height):
        flood = PIL.Image.new('RGB', (width, height), BLACK)
        # Create randomly generated walls
        for x in range(width):
            for y in range(height):
                flood.putpixel((x, y), BLACK if random.random() < 0.15 else WHITE)
        # Create borders
        for x in range(width):
            for y in range(height):
                if x in {0, width - 1} or y in {0, height - 1}:
                    flood.putpixel((x, y), BLACK)
        floodfill(50, 25, RED, image)
        # Save image
        image.save('flood.png')
    
    def floodfill(x, y, color, image):
        # if starting color is different from desired color
        #     create a queue of pixels that need to be changed
        #     while there are pixels that need their color changed
        #         change the color of the pixel to what is desired
        #         for each pixel surrounding the curren pixel
        #             if the new pixel has the same color as the starting pixel
        #                 record that its color needs to be changed
        source = image.getpixel((x, y))
        if source != color:
            pixels = collections.deque[(x, y)]
            while pixels:
                x, y = place = pixels.popleft()
                image.putpixel(place, color)
                for x_offset in -1, 1:
                    x_offset += x
                    for y_offset in -1, 1:
                        y_offset += y
                        new_place = x_offset, y_offset
                        if image.getpixel(new_place) == source:
                            pixels.append(new_place)
    
    if __name__ == '__main__':
        main(100, 50)
    

提交回复
热议问题