2016-03-10 13 views
5

Ho un'app per Android in cui l'utente scatta una foto di se stesso con la fotocamera anteriore e quindi la foto viene caricata sul mio server. Ho notato che molte foto arrivano sul mio server troppo scure (a volte quasi impossibile vedere chiaramente la faccia dell'utente).Come rilevare foto scure su Android

Vorrei escludere tali foto e mostrare la notifica (ad esempio "Foto è troppo scura. Prendi una foto in più") per l'utente nel lato app. Come potrei realizzare tale compito in Android?

EDIT:

ho scoperto come calcolare la luminosità per un singolo pixel (grazie a questa risposta: https://stackoverflow.com/a/16313099/2999943):

private boolean isPixelColorBright(int color) { 
    if (android.R.color.transparent == color) 
     return true; 

    boolean rtnValue = false; 

    int[] rgb = {Color.red(color), Color.green(color), Color.blue(color)}; 

    int brightness = (int) Math.sqrt(rgb[0] * rgb[0] * .299 + rgb[1] 
      * rgb[1] * .587 + rgb[2] * rgb[2] * .114); 

    if (brightness >= 200) { // light color 
     rtnValue = true; 
    } 

    return rtnValue; 
} 

Ma ancora non ho un'idea chiara di come per determinare lo "stato" della luminosità dell'immagine intera. Eventuali suggerimenti?

+0

Se è possibile determinare la luminosità per un pixel singe, perché non analizzare tutti i pixel allo stesso modo per ottenere il valore medio, e l'uso che? – JonasCz

risposta

7

Come variante è possibile creare un istogramma della luminosità della foto. Calcola la luminosità come descritto qui Formula to determine brightness of RGB color. Quindi inizializzare l'array di dimensione 256 e incrementare di uno un elemento dell'array che indice è una luminosità di ogni pixel.

Quindi guarda se ci sono troppi valori sul lato sinistro o sul lato destro, significa che l'immagine è troppo chiara/scura. Ad esempio puoi guardare 10 valori a destra e a sinistra.

Codice esempio:

int histogram[256]; 
for (int i=0;i<256;i++) { 
    histogram[i] = 0; 
} 

for (int x = 0; x < a.getWidth(); x++) { 
    for(int y = 0; y < a.getHeight(); y++) { 
     int color = a.getRGB(x, y); 

     int r = Color.red(pixel); 
     int g = Color.green(pixel); 
     int b = Color.blue(pixel); 

     int brightness = (int) (0.2126*r + 0.7152*g + 0.0722*b); 
     histogram[brightness]++; 
    } 
} 

int allPixelsCount = a.getWidth() * a.getHeight(); 

// Count pixels with brightness less then 10 
int darkPixelCount = 0; 
for (int i=0;i<10;i++) { 
    darkPixelCount += histogram[i]; 
} 

if (darkPixelCount > allPixelCount * 0.25) // Dark picture. Play with a percentage 
else // Light picture. 
+0

Grazie per la risposta. Posso calcolare il livello di luminosità per un singolo pixel (guarda la mia domanda modificata) in base alle informazioni fornite. Ma potresti spiegare ulteriori passaggi in maggiore dettaglio? Come posso costruire esattamente l'istogramma di luminosità dell'immagine? Inoltre non ottengo completamente questa frase: "Quindi inizializza la matrice della dimensione 256 e incrementa di uno un elemento della matrice che indice è una luminosità di ogni pixel." Potresti illustrare la tua idea con lo snippet di codice breve? – user2999943

+0

Aggiunto l'esempio di codice. Chiedimi se qualcosa non è ovvio. –

+0

Ora ho capito. Grazie! – user2999943

Problemi correlati