Pergunta

Estou tentando desenvolver um algoritmo de foco de imagem para alguns trabalhos de automação de testes.Eu escolhi usar o AForge.net, pois parece um sistema amigável e maduro para .net.

Infelizmente, não consigo encontrar informações sobre a construção de algoritmos de foco automático do zero, então tentei o meu melhor:

tire uma imagem.aplique o filtro de detecção de borda sobel, que gera um contorno de borda em escala de cinza.gere um histograma e salve o desenvolvimento padrão.mova a câmera um passo mais perto do assunto e tire outra foto.se o desenvolvimento padrão for menor que o anterior, teremos mais foco.caso contrário, ultrapassamos a distância ideal para tirar fotos.

Existe uma maneira melhor?

atualizar:A propósito, uma falha ENORME nisso.como eu consigo passado ponto de foco ideal, meu valor de "imagem em foco" continua crescendo.você esperaria uma função parabólica olhando para o valor de distância/foco, mas na realidade você obtém algo que é mais logarítmico

atualização 2:ok, voltei a isso e o método atual que estamos explorando recebe algumas arestas conhecidas (ok, então eu sei exatamente quais são os objetos na imagem), faço uma comparação manual de intensidade de pixel.à medida que o gráfico resultante fica mais íngreme, fico mais focado.Postarei o código assim que o algoritmo principal for portado do matlab para c # (sim, matlab ..:S)

atualização 3:oba atualização final.voltei a isso novamente.o código final fica assim:

passo 1:obter imagem da lista de imagens (tirei cem fotos através do ponto focado)

passo 2:encontre uma borda para o objeto que estou focando (no meu caso, é um objeto retangular que está sempre no mesmo lugar, então recortei um retângulo ALTO e ESTREITO de uma borda)

etapa 3:obtenha o HorizontalIntensityStatistics (classe Aforge.net) para essa imagem cortada.

Passo 4:pegue o histograma (cinza, no meu caso)

passo 5:encontre a derivada dos valores do histograma

etapa 6:quando sua inclinação é maior, é quando você está no ponto mais focado.

Foi útil?

Solução

Pode ser um pouco simplista para suas necessidades, mas tive bons resultados com um algoritmo simples que analisa a diferença para os pixels vizinhos. A soma da diferença de pixels 2-Away parece ser uma medida razoável de contraste da imagem. Não consegui encontrar o artigo original de Brenner nos anos 70, mas é mencionado em http://www2.die.upm.es/im/papers/autofocus.pdf

Outra questão é quando a imagem está extremamente fora de foco, há muito poucas informações de foco, por isso é difícil dizer qual caminho está "se aproximando" ou para evitar um máximo local.

Outras dicas

Você pode dar uma olhada na técnica usada no NASA Curiosity Mars Rover.

A técnica é descrita neste artigo

Edgett, Kenneth S., et al. Investigação de Imager de Lente Hand (Mahli) da Curiosity. Revisões de ciências espaciais, 2012, 170.1-4: 259-317.

que está disponível como um PDF aqui.

Citando do artigo:

7.2.2 foco automático

Prevê -se que o foco automático seja o principal método pelo qual Mahli está focado em Marte. O comando de foco automático instrui a câmera a se mover para uma posição de contagem de motor inicial especificada e coletar uma imagem, mover um número especificado de etapas e coletar outra imagem e continuar fazendo isso até atingir um número total comandado de imagens, cada uma separada por um motor especificado Conte incremento. Cada uma dessas imagens é compactada JPEG (grupo de especialistas fotográficos conjuntos; ver CCITT (1993)) com o mesmo fator de qualidade de compressão aplicado. O tamanho do arquivo de cada imagem compactada é uma medida dos detalhes da cena, que, por sua vez, é uma função do foco (uma imagem em foco mostra mais detalhes do que uma visão embaçada, fora de foco da mesma cena). Conforme ilustrado na Fig. 23, a câmera determina a relação entre o tamanho do arquivo JPEG e a contagem de motores e se encaixa em uma parábola para os três tamanhos máximos de arquivo vizinhos. O vértice da parábola fornece uma estimativa da melhor posição de contagem de motores de foco. Tendo feito essa determinação, Mahli move o grupo de foco da lente para a melhor posição do motor e adquire uma imagem; Esta imagem é armazenada, as imagens anteriores usadas para determinar a posição de foco automático não são salvas.

O foco automático pode ser realizado em todo o campo de visão Mahli, ou pode ser realizado em um sub-quadro que corresponde à parte da cena que inclui o (s) objeto (s) a ser estudado. Dependendo da natureza do sujeito e do conhecimento das incertezas no posicionamento robótico do braço de Mahli, os usuários podem optar por adquirir um sub-quadro de foco automático centralizado ou podem selecionar um sub-quadro de foco automático fora do centro se o conhecimento do posicionamento for suficiente para determinar onde O sub-quadro deve estar localizado. O uso de sub-quadros para executar o foco automático é altamente recomendado porque isso geralmente resulta no assunto em melhor foco do que é o caso quando o foco automático é aplicado ao CCD completo; Além disso, a posição de contagem de motor resultante da foco automático usando um sub-quadro geralmente resulta em uma determinação mais precisa da distância de trabalho da escala de pixels.

O seguinte é a Figura 23:

Autofocus in NASA Curiosity Mars Rover

Essa ideia foi sugerida também nesta resposta: https://stackoverflow.com/a/2173259/15485

Isso pode ser útil. É como o sistema AF da câmera realmente funciona - Foco automático passivo

Medição de contraste

A medição de contraste é alcançada medindo o contraste dentro de um campo de sensor, através da lente. A diferença de intensidade entre os pixels adjacentes do sensor aumenta naturalmente com o foco correto da imagem. O sistema óptico pode ser ajustado até que o contraste máximo seja detectado. Nesse método, a FA não envolve a medição real da distância e geralmente é mais lenta que os sistemas de detecção de fase, especialmente ao operar sob frima luz. Como não usa um sensor separado, no entanto, o foco automático de detecção de contraste pode ser mais flexível (como é implementado no software) e potencialmente mais preciso. Este é um método comum em câmeras de vídeo e câmeras digitais em nível de consumidor que não possuem persianas e espelhos reflexos. Algumas DSLRs (incluindo Olympus E-420, Panasonic L10, Nikon D90, Nikon D5000, Nikon D300 no modo de tripé, Canon EOS 5D Mark II, Canon EOS 50D) usam esse método ao focar em seus modos de visão ao vivo. Um novo sistema de lentes intercambiáveis, micro quatro terços, usa exclusivamente o foco automático de medição de contraste e diz-se que oferece desempenho comparável aos sistemas de detecção de fases.

Eu não construí um, mas meu primeiro pensamento seria fazer um DFT 2D em uma parte da imagem. Quando fora de foco, as altas frequências desaparecem automaticamente.

Para um protótipo preguiçoso, você pode tentar comprimir uma região da imagem com JPEG (alta qualidade) e observar o tamanho do fluxo de saída. Um grande arquivo significa muitos detalhes, o que implica que a imagem está em foco. Cuidado com a câmera não deve ser muito barulhenta e que você não pode comparar tamanhos de arquivo em diferentes cenas, é claro.

Embora o Sobel seja uma escolha decente, eu provavelmente escolheria fazer um cálculo de magnitude de borda nas projeções nas direções x e y em várias pequenas regiões representativas.Outra opção amigável para .NET baseada em OpenCV é @ http://www.emgu.com/wiki/index.php/Main_Page.

Gostaria de saber se o desvio padrão é a melhor opção: se a imagem ficar mais nítida, a imagem do filtro Sobel conterá pixels mais brilhantes nas bordas, mas ao mesmo tempo menos pixels brilhantes, porque as bordas estão ficando mais finas. Talvez você possa tentar usar uma média dos valores de pixel mais altos de 1% na imagem Sobel?

Outro sabor para a métrica de foco pode ser:

Pegue várias imagens e calcule -as (redução de ruído). Em seguida, FFT a imagem média e use a razão de energia alta e baixa de frequências. Quanto maior essa ração, melhor foco. Uma demonstração do MATLAB está disponível (excluindo o estágio médio) dentro das demos da caixa de ferramentas :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top