Fiquei me perguntando se existe uma maneira de determinar se uma imagem está embaçada ou não, analisando os dados da imagem.
203
Fiquei me perguntando se existe uma maneira de determinar se uma imagem está embaçada ou não, analisando os dados da imagem.
Respostas:
Sim, ele é. Calcule a Transformada rápida de Fourier e analise o resultado. A transformação de Fourier informa quais frequências estão presentes na imagem. Se houver uma quantidade baixa de altas frequências, a imagem está tremida.
A definição dos termos 'baixo' e 'alto' depende de você.
Editar :
Conforme declarado nos comentários, se você quiser um único flutuador representando a desfocagem de uma determinada imagem, precisará elaborar uma métrica adequada.
a resposta da nikie fornece essa métrica. Convolve a imagem com um kernel da Lapônia:
E use uma métrica máxima robusta na saída para obter um número que você pode usar para limiar. Tente evitar suavizar demais as imagens antes de calcular o Laplaciano, porque você descobrirá apenas que uma imagem suavizada está realmente borrada :-).
fonte
Outra maneira muito simples de estimar a nitidez de uma imagem é usar um filtro Laplace (ou LoG) e simplesmente escolher o valor máximo. Usar uma medida robusta como um quantil de 99,9% é provavelmente melhor se você espera ruído (por exemplo, escolher o contraste N-mais alto em vez do contraste mais alto.) Se você espera um brilho variável da imagem, também deve incluir uma etapa de pré-processamento para normalizar o brilho da imagem / contraste (por exemplo, equalização do histograma).
Eu implementei a sugestão de Simon e essa no Mathematica, e tentei em algumas imagens de teste:
O primeiro teste desfoca as imagens de teste usando um filtro Gaussiano com um tamanho variável do kernel, calcula a FFT da imagem desfocada e calcula a média das frequências mais altas de 90%:
Resultar em um gráfico logarítmico:
As 5 linhas representam as 5 imagens de teste, o eixo X representa o raio do filtro gaussiano. Os gráficos estão diminuindo, portanto a FFT é uma boa medida de nitidez.
Este é o código para o estimador de desfocagem "LoG mais alto": ele simplesmente aplica um filtro LoG e retorna o pixel mais brilhante no resultado do filtro:
Resultar em um gráfico logarítmico:
A propagação para as imagens não desfocadas é um pouco melhor aqui (2,5 vs 3,3), principalmente porque esse método usa apenas o contraste mais forte na imagem, enquanto a FFT é essencialmente uma média sobre toda a imagem. As funções também estão diminuindo mais rapidamente, portanto, pode ser mais fácil definir um limite "embaçado".
fonte
Durante algum trabalho com uma lente de foco automático, deparei-me com um conjunto muito útil de algoritmos para detectar o foco da imagem . É implementado no MATLAB, mas a maioria das funções é bastante fácil de portar para o OpenCV com o filter2D .
É basicamente uma implementação de pesquisa de muitos algoritmos de medição de foco. Se você quiser ler os artigos originais, as referências aos autores dos algoritmos são fornecidas no código. O artigo de 2012 de Pertuz, et al. A análise dos operadores de medida de foco para a forma a partir do foco (SFF) fornece uma ótima revisão de todas essas medidas, bem como de seu desempenho (tanto em termos de velocidade quanto de precisão, conforme aplicado ao SFF).
EDIT: Adicionado código MATLAB, caso o link morra.
Alguns exemplos de versões do OpenCV:
Não há garantias de que essas medidas sejam ou não a melhor escolha para o seu problema, mas se você localizar os documentos associados a essas medidas, eles poderão fornecer mais informações. Espero que você ache o código útil! Eu sei que sim.
fonte
Aproveitando a resposta da Nike. É simples implementar o método baseado em laplaciano com opencv:
Retornará um breve, indicando a nitidez máxima detectada, que com base nos meus testes em amostras do mundo real, é um bom indicador de se a câmera está focada ou não. Não é de surpreender que os valores normais dependam da cena, mas muito menos do que o método FFT, que tem uma taxa alta de falsos positivos para ser útil na minha aplicação.
fonte
Eu vim com uma solução totalmente diferente. Eu precisava analisar os quadros estáticos de vídeo para encontrar o mais nítido em todos os quadros (X). Dessa forma, eu detectaria desfoque de movimento e / ou imagens desfocadas.
Acabei usando a detecção do Canny Edge e obtive resultados MUITO MUITO BONS com quase todo tipo de vídeo (com o método da nikie, tive problemas com vídeos VHS digitalizados e vídeos entrelaçados pesados).
Otimizei o desempenho definindo uma região de interesse (ROI) na imagem original.
Usando o EmguCV:
fonte
Obrigado, Nikie, pela ótima sugestão de Laplace. Os documentos do OpenCV me apontaram na mesma direção: usando python, cv2 (opencv 2.4.10) e numpy ...
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
numpy.max(cv2.convertScaleAbs(cv2.Laplacian(gray_image,3)))
resultado está entre 0-255. Descobri que algo acima de 200 está muito focado e, aos 100, está visivelmente embaçado. o máximo nunca fica muito abaixo dos 20, mesmo que esteja completamente desfocado.
fonte
Uma maneira que estou usando atualmente mede a propagação de bordas na imagem. Procure este artigo:
Geralmente fica atrás de um paywall, mas já vi algumas cópias gratuitas por aí. Basicamente, eles localizam bordas verticais em uma imagem e medem a largura dessas bordas. A média da largura fornece o resultado final da estimativa de desfoque para a imagem. Bordas mais amplas correspondem a imagens tremidas e vice-versa.
Esse problema pertence ao campo de estimativa da qualidade da imagem sem referência . Se você procurar no Google Scholar, terá muitas referências úteis.
EDITAR
Aqui está um gráfico das estimativas de desfoque obtidas para as 5 imagens no post da nikie. Valores mais altos correspondem a maior desfocagem. Usei um filtro Gaussiano de tamanho fixo 11x11 e variei o desvio padrão (usando o
convert
comando imagemagick para obter as imagens borradas).Se você comparar imagens de tamanhos diferentes, não se esqueça de normalizar pela largura da imagem, pois as imagens maiores terão bordas mais amplas.
Finalmente, um problema significativo é distinguir entre desfoque artístico e desfoque indesejado (causado por falta de foco, compressão, movimento relativo do objeto para a câmera), mas isso está além de abordagens simples como esta. Para um exemplo de desfoque artístico, dê uma olhada na imagem de Lenna: o reflexo de Lenna no espelho está embaçado, mas seu rosto está perfeitamente focado. Isso contribui para uma estimativa de desfoque mais alta da imagem Lenna.
fonte
Eu tentei solução com base no filtro Laplacian deste post. Isso não me ajudou. Então, tentei a solução deste post e foi bom para o meu caso (mas é lento):
Uma imagem menos desfocada tem um
sum
valor máximo !Você também pode ajustar a velocidade e a precisão alterando a etapa, por exemplo
esta parte
você pode substituir por este
fonte
As respostas acima elucidaram muitas coisas, mas acho que é útil fazer uma distinção conceitual.
E se você tirar uma foto perfeitamente focada de uma imagem borrada?
O problema de detecção de desfoque só é bem colocado quando você tem uma referência . Se você precisar projetar, por exemplo, um sistema de foco automático, compare uma sequência de imagens tiradas com diferentes graus de desfoque ou suavização e tente encontrar o ponto de desfoque mínimo nesse conjunto. Em outras palavras, você precisa fazer referência cruzada das várias imagens usando uma das técnicas ilustradas acima (basicamente - com vários níveis possíveis de refinamento na abordagem - procurando a imagem com o maior conteúdo de alta frequência).
fonte
O código Matlab de dois métodos que foram publicados em periódicos conceituados (IEEE Transactions on Image Processing) estão disponíveis aqui: https://ivulab.asu.edu/software
verifique os algoritmos CPBDM e JNBM. Se você verificar o código, não é muito difícil ser portado e, aliás, é baseado no método de Marzialiano como recurso básico.
fonte
Eu o implementei use fft no matlab e verifique o histograma da média de computação fft e std, mas também a função de ajuste pode ser feita
fonte
É o que faço no Opencv para detectar a qualidade do foco em uma região:
fonte