Seed Fill , también conocido como flood fill , es un algoritmo utilizado para identificar rutas conectadas en una región cerrada definida. El algoritmo tiene una variedad de aplicaciones prácticas, tales como:
- Búsqueda de rutas optimizada
- Paint Bucket Tool, una herramienta genérica que se encuentra en varios paquetes de procesamiento de imágenes, utiliza el algoritmo internamente
- La resolución de laberintos utiliza el relleno de inundación (junto con algoritmos transversales como primero en amplitud, primero en profundidad y algoritmos de búsqueda de caminos como A Star , Dijkstra )
- Utilizado en el procesamiento de imágenes
Hay varias formas en que el algoritmo podría implementarse, tales como:
- Scanline Floodfill (relleno de inundación basado en filas/columnas)
- Relleno de inundación de cuatro/ocho vías
- Umbral menos Floodfill (utilizando solo valores de píxeles idénticos)
Utilizaremos el algoritmo de inundación para realizar tareas de procesamiento de imágenes. Para este propósito, usaremos la pillow
biblioteca. Para instalar la biblioteca, ejecute el siguiente comando en la línea de comandos:-
pip install pillow
Nota: Varias distribuciones de Linux tienden a tener Python y Pillow preinstalados.
Sintaxis: ImageDraw.floodfill(image, seed_pos, replace_val, border-Ninguno, thresh=0)
Parámetros:
imagen : objeto de imagen abierta (obtenido a través de Image.open, Image.fromarray, etc.).
seed_pos : posición de la semilla (coordenadas del píxel de donde se obtendría el valor de la semilla).
replace_val : color de relleno (el valor del color que se usaría para el reemplazo).
border : valor de borde opcional (modifica la selección de ruta según el color del borde)
thresh : valor de umbral opcional (utilizado para proporcionar tolerancia en el relleno de inundación, para incorporar regiones de píxeles de valor similar)Return: NoneType (modifica la imagen en su lugar, en lugar de devolver la imagen modificada)
Ejemplo:
Imagen utilizada:
# Importing the pillow library's # desired modules from PIL import Image, ImageDraw # Opening the image (R prefixed to # string in order to deal with '\' # in paths) img = Image.open(R"sample.png") # Converting the image to RGB mode img1 = img.convert("RGB") # Coordinates of the pixel whose value # would be used as seed seed = (263, 70) # Pixel Value which would be used for # replacement rep_value = (255, 255, 0) # Calling the floodfill() function and # passing it image, seed, value and # thresh as arguments ImageDraw.floodfill(img, seed, rep_value, thresh=50) # Displaying the image img.show()
Producción:
Explicación:
- Después de importar los módulos necesarios para la tarea, primero creamos un objeto de imagen (
'PIL.Image.Image'
). Estos objetos de imagen actúan como una copia interna separada del archivo de imagen, que podría usarse por separado. - Luego asigne un valor de coordenadas (dimensiones internas de la imagen) para la variable inicial. Las coordenadas se seleccionan manualmente, es decir, el usuario debe ingresar el valor de la coordenada que se selecciona intencionalmente (el valor de la coordenada del píxel se puede verificar usando
img.getpixel(coord)
). - El valor de píxel obtenido a partir de estas coordenadas sería el que se va a reponer dentro de la imagen.
- Luego asigne
rep_value
una variable con un valor de color RGB (amarillo en este caso). El valor se asigna como una Tupla RGB, que es específica para nuestro caso particular ya que nuestra imagen de entrada es del espacio de color RGB (img.mode == 'RGB'
).Nota: La variable rep_value contendrá valor según el modo de imagen de la imagen actual, es decir, si
img.mode == "L"
entonces rep value no será de tupla con 3 componentes, sino que será de número entero. - Luego llame a la
ImageDraw.floodfill()
función pasando img, seed, rep_value y thresh como argumentos. Dado que laImageDraw.floodfill()
función modifica el objeto de imagen pasado en el lugar, no necesitamos almacenar el valor de retorno (Nonetype) de la función. - Al final mostramos la imagen modificada, usando
img.show()
( Image.show() ).