¿Cómo obtengo un algoritmo de relleno de inundación para hacer frente a los círculos cerrados?

StackOverflow https://stackoverflow.com/questions/1816809

  •  08-07-2019
  •  | 
  •  

Pregunta

Tengo una aplicación que acepta imágenes como entrada y elimina el fondo en el que se tomó la imagen. Por ejemplo, si pasa una imagen de un libro sobre una manta, la imagen resultante será solo el libro con un fondo transparente.

El problema que tengo es cuando ingresas una imagen que tiene un gran espacio vacío, p. Una banda elástica. El algoritmo de relleno comienza en las esquinas de la imagen y elimina el fondo de la imagen, pero, por supuesto, nunca llega al interior de la banda elástica.

¿Hay alguna forma de implementar esto de manera que pueda tomar una imagen de un círculo cerrado contra un fondo y volver solo al bucle en sí, sin fondo dentro o fuera de él?

¿Fue útil?

Solución

Esta pregunta , y sus respuestas abordan un problema muy similar.

Otros consejos

Siempre puede volver a muestrear la imagen después de cada relleno de inundación y reiniciarla cada vez que encuentre un color que coincida con el fondo original.

Los algoritmos de relleno de inundación están diseñados para comenzar en un punto, y desde allí llenar un área restringida, un área de colores similares. El círculo no coincide con ese color de fondo, por lo que el algoritmo de relleno no "salta". para encontrar a otros.

La solución es inundar diferentes áreas.

Aquí hay un algoritmo de relleno de inundación lento, recursivo y muy crudo (de memoria, no probado):

public void floodfill(Image img, int x, int y, Color oldColor, Color newColor) {
    // Check boundary
    if (img.contains(x, y)) {
        // Get current pixel color
        Color currentColor = img.getColor(x, y);
        // Check color match
        if (currentColor.equals(oldColor)) {
            // Set to new color
            img.setColor(x, y, newColor);

            // Start again on each of the neighbors
            floodFill(img, x - 1, y, oldColor, newColor);
            floodFill(img, x + 1, y, oldColor, newColor);
            floodFill(img, x, y - 1, oldColor, newColor);
            floodFill(img, x, y + 1, oldColor, newColor);
        }
    }
}

puede averiguar cuál es el color predominante del fondo (que debería poder hacer ya que puede eliminar el fondo comenzando en las esquinas) y buscar ese color en cualquier otro lugar de la imagen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top