Domanda

Ho un'applicazione che accetta le immagini come input e rimuove lo sfondo su cui è stata scattata l'immagine. Ad esempio, se passi un'immagine di un libro su una coperta, l'immagine risultante sarà solo il libro con uno sfondo trasparente.

Il problema che ho è quando inserisci un'immagine che contiene un grande spazio vuoto, ad es. una fascia elastica. L'algoritmo di allagamento inizia agli angoli dell'immagine e rimuove lo sfondo dell'immagine, ma ovviamente non arriva mai all'interno della fascia elastica.

Esiste un modo per implementarlo in modo tale che io possa prendere un'immagine di un cerchio chiuso su uno sfondo e tornare indietro solo il ciclo stesso, senza sfondo all'interno o all'esterno di esso?

È stato utile?

Soluzione

Questa domanda e le sue risposte risolvono un problema molto simile.

Altri suggerimenti

Potresti sempre ricampionare l'immagine dopo ogni riempimento di inondazione e riavviarla ogni volta che trovi un colore che corrisponde allo sfondo originale.

Gli algoritmi di riempimento Flood sono progettati per iniziare in un punto e da lì riempire un'area vincolata, un'area di colori simili. Il cerchio non corrisponde a quel colore di sfondo, quindi l'algoritmo di riempimento non "salta" per trovarne altri.

La soluzione è inondare aree diverse.

Ecco un algoritmo molto grezzo, ricorsivo, di riempimento lento (da memoria, non testato):

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);
        }
    }
}

puoi capire qual è il colore predominante dello sfondo (cosa che dovresti essere in grado di fare poiché sei in grado di rimuovere lo sfondo iniziando dagli angoli) e cercare quel colore ovunque nell'immagine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top