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

Me gustaría tener un proceso de revisión más rápido de mis fotos cuando las vuelvo 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 colocar automáticamente algunas fotos en la pila de 'descartar'.

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

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

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 necesitaría. 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 fotografías que clasifique previamente las imágenes al identificar posibles problemas técnicos? porque esa pregunta solicita una recomendación de software y se sugiere hacer un cambio de 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.

Me emocionaría ver la respuesta a esto, pero no estoy seguro de que haya una. Por ejemplo, imagina 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 la evaluación programática de la estética puede eliminar erróneamente algunas de sus mejores imágenes. En cualquier caso, me encantaría ver cómo evoluciona esto.
@AK Sí, sé que habrá falsos positivos, pero para las imágenes que son realmente malas (con mi mala experiencia y disparando con lentes manuales, tengo un montón de fotos de mierda) servirá para separarlas de las que no son tan malas.
No creo que sea un duplicado, ya que está preguntando qué buscaría dicho software, en lugar de ser una recomendación de software. Sin embargo, sí recuerdo otro que parecía similar...
Ciertamente miraría los reflejos quemados como un factor.
Algunas cámaras contienen advertencias en su información EXIF, como advertencia de desenfoque , enfoque o exposición . Leerlos usando esa biblioteca C++ gratuita/comercial y decidir sobre ellos también PUEDE ayudar.
Podrías detectar el movimiento de la cámara, la sobreexposición o la subexposición con bastante facilidad y, si fueras realmente inteligente, podrías intentar identificar el sujeto de la foto para comprobar si estaba enfocado, pero eso es todo.
Aunque, de verdad, me gusta más tu redacción aquí que otras.
Incluso detectar la subexposición o la sobreexposición es difícil, porque ¿qué pasa con los casos en los 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).
Dado que esto depende tanto de las intenciones del tirador, sería interesante implementar algún tipo de análisis al estilo SpamAssassin de las imágenes descartadas por el usuario... FAIK, tal vez alguien lo haya hecho...

Respuestas (3)

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 encontrar una forma más rápida si lo que está buscando es "rapidez".

ingrese la descripción de la imagen aquí

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

Para empezar, probablemente necesites 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 las características que podrían separar a C de G o B, trate de describir estas características de la manera más simple posible (por ejemplo, niveles de color, borroso, demasiado claro, demasiado oscuro, etc+). traducir esto en términos de OpenCV. escribir algo de código para probar la teoría. clasificar. repita hasta que esté satisfecho.

Dependiendo del idioma que esté usando, OpenCV como se sugirió anteriormente o es el equivalente de .net 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á dentro de 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
Esto no responde a la pregunta, ¿qué cosas debo buscar 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.
En primer lugar, recomendaría no borrar nada que el programa diga que está borroso. Porque nunca es 100% perfecto. El cartel original decía que verificara si es malo. Así que esta implementación funcionaría para eso. Esta implementación utiliza la detección de bordes. El problema es que lo "malo" es muy variado y cuando pienso mal, pienso borroso y esas cosas.
Pero parece que una composición con un sujeto pequeño y bien enfocado, con mucha borrosidad creativa (bokeh), sería descartada como mayormente borrosa. Entonces, el desenfoque intencional falla en esta verificació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)
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 borrosidad creativa que, por supuesto, tendría un rango separado. Mi rango se creó como resultado de 40 imágenes desenfoque comprobado.

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

Por ejemplo, aritmética de imágenes:

Toma la imagen. Desenfoque a una nueva imagen. Resta 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 una 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. A algunas personas realmente les gusta el bokeh. Así que da otro paso y toma el tercio medio o el 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 los reflejos se pierden.