2015-01-09 9 views
5

sto scaricando le immagini satellitari come questo satellite_image http://home.chpc.utah.edu/~u0553130/NASA_SPoRT_VIIRS_Images/VIIRS_11um_20150104_1834_UTC.gif Dal momento che alcune immagini sono per lo più nero, come questo, non voglio salvarlo.Python - scoprire quanto di un'immagine è nero

Come posso usare Python per verificare se l'immagine è in bianco oltre il 50%?

+2

'load' l'immagine, iterare i pixel, e incrementare un contatore ogni volta che si trova un (0,0,0) di colore. – Kevin

+0

Sembra che il nero è (1 1, 1) per cui si potrebbe desiderare di controllare solo se il valore del pixel è inferiore a 10 o qualcosa del genere. – Matthew

+0

Si dovrebbe usare PIL (Python Imaging Library). Ecco come usarlo:. Http://stackoverflow.com/a/11064935/1612701 –

risposta

0
  • Carica immagine
  • Leggi ogni risultato pixel e di incremento se pixel = (0,0,0)
  • Se un'immagine risultato = < (image.width * image.height)/2
  • Salva

Oppure controllare se è quasi nero restituendo true se il componente R (o G o B) del pixel è inferiore a 15, ad esempio.

7

Hai a che fare con la gif che sono per lo più in scala di grigi dallo sguardo della vostra immagine esempio, in modo ci si potrebbe aspettare la maggior parte dei componenti RGB di essere uguali.

Utilizzando PIL:

from PIL import Image 
im = Image.open('im.gif') 
pixels = im.getdata()   # get the pixels as a flattened sequence 
black_thresh = 50 
nblack = 0 
for pixel in pixels: 
    if pixel < black_thresh: 
     nblack += 1 
n = len(pixels) 

if (nblack/float(n)) > 0.5: 
    print("mostly black") 

regolare la soglia di "nero" tra 0 (nero come la pece) e 255 (bianco luminoso) a seconda dei casi).

+1

In caso di problemi, il cambiamento a 'Image.open ('im.gif') convertire ('L')' ' – Asakura

+0

Qualora pixel Jake

0

Utilizzando l'immagine di prova, il colore più comune ha un valore RGB di (1, 1, 1). Questo è molto nero, ma non esattamente nero. La mia risposta utilizza lo PIL library, webcolors e un generoso aiuto del codice dalla risposta this.

from PIL import Image 
import webcolors 

def closest_color(requested_color): 
    min_colors = {} 
    for key, name in webcolors.css3_hex_to_names.items(): 
     r_c, g_c, b_c = webcolors.hex_to_rgb(key) 
     rd = (r_c - requested_color[0]) ** 2 
     gd = (g_c - requested_color[1]) ** 2 
     bd = (b_c - requested_color[2]) ** 2 
     min_colors[(rd + gd + bd)] = name 
    return min_colors[min(min_colors.keys())] 

def get_color_name(requested_color): 
    try: 
     closest_name = actual_name = webcolors.rgb_to_name(requested_color) 
    except ValueError: 
     closest_name = closest_color(requested_color) 
     actual_name = None 
    return actual_name, closest_name 

if __name__ == '__main__': 
    lt = Image.open('test.gif').convert('RGB').getcolors() 
    lt.sort(key=lambda tup:tup[0], reverse=True) 
    actual_name, closest_name = get_color_name(lt[0][4]) 
    print lt[0], actual_name, closest_name 

uscita:

(531162, (1, 1, 1)) None black 

In questo caso, si sarebbe interessato nella variabile closest_name. Il primo (lt[0]) mostra il valore RGB più comune. Questo non ha un nome di colore web definito, da cui il None per actual_name


Spiegazione:

Questo sta aprendo il file che ci hai fornito, convertendolo in RGB e quindi eseguire il metodo di PIL getcolors su l'immagine. Il risultato è una lista di tuple nel formato (count, RGB_color_value). Quindi ho ordinato l'elenco (in ordine inverso). Utilizzando le funzioni dell'altro answer, passo il valore di colore RGB più comune (ora la prima tupla nell'elenco e l'RBG è il secondo elemento della tupla).

0

Il modo completo è contare i pixel usando qualcosa come PIL, come indicato nelle altre risposte.

Tuttavia, se sono tutte immagini compresse, potrebbe essere possibile controllare le dimensioni del file, poiché le immagini con molte aree in tinta unita dovrebbero comprimersi molto più di quelle con variazioni come la copertura nuvolosa.

Con alcuni test, si poteva almeno trovare un'euristica di cui le immagini con un sacco di nuvole si sa si può immediatamente scartare senza looping costosi sui loro pixel. Gli altri più vicini al 50% possono essere controllati pixel per pixel.

Inoltre, quando l'iterazione sui pixel, non c'è bisogno di contare tutti i pixel neri, e poi verificare se almeno il 50% sono neri. Invece, smetti di contare e scartare non appena sai che almeno il 50% è nero.

Una seconda ottimizzazione: se si conoscono le immagini sono generalmente molto nuvoloso, piuttosto che per lo più nero, andare nella direzione opposta. Contare il numero di pixel non neri e fermarsi e conservare le immagini non appena si supera il 50%.