¿Qué propiedades de una imagen podrían usarse para descartarla programáticamente como "mala"?

9

Me gustaría tener un proceso de revisión más rápido de mis fotos cuando las descargue de la cámara a la computadora. Seguramente hay algunos parámetros que puedo extraer mediante programación de las fotos y este valor podría ser suficiente para poner automáticamente algunas fotos en la pila de "descarte".

Estoy pensando en algoritmos para detectar bordes, obtener una nitidez / desenfoque promedio de la imagen o algo así.

Sé que este script realmente no descartará todas las fotos malas y conservará las buenas, pero espero descartar las totalmente basura.

Estoy bastante seguro de que puedo programar un script de shell usando ImageMagick (pero estoy abierto a cualquier software de línea de comandos) para obtener lo que necesito. El problema es que no sé qué valores debo buscar para obtener mejores resultados.

TLDR; ¿Qué cosas debo buscar para poder descartar una imagen mediante programación (detección de bordes, nitidez)?

Estoy usando Fedora Linux.

editar: No creo que esta pregunta sea un duplicado de ¿Existe un software de análisis de fotos que clasifique previamente las imágenes identificando posibles problemas técnicos? porque esa pregunta pide una recomendación de software y se sugiere hacer un cambio en el flujo de trabajo en las respuestas (y usar un software que no está disponible en Linux), mientras pregunto qué dará mejores resultados en la detección de malas fotos.

Carlos Campderrós
fuente
3
Me encantaría ver la respuesta a esto, pero no estoy seguro de que haya una. Por ejemplo, imagine una foto dramática de un insecto u otro sujeto en movimiento donde el 95% de la imagen está borrosa o desenfocada. Hay muchos otros ejemplos en los que evaluar estéticamente mediante programación puede eliminar erróneamente algunas de sus mejores imágenes. En cualquier caso, me encantaría ver cómo evoluciona esto.
AK
2
Ciertamente vería los aspectos más destacados como un factor.
chili555
1
Podía detectar el movimiento de la cámara, sobre / bajo exposición con bastante facilidad, y si fuera realmente inteligente, podría intentar identificar el sujeto de la foto para probar si estaba enfocada, pero eso es todo.
Matt Grum
2
Incluso detectar subexposición o sobreexposición es difícil, porque ¿qué pasa con los casos en que lo quería de esa manera? ¿Qué pasa si la imagen es de clave alta o baja (por efecto o simplemente porque así era la escena)?
Lea mi perfil el

Respuestas:

5

Una respuesta razonable a esto sería "depende" (otra perspectiva es " luchar un poco contra la idea de métricas objetivas ")

Recomiendo consultar este cuadro para determinar cuánto tiempo debe pasar tratando de descubrir una forma más rápida si 'rapidez' es lo que está buscando.

ingrese la descripción de la imagen aquí

Sin embargo, si decide abordar esto como un ejercicio para comprender el análisis de imágenes computacionales, eche un vistazo a OpenCV .

Para comenzar, probablemente necesitará una definición más clara de "totalmente basura". Sugeriría un enfoque basado en datos; revise manualmente una muestra razonable de sus imágenes, divídalas aproximadamente en buenas / malas / basura (G / B / C) eche un vistazo más de cerca a cualquier característica que pueda separar C de G o B, intente describir estas características de la manera más simple posible (p. ej., niveles de color, borroso, demasiado claro, demasiado oscuro, etc.) traduzca esto en términos de OpenCV. escribe un código para probar la teoría. clasificar. Repita hasta que esté satisfecho.

zzkt
fuente
1

Dependiendo del idioma que esté usando OpenCV como se sugirió anteriormente o es .gu equitativo Emgu . Básicamente, querrá escalar la imagen en escala de grises, luego usar un Desenfoque laplaciano, luego obtener los datos de la imagen y verificar la imagen para ver si está dentro de un rango de umbral. Si está en un cierto rango, la imagen no está borrosa, si la imagen está fuera de ese rango, lo está.

A continuación se muestra mi implementación de varias fotos usando 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
fuente
Esto no responde a la pregunta, ¿qué cosas debo mirar para poder descartar una imagen mediante programación (detección de bordes, nitidez)? Esto suena como una implementación de la sugerencia en otra respuesta.
scottbb
En primer lugar, recomendaría no eliminar nada que el programa dice que es borroso. Porque nunca es 100% perfecto. El póster original decía que se verificara si era malo. Entonces esta implementación funcionaría para eso. Esta implementación utiliza detección de bordes. El problema es que "malo" es muy variado y cuando pienso mal, pienso borroso y esas cosas.
Simon Dolby el
Pero parece que una composición con un sujeto pequeño y bien enfocado, con una gran cantidad de desenfoque creativo (bokeh), se consideraría borrosa en su mayoría. Por lo tanto, el desenfoque intencional falla en esta comprobación. (También estoy de acuerdo, no eliminaría nada que un programa me dijera que era "malo". Las computadoras no pueden interpretar bien el arte)
scottbb
Ese es un punto muy justo con respecto al desenfoque creativo. Eso va a ser muy difícil de arreglar. Me imagino, tratando de encontrar un buen rango que incluya el desenfoque creativo. O crear una rutina separada que verifique la falta de definición creativa que, por supuesto, tendría un rango separado. Mi rango se creó como resultado de 40 imágenes borrosas marcadas.
Simon Dolby el
1

ImageMagick es tu amigo aquí. Vas a escribir muchos guiones que lo llaman prorrams.

Por ejemplo, aritmética de imagen:

Toma la imagen. Desenfoque a una nueva imagen. Reste la imagen 2 de la imagen 1, tomando el valor absoluto del resultado. Suma los píxeles del resultado y promedia. Límite.

Una imagen nítida es considerablemente diferente de la imagen borrosa, por lo que el valor promedio de la resta será alto.

Una imagen borrosa es mucho menos diferente de una imagen borrosa borrosa.

Como señala uno de los comentarios a otra respuesta, a veces una imagen es intencionalmente borrosa. Algunas personas realmente les gusta el bokeh. Así que dé otro paso y tome el tercio medio o cuarto medio de la imagen.


Toma el histograma de la imagen. Si más del X% de los píxeles están saturados (> 248) para cualquier canal, entonces se resaltan los resaltados.


Sherwood Botsford
fuente