Processamento de imagem: como detectar uma placa quadrialteral na imagem?


14

Como posso detectar uma placa quadrilátero de uma imagem capturada usando um telefone celular? Como posso detectar formas como retângulo? retângulo arredondado (cantos arredondados em vez de cantos de forma)?

Estou usando o opencv.wrapper, mas sou novo nele.

Obrigado.

Aqui está o exemplo: alt text http://www.freeimagehosting.net/uploads/b03442fd36.png

texto alternativo http://www.freeimagehosting.net/uploads/e6b36040e8.png

Devido ao barulho e a muitas linhas, não consigo determinar qual é a linha de limite da placa. Às vezes, consigo encontrar o limite das linhas após a transformação de hough. Estou preso .... neste tipo de cenário ...

Esta é a 2 fotos cruas tiradas da câmera do telefone móvel

texto alternativo http://www.freeimagehosting.net/uploads/6dbd613edf.jpg texto alternativo http://www.freeimagehosting.net/uploads/720da20080.jpg

Preciso de conselhos para ver como posso processar a imagem para tirar a placa?

Muito obrigado


2
Palavras-chave: opencv, hough transform Duplicados: stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013

Sim, como transformar o FTW!

mas há ruído na imagem como posso descobrir qual é limite da tabuleta

@ xabi123: transformada de Hough, limiar, leu fronteira

1
Você poderia compartilhar uma imagem de amostra?

Respostas:


7

Suas duas imagens contêm muitas linhas que não têm nada a ver com o sinal que você está procurando. E algumas dessas linhas são mais longas / têm maior contraste do que as que você realmente deseja, então acho que detectar as linhas da borda (por exemplo, usando uma transformação hough ou resumindo os contrastes horizontal / verticalmente) não funcionará.

Mas: o sinal que você procura tem outras características que devem ser mais fáceis de detectar:

  • Há sinal de fundo tem brilho (quase) constante
  • Ocupa uma área relativamente grande da imagem
  • É perto do centro da imagem

Então, você está procurando uma grande área conectada com baixo contraste. Eu invadi um algoritmo de prova de conceito no Mathematica. (Eu não sou um especialista em OpenCV, mas mencionarei a respectiva função OpenCV quando os conhecer.)

Primeiro, uso filtros derivativos gaussianos para detectar a magnitude do gradiente em cada pixel. O filtro derivado gaussiano tem uma ampla abertura (11x11 pixels neste caso), por isso é muito insensível ao ruído. Em seguida, normalizo a imagem do gradiente para média = 1, para que eu possa usar os mesmos limites para as duas amostras.

src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];

Implementação do OpenCV: você pode usar sepFilter2Dpara a filtragem real, mas , aparentemente, precisará calcular os valores do kernel do filtro .

O resultado fica assim:

magnitude do gradiente

Nesta imagem, o fundo do sinal é escuro e as bordas do sinal são brilhantes. Para que eu possa binarizar esta imagem e procurar componentes conectados escuros.

binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];

Implementação do OpenCV: o limiar deve ser direto, mas acho que o OpenCV não contém análise de componentes conectados - você pode usar flood fill ou cvBlobsLib para isso.

Agora, encontre o maior blob próximo ao centro da imagem e o casco convexo (simplesmente usei o maior blob que não está conectado ao plano de fundo, mas isso pode não ser suficiente para todas as imagens).

Resultados: insira a descrição da imagem aqui insira a descrição da imagem aqui


0

Outra abordagem que você pode adotar que é mais robusta a ruídos nessa situação é gerar uma curva do nível médio de cinza da imagem ao longo do eixo xe do eixo y. Ou seja, calcule o nível de cinza médio para cada linha / coluna na imagem.

Se, por exemplo, a placa (ou suas bordas) for mais clara que o ambiente (que é o caso de todos os exemplos mostrados na pergunta), você terá dois picos em sua curva do eixo x (para as bordas esquerda e direita) ) e dois picos na curva do eixo y (para as bordas superior e inferior). Usando uma técnica de detecção de borda para um sinal de 1 dimensão (talvez um filtro passa-alto), é possível deduzir as coordenadas dos cantos da placa.

Eu já vi essa abordagem sendo usada para detectar placas de automóveis e também para reconhecimento de faces (o nariz tende a ser a parte mais brilhante da face, portanto gera um pico nas curvas dos eixos xe y).


hmm .. e se a placa for girada ou a câmera for rolada?
26412 Mustafa

0

Pode ser uma idéia invertida, mas vale a pena tentar. Em vez de tentar detectar o retângulo e pensar no texto como ruído , talvez você possa tratar o texto como informação e usá-lo para detectar o retângulo com mais facilidade.

Aqui está o esboço da ideia:

  • detectar o texto na imagem . Não precisa ser uma implementação robusta (você deve procurar no Google alguma pequena biblioteca que faça isso, ou talvez o OpenCV a possua), apenas uma estimativa aproximada do texto na imagem
  • encontre o centro de todas as detecções de texto . Mesmo com imagens barulhentas, deve estar em torno do lugar real
  • decida Hough retângulo na área ao redor das detecções de texto . Talvez use a distância média do centro das detecções de texto ou algo semelhante. Faça diâmetros diferentes e faça o recall mais forte .

As explicações e vantagens:

  • a área ao redor do texto geralmente é homogênea - o retângulo real deve ser o primeiro recall forte
  • dessa forma, você não precisa fazer a transformação de toda a imagem, para fazer isso de maneira mais estrutural (talvez várias vezes na mesma área, mas com diferentes tamanhos de caçamba ...)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.