Quelles propriétés d'une image pourraient être utilisées pour la rejeter par programme comme «mauvaise»?

9

Je voudrais avoir un processus d'examen plus rapide de mes photos lorsque je les vide de l'appareil photo vers l'ordinateur. Il y a sûrement certains paramètres que je peux extraire par programme à partir des photos et cette valeur pourrait être suffisante pour mettre automatiquement certaines photos dans la pile de `` rejet ''.

Je pense à des algorithmes pour détecter les bords, obtenir une netteté / flou moyenne de l'image ou quelque chose comme ça.

Je sais que ce script ne rejettera pas vraiment toutes les mauvaises photos et ne conservera pas les bonnes, mais j'espère éliminer celles qui sont totalement nulles.

Je suis presque sûr de pouvoir programmer un script shell à l'aide d'ImageMagick (mais je suis ouvert à tout logiciel en ligne de commande) pour obtenir ce dont j'ai besoin. Le problème est que je ne sais pas quelles valeurs dois-je rechercher pour obtenir de meilleurs résultats.

TLDR; quels éléments dois-je rechercher pour pouvoir supprimer une image par programme (détection des contours, netteté)?

J'utilise Fedora Linux.

edit: Je ne pense pas que cette question soit un doublon de Y a - t-il un logiciel d'analyse photo qui pré-triera les images en identifiant les problèmes techniques potentiels? parce que cette question demande une recommandation de logiciel et est suggérée de modifier le flux de travail dans les réponses (et d'utiliser un logiciel qui n'est pas disponible sur linux), alors que je demande ce qui donnera de meilleurs résultats pour détecter les mauvaises photos.

Carlos Campderrós
la source
3
Je serais ravi de voir la réponse à cela, mais je ne suis pas sûr qu'il y en ait une. Par exemple, imaginez une photo spectaculaire d'un insecte ou d'un autre sujet en mouvement où 95% de l'image est floue ou floue. Il existe de nombreux autres exemples où l'évaluation par programme de l'esthétique peut éliminer par erreur certaines de vos meilleures images. En tout cas, j'aimerais voir comment cela évolue.
AK
2
doublon possible de Existe
AK
2
Je considérerais certainement les faits saillants soufflés comme un facteur.
chili555
1
Vous pouvez détecter le bougé de l'appareil photo, la surexposition / la sous-exposition assez facilement, et si vous êtes vraiment intelligent, vous pouvez essayer d'identifier le sujet de la photo pour tester si elle est mise au point, mais c'est tout.
Matt Grum
2
Même détecter une sous-exposition ou une surexposition est difficile, car qu'en est-il des cas où vous le vouliez de cette façon? Que se passe-t-il si l'image est haute ou basse (pour l'effet ou simplement parce que c'est comme ça que la scène était).
Veuillez lire mon profil le

Réponses:

5

Une réponse raisonnable à cela serait "ça dépend" (une autre perspective est de " lutter un peu contre l'idée de métriques objectives ")

Je recommanderais de consulter ce tableau pour déterminer combien de temps vous devriez passer à essayer de trouver un moyen plus rapide si la «rapidité» est ce que vous recherchez.

entrez la description de l'image ici

Cependant, si vous décidez d'aborder cela comme un exercice de compréhension de l'analyse d'images de calcul, jetez un œil à OpenCV .

Pour commencer, vous aurez probablement besoin d'une définition plus claire de «totalement merde». Je suggérerais une approche basée sur les données; passer par un échantillon raisonnable de vos images manuellement, diviser grossièrement en bon / mauvais / merde (G / B / C) regarder de plus près toutes les fonctionnalités qui pourraient séparer C de G ou B, essayer de décrire ces fonctionnalités aussi simplement que possible (par exemple, niveaux de couleur, flou, trop clair, trop sombre, etc. +). traduire cela en termes OpenCV. écrire du code pour tester la théorie. classer. répéter jusqu'à satisfaction.

zzkt
la source
1

Selon la langue que vous utilisez OpenCV comme suggéré ci-dessus ou son équivalent Emgu .net . Fondamentalement, vous voudrez mettre l'image en niveaux de gris, puis utiliser un flou laplacien, puis obtenir les données d'image et vérifier l'image pour voir si elle se situe dans une plage de seuil. Si elle est dans une certaine plage, l'image n'est pas floue, si l'image est en dehors de cette plage, elle l'est.

Ci-dessous est mon implémentation de plusieurs photos en utilisant 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
la source
Cela ne répond pas à la question, quelles sont les choses que je dois regarder pour pouvoir supprimer une image par programme (détection des bords, netteté)? Cela ressemble à une implémentation de la suggestion dans une autre réponse.
scottbb
Tout d'abord, je recommanderais de ne pas supprimer tout ce que le programme dit flou. Parce qu'il n'est jamais parfait à 100%. L'affiche originale disait de vérifier si c'était mauvais. Donc, cette mise en œuvre fonctionnerait pour cela. Cette implémentation utilise la détection des contours. Le problème est que "mauvais" est très varié et quand je pense mal, je pense flou et tout ça.
Simon Dolby
Mais il semble qu'une composition avec un petit sujet bien mis au point, avec beaucoup de flou créatif (bokeh), serait rejetée comme étant principalement floue. Le flou intentionnel échoue donc à cette vérification. (Je suis également d'accord, je ne supprimerais rien d'un programme qui m'a dit qu'il était "mauvais". Les ordinateurs ne peuvent pas bien interpréter l'art)
scottbb
C'est un point très juste concernant le flou créatif. Cela va être très difficile à résoudre. J'imagine, en essayant de trouver une bonne gamme qui inclut le flou créatif. Ou créer une routine distincte qui vérifie le flou créatif qui aurait bien sûr une plage distincte. Ma gamme a été créée à la suite de 40 images flou vérifiées.
Simon Dolby
1

ImageMagick est votre ami ici. Vous allez écrire beaucoup de scripts qui appellent ça des prorrammes.

Par exemple, arithmétique d'image:

Prenez l'image. Le flou à une nouvelle image. Soustrayez l'image 2 de l'image 1, en prenant la valeur absolue du résultat. Additionnez les pixels du résultat et la moyenne. Seuil.

Une image nette est considérablement différente de l'image floue et la valeur moyenne de la soustraction sera donc élevée.

Une image floue est beaucoup moins différente d'une image floue floue.

Comme le souligne l'un des commentaires d'une autre réponse, une image est parfois intentionnellement floue. Certaines personnes aiment vraiment le bokeh. Alors, faites un autre pas et prenez le tiers du milieu ou le quart du milieu de l'image.


Prenez l'histogramme de l'image. Si plus de X% des pixels sont saturés (> 248) pour n'importe quel canal, les hautes lumières sont soufflées.


Sherwood Botsford
la source