Isolar a parte não desfocada da imagem foucsed

10

Tenho uma imagem tirada por uma câmera de celular com foco em uma parte, digamos, um rosto ou o que seja. Eu quero saber - aproximadamente - onde fica a área focada. Por exemplo, uma caixa delimitadora em torno da área focada. exemplo: Original Após a detecção

Humam Helfawi
fonte

Respostas:

7

Em geral, esse é um problema de segmentação de imagem ( http://en.wikipedia.org/wiki/Image_segmentation ) no qual você está tentando isolar as regiões focada nas não focadas da imagem.

De qualquer forma, as lentes ópticas são equivalentes aos filtros passa-baixo e o efeito de um filtro passa-baixo em um sinal é suavizá-lo limitando o conteúdo de frequência mais alta.

No processamento de imagens digitais, as frequências baixas correspondem a objetos grandes (forma geral) e as frequências mais altas correspondem a objetos pequenos (detalhes).

Portanto, para isolar a região focada, você pode procurar por áreas com um desvio padrão mais alto em relação às áreas desfocadas, com um desvio padrão mais baixo devido à operação de suavização da lente fora de foco.

M×N

M×N

No caso da imagem em sua postagem, é provável que o histograma exiba dois modos. Um correspondente a valores relativamente altos de desvio padrão (área focada) e um correspondente a valores relativamente baixos de desvio padrão (áreas desfocadas).

Você pode posicionar um limite, por exemplo, apenas entre os dois modos para estabelecer um critério entre suas regiões focadas e não focadas e, em seguida, selecionar todos os "patches" (ou áreas da janela MxN) cujo desvio padrão seja maior que o seu limite. (Para mais informações, consulte: http://en.wikipedia.org/wiki/Thresholding_%28image_processing%29 )

Isso isolará as partes focadas da imagem para você.

Espero que isto ajude.

A_A
fonte
Vou fazer uma leitura profunda da sua resposta e voltar com um feedback. Muito obrigado
Humam Helfawi
Muito obrigado, ótima e detalhada resposta, vou compartilhar a implementação se obtiver bons resultados usando o opencv, obrigado novamente
Humam Helfawi
A propósito, um representante cinza da imagem é suficiente ou eu preciso processar cada canal?
Humam Helfawi 27/03
Que bom que você achou útil. Trabalhar em escala de cinza funcionaria bem para a discriminação entre áreas desfocadas e focadas, mas incluir informações adicionais sobre cores pode ajudá-lo a prescrever áreas mais complexas (por exemplo, rastrear a área de um rosto em um retrato ou isolar apenas a flor da foto em sua postagem).
um_um
A questão foi editada de volta à sua forma original, seguindo a discussão em: meta.dsp.stackexchange.com/questions/1337/… @ vast-academician Adicione seus comentários como uma resposta separada. A parte principal foi preservada em: pastebin.com/kjCC1wM6
A_A 7/16
5

Aqui está uma abordagem mais fácil, que não envolve análise de janela deslizante.

  • Converta sua imagem em escala de cinza (isso não é necessário, mas presumo que você tenha apenas um canal por uma questão de clareza)

  • Calcular o gradiente nas duas direções

  • Calcular a magnitude (ou apenas o quadrado do gradiente)

  • Soma ambas as imagens de gradiente nas duas direções

Como já foi dito, a parte focada da imagem terá frequências mais altas que a área não focada. A partir do somatório, você terminará com duas projeções, nas quais há muita variação (valores mais altos) naquela parte em que o objeto focado é colocado nessa direção. Agora você pode fazer o seguinte:

  • Determine o ponto inicial e final desses valores mais altos. Você pode usar um limite simples (por exemplo, 0,7 * valor máximo) ou suavizar os perfis, obter a segunda derivada e verificar os valores mais altos existentes.

  • As posições Iniciar / Parar da etapa anterior fornecem as posições dos pixels nas duas direções onde colocar o retângulo indicador da área de nitidez.

M529
fonte