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.