Quais propriedades de uma imagem podem ser usadas para descartá-la programaticamente como "ruim"?

9

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.

Carlos Campderrós
fonte
3
Eu ficaria animado em ver a resposta para isso, mas não tenho certeza de que exista alguma. Por exemplo, imagine uma foto dramática de um inseto ou outro objeto em movimento em que 95% da imagem esteja desfocada ou desfocada. Existem muitos outros exemplos em que a avaliação programada da estética pode eliminar erroneamente algumas de suas melhores imagens. De qualquer forma, eu adoraria ver como isso evolui.
AK
2
Eu certamente consideraria os destaques soprados como um fator.
precisa saber é o seguinte
1
Você pode detectar a trepidação da câmera, a exposição acima ou abaixo com bastante facilidade e, se você for realmente inteligente, poderá tentar identificar o assunto da foto para testar se ela está em foco, mas é isso.
Matt Grum
2
Até a detecção de sub ou superexposição é difícil, porque e nos casos em que você queria dessa maneira? E se a imagem for alta ou baixa (para efeito ou apenas porque é assim que a cena era).
Por favor, leia meu perfil

Respostas:

5

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.

insira a descrição da imagem aqui

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.

zzkt
fonte
1

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

  Public Sub GetBlur()
    Dim List As String() = Directory.GetFiles("E:\Dartmoor\", "*.JPG")


    For Index As Integer = 1 To 2000
        Dim imgfile As String = List(Index)
        Dim Image As Drawing.Bitmap = Drawing.Bitmap.FromFile(imgfile)
        Dim img As Image(Of Gray, Byte) = New Image(Of Gray, Byte)(Image)
        Dim factor As Single()
        Dim imgB As Drawing.Bitmap = New Drawing.Bitmap(imgfile)
        imgB = New Drawing.Bitmap(imgB)
        Dim imgGray As Image(Of Gray, Byte) = img.Convert(Of Gray, Byte)()
        Dim imgTmp As Image(Of Gray, Single) = imgGray.Laplace(1)
        Dim maxLap As Short = -32767
        For Each MyByte As Single In imgTmp.Data
            If MyByte > maxLap Then

                maxLap = MyByte

            End If
        Next

        If maxLap > 300 Or maxLap < 150 Then
            List(Index) = imgfile & " is blurry"

        Else
            List(Index) = imgfile & " isn't blurry"
        End If

        '    'This saves the location of where the user is currently if they need to pause





        imgGray.Dispose()
        img.Dispose()
        imgTmp.Dispose()
        imgB.Dispose()

    Next
    Using sw As StreamWriter = New StreamWriter("Result.txt")
        For i As Integer = 1 To 2000
            sw.WriteLine(List(i))
        Next
    End Using
End Sub
Simon Dolby
fonte
Isso não responde à pergunta: como devo descartar uma imagem programaticamente (detecção de borda, nitidez)? Isso soa como uma implementação da sugestão em outra resposta.
scottbb
Antes de tudo, eu recomendaria não excluir nada que o programa diz estar embaçado. Porque nunca é 100% perfeito. O pôster original dizia para verificar se está ruim. Portanto, essa implementação funcionaria para isso. Esta implementação usa detecção de borda. O problema é que "ruim" é muito variado e, quando penso mal, acho embaçado e outras coisas.
Simon Dolby
Mas parece que uma composição com um assunto pequeno e bem focado, com muita embaçada criativa (bokeh), seria expulsa como quase embaçada. Portanto, o desfoque intencional falha nessa verificação. (Eu também concordo, eu não iria apagar qualquer coisa que um programa me disse que era "mau" Os computadores não podem interpretar a arte também.)
scottbb
Esse é um ponto muito justo em relação ao desfoque criativo. Vai ser muito difícil de consertar. Eu imagino, tentando encontrar uma boa variedade que inclua o borrão criativo. Ou criar uma rotina separada que verifique se há embaçamento criativo que, é claro, teria um intervalo separado. Meu alcance foi criado como resultado de 40 imagens desfocadas.
Simon Dolby
1

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.


Sherwood Botsford
fonte