Quali proprietà di un'immagine potrebbero essere utilizzate per scartarla a livello di codice come "cattiva"?


9

Mi piacerebbe avere un processo di revisione più veloce delle mie foto quando le scarico dalla fotocamera al computer. Sicuramente ci sono alcuni parametri che posso estrarre a livello di codice dalle foto e questo valore potrebbe essere sufficiente per mettere automaticamente alcune foto nella pila degli "scarti".

Sto pensando agli algoritmi per rilevare i bordi, ottenere una nitidezza / sfocatura media dell'immagine o qualcosa del genere.

So che questa sceneggiatura non scarterà davvero tutte le foto cattive e manterrà quelle buone, ma spero di scartare quelle totalmente brutte.

Sono abbastanza sicuro di poter programmare uno script di shell usando ImageMagick (ma sono aperto a qualsiasi software della riga di comando) per ottenere ciò di cui avrei bisogno. Il problema è che non so quali valori dovrei cercare per ottenere risultati migliori.

TLDR; quali cose dovrei cercare per poter scartare un'immagine in modo programmatico (rilevamento dei bordi, nitidezza)?

Sto usando Fedora Linux.

modifica: non credo che questa domanda sia un duplicato di Esiste un software di analisi fotografica che preordinerà le immagini identificando potenziali problemi tecnici? perché quella domanda richiede una raccomandazione sul software e viene suggerito di apportare una modifica al flusso di lavoro nelle risposte (e utilizzando software che non è disponibile su Linux), mentre sto chiedendo cosa darà risultati migliori nel rilevamento di foto errate.


3
Sarei entusiasta di vedere la risposta a questo, ma non sono sicuro che ce ne sia uno. Ad esempio, immagina una foto drammatica di un insetto o di un altro soggetto in movimento in cui il 95% dell'immagine è sfocata o sfocata. Ci sono molti altri esempi in cui la valutazione programmatica dell'estetica può eliminare erroneamente alcune delle tue migliori immagini. Ad ogni modo, mi piacerebbe vedere come questo si evolve.
AK,


2
Vorrei certamente considerare le luci soffiate come un fattore.
chili555

1
È possibile rilevare le vibrazioni della fotocamera, sovra / sottoesposizione abbastanza facilmente e se si fosse davvero intelligenti si potrebbe tentare di identificare il soggetto della foto per verificare se fosse a fuoco, ma questo è tutto.
Matt Grum,

2
Anche rilevare la sottoesposizione o la sovraesposizione è difficile, perché che dire dei casi in cui lo desideravi in ​​quel modo? E se l'immagine fosse in chiave alta o bassa (per effetto o semplicemente perché la scena era così).
Leggi il mio profilo il

Risposte:


5

Una risposta ragionevole a questo sarebbe "dipende" (un'altra prospettiva è " combattere un po 'contro l'idea di metriche oggettive ")

Consiglio di consultare questo grafico per determinare quanto tempo dovresti dedicare a cercare di capire in modo più rapido se la "rapidità" è ciò che stai cercando.

inserisci qui la descrizione dell'immagine

Tuttavia, se decidi di affrontarlo mentre ti eserciti nella comprensione dell'analisi computazionale dell'immagine, dai un'occhiata a OpenCV .

Per iniziare, probabilmente avrai bisogno di una definizione più chiara di "totalmente schifo". Suggerirei un approccio basato sui dati; scorrere manualmente un ragionevole campione delle immagini, dividerle approssimativamente in buone / cattive / schifezze (G / B / C) per dare un'occhiata più da vicino a tutte le funzionalità che potrebbero separare C da G o B, provare a descriverle nel modo più semplice possibile (ad esempio livelli di colore, sfocato, troppo chiaro, troppo scuro, ecc. +). tradurlo in termini OpenCV. scrivere del codice per testare la teoria. classificare. ripetere fino a quando soddisfatto.


1

A seconda della lingua che stai usando OpenCV come suggerito sopra o Emnet equivalente a .net . Fondamentalmente ti consigliamo di scalare in scala di grigi l'immagine, quindi utilizzare una sfocatura laplaciana, quindi ottenere i dati dell'immagine e controllare l'immagine per vedere se si trova all'interno di un intervallo di soglia. Se è in un certo intervallo l'immagine non è sfocata, se l'immagine è al di fuori di tale intervallo, lo è.

Di seguito è la mia implementazione di più foto utilizzando 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

Questo non risponde alla domanda, quali cose dovrei cercare per poter scartare un'immagine in modo programmatico (rilevamento dei bordi, nitidezza)? Sembra un'implementazione del suggerimento in un'altra risposta.
Scott

Prima di tutto, consiglierei di non cancellare nulla che il programma afferma sia sfocato. Perché non è mai perfetto al 100%. Il poster originale diceva per verificare se è male. Quindi questa implementazione funzionerebbe per questo. Questa implementazione utilizza il rilevamento dei bordi. Il problema è che "cattivo" è molto vario e quando penso male, penso sfocato e roba.
Simon Dolby,

Ma sembra che una composizione con un soggetto piccolo ben focalizzato, con un sacco di sfocatura creativa (bokeh), venga eliminata come per lo più sfocata. Quindi sfocatura intenzionale fallisce questo controllo. (Sono anche d'accordo, non eliminerei nulla di ciò che un programma mi ha detto essere "cattivo". I computer non possono interpretare bene l'arte)
scottbb

Questo è un punto molto giusto riguardo alla sfocatura creativa. Sarà molto difficile da risolvere. Immagino, cercando di trovare una buona gamma che includa la sfocatura creativa. O creando una routine separata che controlla la sfocatura creativa che avrebbe ovviamente un intervallo separato. La mia gamma è stata creata come risultato di 40 immagini sfocate controllate.
Simon Dolby,

1

ImageMagick è il tuo amico qui. Scriverai molti script che chiamano prorram.

Es. Aritmetica immagine:

Prendi l'immagine. Sfocalo in una nuova immagine. Sottrai l'immagine 2 dall'immagine 1, prendendo il valore assoluto del risultato. Somma i pixel del risultato e la media. Soglia.

Un'immagine nitida è notevolmente diversa dall'immagine sfocata, quindi il valore medio della sottrazione sarà alto.

Un'immagine sfocata è molto meno diversa da un'immagine sfocata sfocata.

Come sottolinea uno dei commenti ad un'altra risposta, a volte un'immagine è intenzionalmente sfocata. Ad alcune persone piace davvero il bokeh. Quindi fai un altro passo e prendi il terzo medio o il quarto medio dell'immagine.


Prendi l'istogramma dell'immagine. Se più del X% dei pixel è saturo (> 248) per qualsiasi canale, le alte luci vengono eliminate.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.