Pergunta

Eu tenho uma imagem com linhas horizontais e verticais. Na verdade, esta imagem é o site da BBC convertidos em linhas horizontais e verticais. Meu problema é que eu quero ser capaz de encontrar todos os retângulos na imagem. Eu quero escrever um programa de computador para encontrar todos os retângulos. Alguém sabe como fazer isso ou sugerir idéias sobre como começar? Esta tarefa é fácil para mim como uma pessoa para encontrar os retângulos visuais, mas eu não sei como descrevê-lo como um programa.

Imagem é o site da BBC aqui http://www.bbc.co.uk/


Update para isso, eu escrevi o código que converte a imagem site da BBC para a linha horizontal e vertical, o problema é que essas linhas não completamente atender nos cantos e às vezes eles não formam completamente um retângulo. Obrigado!

Foi útil?

Solução

opencv (processamento de imagem e biblioteca de visão computacional escrito em c) tem de implementação para transformada de Hough ( o simples transformada de Hough linhas encontrar em uma imagem, enquanto os generalizadas se encontra objetos mais complexos) de modo que poderia ser um bom começo. Para os retângulos que têm cantos fechados também existem detectores de canto, como cornerHarris que pode ajudar.

Eu corri os houghlines demo oferecido com opencv e aqui está o resultado na imagem que você deu (linhas detectadas marcado em vermelho): text alt
(fonte: splintec.com )

Outras dicas

Eu acredito que você está procurando o generalizada Hough transformar .

Na visão de computador há um algoritmo chamado Generalized Transformada de Hough que talvez pode resolver seu problema . Deve haver código-fonte aberto tendo implementado este algoritmo. Basta procurar por ele.

Assumindo que é uma imagem razoavelmente livre de ruído (não um vídeo de uma tela), em seguida, um dos simples algoritmos FloodFill deve funcionar. Talvez seja necessário executar um dilate / corroer na imagem para fechar as lacunas.

O caminho normal para encontrar linhas é uma transformada de Hough (em seguida, encontrar linhas com ângulos retos) Opencv é a maneira mais fácil.

Dê uma olhada esta pergunta OpenCV Object - Centre Point

Existem várias abordagens diferentes para o seu problema. Eu usaria uma imagem de morfológica processamento ferramenta como esta . Você terá a flexibilidade para definir "retângulo" mesmo algo que não é "exatamente fechada" (onde o algoritmo de preenchimento irá falhar).

Outra possibilidade poderia ser a utilização de um aprendizagem de máquina abordagem, que basicamente é mais data- dirigido do que a definição orientada como o anterior. Você vai ter que dar o seu algoritmo de vários "exemplos" do que um retângulo é, e ele acabará por aprender (com um preconceito e uma taxa de erro).

iterate da esquerda para a direita até que você acertar um pixel de cor algoritmo de inundação preenchimento Em seguida, use modificado. mais informações sobre a algo inundação preenchimento @ wiki

Outra abordagem seria encontrar pixels QUALQUER cor na imagem, em seguida, ir com

while(pixel under current is colored)
{
  lowest pixel coordinate = pixel under current
  current = pixel under
}

Então faça o mesmo para cima. agora u ter definido uma única linha. em seguida, usar extremidades das linhas para coincidir com aprox linhas em retângulos. se eles não são de pixel perfeito que você poderia fazer algum tipo de tresholding.

O preenchimento inundação iria funcionar, ou você poderia usar uma modificação de um algoritmo de rastreamento borda.

o que você faz é: criar uma matriz 2D (ou qualquer outra estrutura de dados D2) - cada linha representa uma linha de pixel horizontal na tela, e cada coluna uma linha vertical

percorrer todos os pixels, esquerda para a direita, e sempre que você encontrar um colorido adicionar suas coordenadas para a matriz

iteração através da matriz e findying linhas e armazenar o pixel de início e de fim para cada uma (estrutura de dados diferente)

sabendo que o início de cada linha é a sua esquerda / pixel topo, você pode facilmente verificar para ver se nenhuma 4 linhas compreendem um retângulo

Para obter a partir da imagem que você tem com as linhas horizontais e verticais quase tocando para apenas os retângulos:

  1. converter para binário (ou seja, todas as linhas são brancos, o resto é preto)
  2. Realizar um Binary dilatação (aqui você fazer cada pixel que toca um pixel branco na imagem de origem ou é um pixel branco no branco imagem de origem. touch é reta única (para cada pixel "toca" os pixels à sua esquerda, direita, acima e abaixo dele) isso é chamado de "4-conectado"
  3. Repita o passo 3 algumas vezes se os espaços entre as extremidades são maiores, em seguida, 2 pixels de largura, mas não com muita freqüência!
  4. Execute uma operação de esqueleto (aqui você fazer cada pixel no preto imagem de saída se é um pixel branco na imagem de origem que toca pelo menos um pixel preto e os pixels brancos que toca (na imagem de origem) tudo eachother toque . Mais uma vez toque definido com 4-conexão. Veja exemplo abaixo.
  5. Repita o passo 4 até que a imagem não mudar depois de uma repetição (todos os pixels brancos são fins de linha ou conectores)

Esta vontade, com um pouco de sorte, em primeiro lugar mostrar as caixas com linhas de gordura de espessura, deixando artefactos de gordura de espessura em todo o imagem (após o passo 3) e, em seguida, em seguida, depois do passo 5 terão sido removidos todos os artefactos de gordura de espessura, enquanto todas as caixas permanecem. Você precisa tweek o número de repetições no passo 3 para melhores resultados. Se você estiver interessado em morfologia imagem, este é o livro de realmente um bom curso introdutório que eu tomei.

Amostra: (0 = preto, 1 = branco, pixels no centro de cada bloco de 3x3 está sendo considerado, a entrada esquerda, direita saída)

011 => 011    
011 => 001  all other white pixels touch, so eliminate      
011 => 011    

010 => 010    
010 => 010  top pixel would become disconnected, so leave      
010 => 010    

010 => 010    
010 => 000  touches only one white pixel, so remove     
000 => 000    

010 => 010    
111 => 111  does not touch black pixels, leave    
010 => 010    

010 => 010    
011 => 011  other pixels do not touch. so leave    
000 => 000    
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top