Como faço para obter um algoritmo de enchimento de inundação para lidar com círculos fechados?

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

  •  08-07-2019
  •  | 
  •  

Pergunta

Eu tenho um aplicativo que aceita imagens como entrada e remove o plano de fundo no qual a imagem foi capturada. Por exemplo, se você passar a imagem de um livro em um cobertor, a imagem resultante será apenas o livro com um fundo transparente.

O problema que tenho é quando você insere uma imagem que tem um grande espaço vazio, por exemplo, uma faixa elástica. O algoritmo de preenchimento de inundação começa nos cantos da imagem e remove o fundo da imagem, mas é claro que ele nunca chega ao interior da faixa elástica.

Existe uma maneira de implementar isso de modo que eu possa tirar uma imagem de um círculo fechado contra um fundo e recuperar apenas o loop, sem fundo dentro ou fora dele?

Foi útil?

Solução

Essa questão, e suas respostas abordam um problema muito semelhante.

Outras dicas

Você sempre pode reembolsar a imagem após cada enchimento de inundação e reiniciá -la sempre que encontrar uma cor que corresponda ao fundo original.

Os algoritmos de enchimento de inundação são projetados para começar em um local e, a partir daí, preenchem uma área restrita, uma área de cores semelhantes. O círculo não corresponde a essa cor de fundo, portanto o algoritmo de preenchimento não "pula" para encontrar outros.

A solução é inundar diferentes áreas.

Aqui está um algoritmo de enchimento muito grosseiro, recursivo e lento (da memória, não testado):

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

Você pode descobrir qual é a cor predominante do plano de fundo (o que você deve fazer, pois é capaz de remover o fundo que começa nos cantos) e procurar essa cor em qualquer outro lugar da imagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top