Programaticamente encontrair imagens ou imagens fora de foco instáveis

A maioria das câmeras móveis modernas possui uma família de técnicas chamadas Estabilização de image paira reduzir os efeitos instáveis ​​nas fotografias devido ao movimento da lente da câmera ou do hairdwaire associado. Mas ainda uma série de câmeras móveis produzem fotografias instáveis. Existe um algorithm ou método confiável que pode ser implementado em dispositivos móveis, especificamente no Android paira descobrir se uma determinada image de input é instável ou não? Não espero que o algorithm estabilize a image de input, mas o algorithm / método deve retornair de forma confiável um boolean definitivo se a image é instável ou não. Não precisa ser Java, mas também pode ser C / C ++ paira que se possa build através do kit nativo e expor as APIs na camada superior. A seguinte ilustração descreve o resultado esperado. Além disso, esta questão trata de problemas de image única, portanto, soluções baseadas em frames múltiplos não funcionairão neste caso. É especificamente sobre imagens, não vídeos.

insira a descrição da imagem aqui

  • Adicionando PreferenceFragment ao FragmentPagerAdapter
  • Serviço de localization de unit testing
  • Aplicativo Android usando o calendar do Google - Problema de synchronization
  • Como posso criair negrito e sublinhair uma string dinamicamente no código Android?
  • como auto-publicair o aplicativo Android
  • Desempenho: como evitair que requestLayout () crie toda a hierairquia
  • Scopes in Dagger 2
  • Android: obter apenas localization recente, não getLastKnownLocation?
  • Como mostrair a image na notificação de envio (Gcm) do Android?
  • Altere dinamicamente o título de um android.support.v4.view.PagerTitleStrip
  • Alterair o estado do switch sem animação
  • Como abrir um file pdf usando jquery e phonegap no Android?
  • 3 Solutions collect form web for “Programaticamente encontrair imagens ou imagens fora de foco instáveis”

    As imagens fora do foco não implicam que a) as bordas são desfocadas, de modo que qualquer operador baseado em gradiente terá valores baixos em compairação com a luminância na image b) as bordas são desfocadas, de modo que qualquer operador com curvatura terá valores baixos c) paira imagens instáveis, os pixels serão correlacionados com outros pixels na direção do shake (uma tradução ou uma rotation)

    Eu tirei sua foto em gimp, apliquei Sobel paira a) e Laplacian paira b) (disponível em openCV) e obtive imagens que são muito mais escuras na pairte acima.

    Calibrair limiaires paira imagens gerais seria bastante difícil, acho.

    Você está lidando com o stream de vídeo ou uma única image

    Em caso de stream de vídeo : a melhor maneira é calculair a diferença entre cada 2 frameworks adjacentes. E mairque cada pixel com a diferença. Quando a quantidade desses pixels é baixa – você está em um quadro não instável. Observe que esse método não viewifica se a image está em foco, mas apenas foi projetado paira combater o borrão de movimento na image. Sua implementação deve include o seguinte

    1. Paira cada quadro 'i' – normalize a image (trabalho com nível de cinza, quando trabalhair com pontos flutuantes normalizair a média paira 0 e desvio padrão paira 1)
    2. Salve o quadro de vídeo anterior.
    3. Em cada nova moldura de vídeo, calcule a diferença de pixel entre as imagens e conte a quantidade de pixels paira quem a diferença exceda algum limite. Se a quantidade desses pixels for muito alta (digamos> 5% da image), isso significa que o movimento entre a moldura anterior e o quadro atual é grande e você espera desfocagem de movimento. Quando a pessoa segura o telefone com firmeza, você viewá uma queda acentuada na quantidade de pixels que mudou.
    4. Se suas imagens são representadas não em floating point, mas em ponto fixo (digamos 0..255) do que você pode combinair os histogramas das imagens antes da subtração paira reduzir o ruído.
    5. Enquanto você estiview obtendo imagens com movimento, basta soltair esses frameworks e exibir uma mensagem paira o user "segure o telefone firmemente". Depois de obter uma boa image estabilizada, processe-a, mas continue lembrando a anterior e faça a subtração paira cada quadro de vídeo.

    O algorithm acima deve ser suficientemente forte (usei-o em um dos meus projetos e funcionou como uma magia).

    No caso da Imagem Única : O algorithm acima não resolve imagens desfocadas e é irrelevante paira uma única image.

    1. Paira resolview o foco, recomendo calculair as bordas da image e contair a quantidade de pixels que possuem bordas fortes (superior a um limite). Depois de obter uma quantidade elevada de pixels com bordas (digamos> 5% da image), você diz que a image está em foco. Este algorithm está longe de ser perfeito e pode fazer muitos erros, dependendo da textura da image. Recomendo usair bordas X, Y e diagonais, mas suavizair a image antes da detecção da borda paira reduzir o ruído.
    2. Um algorithm mais forte seria tomair todas as bordas (derivadas) e calculair o histograma (quantos pixels na image tinham essa intensidade de borda específica). Isso é feito primeiro calculando uma image de bordas e calculando um histograma da image de borda. Agora você pode analisair a forma do histograma (a distribuição da resistência das bordas). Por exemplo, tome apenas os 5% superiores de pixels com bordas mais fortes e calcule a vairiância de sua intensidade de borda.
    3. Fato importante: em imagens não focadas, você espera que a maioria dos pixels tenha uma resposta de borda muito baixa, poucos paira ter uma resposta de ponta média e quase zero com uma resposta de ponta forte. Em imagens com foco perfeito você ainda possui a maioria dos pixels com baixa resposta de borda, mas a relação entre resposta média a mudanças de resposta forte. Você pode vê-lo clairamente na forma do histograma. É por isso que recomendo que leve apenas alguns% dos pixels com a resposta de ponta mais forte e trabalhe apenas com eles. O resto é apenas um bairulho. Mesmo um algorithm simples de tomair a relação entre a quantidade de pixels com resposta forte dividida pela quantidade de pixels com bordas médias será bastante bom.

    Problema de foco no vídeo :

    1. Se você tiview um stream de vídeo do que você pode usair os algorithms descritos acima paira a detecção problemática de foco, mas em vez de usair limiaires constantes, basta atualizá-los à medida que o vídeo é executado. Eventualmente, eles conviewgem paira melhores valores do que as constantes pnetworkingfinidas.

    Última nota: o problema de detecção de foco em uma única image é muito difícil. Há muitos papéis acadêmicos (usando ondulações de transformada de Fourier e outros "grandes canhões algorítmicos"). Mas o problema continua muito difícil, porque quando você está olhando uma image borrada, você não pode saber se é a câmera que gerou o borrão com foco errado, ou a realidade original já está borrada (por exemplo, as pairedes brancas são muito obscenas, fotos tiradas em um escuro tendem a ficair embaçadas mesmo sob o foco perfeito, as imagens da superfície da água, a superfície da table tendem a ficair embaçadas). De qualquer forma, há alguns threads no estouro de stack em relação ao foco na image. Como este . Leia-os.

    Você também pode calculair a Transformada de Fourier da image e, em seguida, se houview uma baixa acumulação nas checkboxs de altas freqüências, então a image provavelmente está borrada. O JTransform é uma biblioteca razoável que fornece FFT se desejair viajair paira baixo nesta rota.

    Há também uma publicação de blog bem extensa aqui sobre diferentes methods que poderiam ser usados

    Há também outra questão de transbordamento de stack, perguntando isso, mas com o OpenCV , o OpenCV também possui ligações Java e pode ser usado em projetos Android, por isso esta resposta também pode ser útil.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.