Algoritmo para contagem de objetos em imagem

Para "abobrinhas" use o " Boteco"

Moderadores: andre_luis, 51, guest2003, Renie

Algoritmo para contagem de objetos em imagem

Mensagempor styg » 13 Out 2008 13:54

Dai pessoas, seguinte, to fazendo meu TCC, que vai precisar analisar e fazer a contagem de objetos de uma imagem (usando arm7).

Entao dei uma pesquisada pra ver qual a melhor maneira de faze-lo, pra quem entende, veja se a sequencia esta correta:

Obs. - Como nao implementei o prototipo ainda nao sei se os objetos que devem ser contados aparecerao claros em um fundo escuro ou vice-versa, mas acho que isso nao vai interferir, vamos la..

1 - gerar o histograma da imagem
2 - equalizar histograma pra aumentar contraste
3 - fazer a segmentacao da imagem em dois niveis (objetos e fundo)
4 - fazer a contagem

o passo 0 pode ser uma media de até 8 imagens (espaco que tenho disponivel) para diminuir o ruido, antes de iniciar.

Alguem tem conhecimento, e sabe do que estoou falando, é que estou meio perdido, isso dai eh tudo baseando em uns livros que olhei por ai.

ESQUECI O MOTIVO PRINCIPAL DO TOPICO
procurei e nao achei nenhum codigo pra fazer a contagem, tem algum nome especial, ou sabem de algum site etc..??

Dese ja agradeço!
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor joao » 13 Out 2008 18:30

Ola styg!

Olha, eu estou vendo isso também.
Mas ainda não entendi sobre o seu passo 3.

Aqui algumas dicas sobre os passos:
1 - Transforme a sua imagem em torno de cinza. Isso normalmente já tem pronto nas linguagens de programação e acho que irá lhe ajudar um monte.

2 - Agora que vem o milagre. :) Vc pega o seus tons de cinza e faz o histograma. dai, na minha opinião, para melhorar o constrate, vc pega e descarta os valores maximos que achou. Dai vc faz a média que irá usar para deixar ela em preto e branco. Exemplo:
tons de cinza vao de 0 a 255. Então vc ve os valores que tem. Dai vc descarta o menor valor e o maior valor, para melhorar o resultado. Dai vc pega o segundo menor valor e o segundo maior valor, soma, divide e divide por 2. Dai tudo que for maior que esse numero, é preto, tudo que for menor é branco. Eu faço assim e o resultado é muito bom.

3 - Não tenho nem idéia do que vc está falando aqui. O que vc poderia fazer é uma detecção de borda. Dai quem sabe com algumas modificações vc consiga pegar todos os objetos e conta-los. td neste item.

4 - Fica no passo 3 dai. :P

É isso. Eu sei que tem um método para detecção de borda, mas quem sabe vc consiga imaginar em algo apenas olhando o desenho. O que acha?

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor Jorge_Francisco » 13 Out 2008 18:43

Eu acho que beeem por alto seria isso:

Escala Gray.
Histograma.
Equalização do Histograma.
Binarização.
Segmentação(pode usar um filtro do tipo Laplaciano-Gaussiano).

Mas tudo depende da composição da imagem. Que tipo de objetos? Teria poucos objetos na imagem?etc,etc,etc.
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor Jorge_Francisco » 13 Out 2008 18:47

Se não quiser usar Laplace pode usar um Sobel da vida. Mas diga a composição da imagem aí.
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor styg » 13 Out 2008 20:57

Primeiro obrigado pelas respostas.

Entao, esqueci de falar q a imagem ja eh pb, entao um passo a menos.

Joao:
O passo 3 seria transformar a imagem em preto ou branco, pois mesmo com o contraste melhorado ainda sera uma imagem em tons de cinza.
Pelo que vi nos livros isso se chama segmentaçao.

Jorge:
Primeiro, pq beeem por alto? Se precisa de mais passos da um toque quais sao pra eu poder melhorar.
Pelo que vi voce descreveu bem parecido com o meu, tirando que, oq vc chamou de binarizaçao eu achava que fosse segmetaçao. sabe dizer a diferenca??

quanto a composiçao da imagem, vai c parecer com essa do matlab, só que serao objetos redondos, e alguns podem aparecer ligados.
http://images.google.com.br/imgres?imgurl=http://www.mathworks.com/access/helpdesk/help/toolbox/images/rice.gif&imgrefurl=http://www.mathworks.com/access/helpdesk/help/toolbox/images/imtophat.html&h=256&w=256&sz=59&hl=pt-BR&start=1&sig2=2MCCAa55VlaMnSPCaJKiTg&um=1&usg=__aWMlOUS8-VhRK9xGIvKxHVGQKDo=&tbnid=Myf3kxsU9loo-M:&tbnh=111&tbnw=111&ei=M-zzSIvhJIeEugXg34jZCA&prev=/images%3Fq%3Dmatlab%2Brice%26um%3D1%26hl%3Dpt-BR%26sa%3DN


na real minha maior preocupacao eh com a contagem desses objetos, pq se nao achar algoritmo pronto vou ter que fazer algo na mao.
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor Jorge_Francisco » 13 Out 2008 21:15

A imagem estava em escala de cinza, mas não 100%, por isso tem que GARANTIR passando para a escala GRAY. Binarizar significa colocar em dois tons, no caso preto e branco. Segmentar significa separar, no caso, separar objetos.

O filtro que falei, tanto sobel, quanto laplace, são super fáceis de implementar, mas só servem para detectar bordas e diversas direções e não para segmentar propriamente dito. Precisaria bolar um algoritmo para reconhecer padrões, aí sim fica um poquinho complicado. Se fossem circulos QUASE perfeitos ou perfeitos poderia usar o algoritmo de Hough.

Em todo caso, pela figura, vê-se que são objetos simples de serem detectados.

Aí um programinha que fiz processado na sua imagem.

ImagemImagem
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor chrdcv » 14 Out 2008 14:38

A contagem de pessoas utilizando um sinal previamente convertido de uma câmera p&b seria muito complicado? Para o pessoal com mais experiência, acham que um imx31 ou mesmo o 27 dariam conta do recado?

Obrigado pessoal!

christian
Avatar do usuário
chrdcv
Dword
 
Mensagens: 1580
Registrado em: 13 Out 2006 14:13

Mensagempor styg » 14 Out 2008 16:20

Primeiramente muito massa teu programa, é bem isso ai que to pretendendo, que linguagem usou no programa?

e pra fazer a contagem preciso antes fazer a detecção de borda?

e o que quer dizer que estava em escala de cinza, mas nao 100%??
passar pra escala gray seria espalhar melhor os pixels entre os valores possiveis? se for, isso seria o histogram equalization, nao?

pra contar precisaria fazer o algoritmo? po, pensei que isso fosse normal em pdi fazer contagm de objetos, vi tantos algoritmos meio sem nocao, e um basico desse nao tem disponivel?

vou dar uma olhada nesse algoritmo de Hough

e ja to pensando no algoritmo de contagem..
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor Jorge_Francisco » 14 Out 2008 16:42

Bom, a linguagem foi delphi-pascal, não uso ela no dia-a-dia, uso c++, mas independente da linguagem, fiz tudo na unha.

Passar uma imagem para a escala de Gray é facil, bastando que ela seja Bitmap 24 bits(ou 32).

Primeiro leia os canais RGB(Red,Green,Blue) do pixel, depois jogue na formula:

G = (0.3 *R + 0.59*G+ 0.11 B);

Então atribua este valor a cada canal do pixel, por exemplo supondo que o pixel tem o valor em RGB assim : (126,60,30), jogando na formula teremos :

G = (0.3 *126+ 0.59*60+ 0.11*30);
G = 76.5

Então o pixel ficaria com o valor RGB (76, 76, 76). Depois disso faz-se o histograma equalizado, na sua imagem a região de interesse encontra-se no "vale" do histograma e tem o valor aproximado de 130. Com esse valor setamos a binarização, ou seja, acima de 130 tudo é preto( RBG(0, 0, 0)) e abaixo tudo é branco(RGB(255, 255,255).

Depois pode-se aplicar um filtro de borda, como por exemplo Sobel, ou Laplaciano-Gaussiano. Que nada mais é do que multiplicar o valor do pixel processado aí de cima por uma matriz quadrática.

Para reconhecer o objeto terá que criar um padrão, ou bolar um algoritmo.

Sobre a binariação pode fazer uma média como o joão falou.

Vlw
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor joao » 14 Out 2008 16:51

Eu acho que não existe nada pronto para fazer essa contagem.
Sei que a transformada de hough tem para objetos assimétricos. tente dar uma procurada nisso.

Agora, o grande problema nesta imagem que vc passou por exemplo é a sobreposição dos objetos. Vc viu que existem dois ou mais graos que estão "unidos" na detecção da borda?

A minha idéia. Faz igual está na figura quatro do exemplo do Jorge(apenas as bordas)

Dai vc faz uma varredura por cada uma das bordas, "entra" nela e conta a quantidade de pixels brancos dentro dela e muda para vermelho, por exemplo. Quando acabar, continua a varredura. Com isso, vc terá a quantidade de items que vc quer, mas nao solucionará o problema de sobreposição.

Dai a segunda idéia. Vc faz a média de cada uma das "ilhas" brancas(os brancos dentro da borda) e com essa média vc verifica se existem ilhas muito maiores(que sejam quase o dobro) que a média e considera que é dois, pois houve uma sobreposição.

Dai acho que vc consegue solucionar o seu problema.

Espero que vc consiga entender essa idéia doida! :D

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor Jorge_Francisco » 14 Out 2008 16:51

Estou imaginando que algo proximo ao algoritmo de hough pode te ajudar a detectar.

Mas o que tem na figura, grãos?
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor Jorge_Francisco » 14 Out 2008 16:54

joao escreveu:Eu acho que não existe nada pronto para fazer essa contagem.
Sei que a transformada de hough tem para objetos assimétricos. tente dar uma procurada nisso.

Agora, o grande problema nesta imagem que vc passou por exemplo é a sobreposição dos objetos. Vc viu que existem dois ou mais graos que estão "unidos" na detecção da borda?

A minha idéia. Faz igual está na figura quatro do exemplo do Jorge(apenas as bordas)

Dai vc faz uma varredura por cada uma das bordas, "entra" nela e conta a quantidade de pixels brancos dentro dela e muda para vermelho, por exemplo. Quando acabar, continua a varredura. Com isso, vc terá a quantidade de items que vc quer, mas nao solucionará o problema de sobreposição.

Dai a segunda idéia. Vc faz a média de cada uma das "ilhas" brancas(os brancos dentro da borda) e com essa média vc verifica se existem ilhas muito maiores(que sejam quase o dobro) que a média e considera que é dois, pois houve uma sobreposição.

Dai acho que vc consegue solucionar o seu problema.

Espero que vc consiga entender essa idéia doida! :D

[]'s


Pqp, estava pensando nisso também, inclusive em pintar de vermelho, telepatia?hehehe.

Mas dá pra usar Hough em figura assimétrica mesmo com sobreposição de bordas.
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor Jorge_Francisco » 14 Out 2008 16:58

Como será implementado com arm7? Queria aprender tb,hehehe.
Seria um ótimo motivo para aprender ARM. E quem sabe trocarmos ideias.
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor joao » 14 Out 2008 17:29

Provavelmente ele irá trabalhar com um linux embarcado, o que vai facilitar um monte a vida dele. Eu pelo menos iria fazer isso! :D

Sei que pode-se fazer essas coisas com uma biblioteca chamada allegro que trabalha tanto em windows como linux. Ela dá suporte a abertura de imagens e tratamento das mesmas, além de lhe dar em RGB a cor de cada pixel e ainda fazer resize da imagem.

Realmente eu fui apenas escrevendo o que me veio em mente, nao cheguei a ver na web sobre a proposta que eu passei. Isso acaba de provar que a telepatia existe?!?!?! :D

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor Jorge_Francisco » 14 Out 2008 17:37

Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Próximo

Voltar para Assuntos Gerais

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x