Gostaria de ter um processo de revisão mais rápido das minhas fotos quando as despejo da câmera no computador. Certamente, existem alguns parâmetros que posso extrair programaticamente das fotos e esse valor pode ser suficiente para colocar automaticamente algumas fotos na pilha de 'descarte'.
Estou pensando em algoritmos para detectar bordas, obter nitidez / embaçamento médios da imagem ou algo assim.
Sei que esse script realmente não descarta todas as fotos ruins e mantém as boas, mas espero descartar as totalmente ruins.
Tenho certeza de que posso programar um shell script usando o ImageMagick (mas estou aberto a qualquer software de linha de comando) para obter o que eu precisaria. O problema é que não sei quais valores devo procurar para obter melhores resultados.
TLDR; que coisas devo procurar para descartar uma imagem programaticamente (detecção de borda, nitidez)?
Estou usando o Fedora Linux.
edit: Eu não acho que essa pergunta seja uma duplicata do Existe algum software de análise de fotos que classifique previamente as imagens identificando possíveis problemas técnicos? porque essa pergunta pede recomendação de software e é sugerida a alteração do fluxo de trabalho nas respostas (e o uso de software que não está disponível no linux), enquanto estou perguntando o que trará melhores resultados na detecção de fotos ruins.
fonte
Respostas:
Uma resposta razoável para isso seria "depende" (outra perspectiva é " lutar um pouco contra a idéia de métricas objetivas ")
Eu recomendo consultar este gráfico para determinar quanto tempo você deve gastar tentando descobrir uma maneira mais rápida se 'rapidez' é o que você está procurando.
No entanto, se você decidir abordar isso como um exercício para entender a análise computacional de imagens, dê uma olhada no OpenCV .
Para começar, você provavelmente precisará de uma definição mais clara de "totalmente ruim". Eu sugeriria uma abordagem orientada a dados; analise manualmente uma amostra razoável de suas imagens, divida-as em boa / ruim / porcaria (G / B / C) e observe atentamente todos os recursos que possam separar C de G ou B; tente descrevê-los da maneira mais simples possível (por exemplo, níveis de cores, desfocados, muito claros, muito escuros, etc +). traduza isso em termos OpenCV. escreva algum código para testar a teoria. classificar. repita até ficar satisfeito.
fonte
Dependendo do idioma que você está usando o OpenCV, como sugerido acima, ou do Emgu equivalente .net . Basicamente, você deseja fazer a escala de cinza da imagem, usar um Laplacian Blur, obter os dados da imagem e verificar a imagem para ver se ela está dentro de um limite. Se estiver em um determinado intervalo, a imagem não está tremida, se estiver fora desse intervalo, está.
Abaixo está minha implementação de várias fotos usando o VB.net
fonte
ImageMagick é seu amigo aqui. Você escreverá muitos scripts que chamam de prorrams.
Por exemplo, aritmética da imagem:
Pegue a imagem. Desfoque para uma nova imagem. Subtraia a imagem 2 da imagem 1, obtendo o valor absoluto do resultado. Soma os pixels do resultado e a média. Limite.
Uma imagem nítida é consideravelmente diferente da imagem borrada e, portanto, o valor médio da subtração será alto.
Uma imagem tremida é muito menos diferente de uma imagem tremida.
Como aponta um dos comentários para outra resposta, às vezes uma imagem é intencionalmente embaçada. Algumas pessoas realmente gostam de bokeh. Então, dê outro passo e tire o terço ou o quarto do meio da imagem.
Pegue o histograma da imagem. Se mais de X% dos pixels estiverem saturados (> 248) para qualquer canal, os realces serão soprados.
fonte