Existe um algoritmo adequado para detectar a cor de fundo de uma figura?

Para a faculdade, recebemos uma tarefa em que, dada uma imagem, temos que identificar as "figuras", a cor delas e a quantidade de "grupos de pixels" dentro delas. Deixe-me explicar:

A imagem acima tem umfigura (na imagem pode haver várias figuras, mas vamos esquecer isso por enquanto).

A cor de fundo da tela é o pixel em 0,0 (neste caso, amarelo)A cor da borda da figura é preta (pode ser qualquer cor diferente da cor de fundo da tela).A cor de fundo da figura é branca (também pode ser a mesma que a cor de fundo da tela).Uma figura só pode ter uma cor de fundo.Existem dois grupos de pixels na figura. Um é um conjunto de pixels azuis e o outro é um conjunto de vermelhos com algum verde no interior. Como você pode ver, não importa a cor dos pixels do grupo de pixels (é apenas diferente da cor de fundo da figura). O que importa é o fato de que eles estão em contato (mesmo na diagonal). Portanto, apesar de ter duas cores diferentes, esse grupo é considerado apenas um.Como você pode ver, a borda pode ser tão irregular quanto você desejar. Só tem, no entanto, uma cor.Sabe-se que um grupo de pixels não tocará na borda.Disseram-me que as cores de um grupo de pixels podem ser qualquer uma, exceto a cor de fundo da figura. Eu suponho que, em seguida, pode ser o mesmo que a cor da borda da figura (preto).

Nos foi dada uma classe capaz de capturar imagens e convertê-las em uma matriz (cada elemento sendo um inteiro representando a cor do pixel).

E é isso. Eu estou fazendo isso com Java.

O que eu fiz até agora?

Iterar através de cada pixel na matrizSe eu encontrar um pixel diferente da cor de fundo, assumirei que ele pertence à borda da figura. Eu vou chamar isso de pixelinitialPixel de agora em diante.Note que oinitialPixel na imagem que forneci é esse pixel preto no canto superior esquerdo da figura. Eu fiz um corte afiado lá propositadamente para ilustrar isso.Minha missão agora é encontrar a cor de fundo da figura (neste caso, branco).

Mas estou tendo muito trabalho para encontrar essa cor de fundo (branco). Este é o método mais próximo que eu fiz, que funcionou em alguns casos - mas não com esta imagem:

Desde que eu conheço a cor da borda, eu poderia encontrar a primeira cor diferente que é para osul doinitialPixel. Parecia uma boa ideia - funcionava às vezes, mas não funcionava com a imagem fornecida: ela retornaria amarela nesse caso, já queinitialPixel está bem longe do conteúdo da figura.

Supondo que eu encontrei a cor de fundo da figura (branco), minha próxima tarefa seria perceber que existem dois grupos de pixels dentro da figura. Este parece mais fácil:

Como agora conheço a cor de fundo da figura (branco), posso tentar iterar através de cada pixel dentro da figura e, se eu encontrar uma que não pertença à borda e não faça parte do plano de fundo da figura, já posso dizer que existe um grupo de pixels. Eu posso começar uma função recursiva para encontrar todos os pixels relacionados a esse grupo e "sinalizá-los" para que, no futuro, eu possa ignorar completamente esses pixels.

O QUE EU PRECISO

Sim, meu problema é sobre como encontrar a cor de fundo da figura (lembre-se que ela pode ser igual à cor de fundo da imagem inteira - por enquanto é amarela, mas pode ser branca também) com base no que descrevi anteriormente.

Eu não preciso de nenhum código - estou tendo problemas para pensar em um algoritmo adequado para isso. O fato de a fronteira poder ter linhas irregulares tão estranhas está me matando.

Ou melhor ainda: andei fazendo errado o tempo todo? Talvez eu não devesse ter me concentrado tanto nissoinitialPixel em absoluto. Talvez um tipo diferente de método inicial teria funcionado? Existem documentos / exemplos sobre tópicos como este? Eu percebo que há muita pesquisa sobre "visão computacional" e tal, mas não consigo encontrar muito sobre esse problema específico.

ALGUM CÓDIGO

Minha função para recuperar um vetor com todas as figuras: * Nota:Figure é apenas uma classe que contém alguns valores como a cor do plano de fundo e o número de elementos.

public Figure[] getFiguresFromImage(Image image) {
    Figure[] tempFigures = new Figure[100];
    int numberOfFigures = 0;
    matrixOfImage = image.getMatrix();
    int imageBackgroundColor = matrixOfImage[0][0];
    int pixel = 0;

    for (int y = 0; y < matrixOfImage.length; ++y) {
        for (int x = 0; x < matrixOfImage[0].length; ++x) {
            pixel = matrixOfImage[y][x];
            if (!exploredPixels[y][x]) {
                // This pixel has not been evaluated yet
                if (pixel != imageBackgroundColor ) {
                    // This pixel is different than the background color
                    // Since it is a new pixel, I assume it is the initial pixel of a new figure
                    // Get the figure based on the initial pixel found
                    tempFigures[numberOfFigures] = retrieveFigure(y,x);
                    ++numberOfFigures;
                }
            }
        }   
    }

    // ** Do some work here after getting my figures **

    return null;
}

Então, claramente, a funçãoretrieveFigure(y,x) é o que eu estou sendo incapaz de fazer.

Notas:

Para fins de aprendizado, eu não deveria estar usando nenhuma biblioteca externa.

questionAnswers(2)

yourAnswerToTheQuestion