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.
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".
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
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.
Alaska
carlos campderros
Alaska
mattdm
chile555
usuario681768917
matt grum
mattdm
mattdm
mattdm
mattdm
chatarrería