2016-03-10 19 views
5

Mam aplikację na Androida, na której użytkownik robi sobie zdjęcie aparatem przednim, a następnie zdjęcie jest przesyłane na mój serwer. Zauważyłem, że wiele zdjęć dociera do mojego serwera zbyt ciemno (czasem prawie niemożliwe, aby było jasne, że widzę twarz użytkownika).Jak wykrywać ciemne zdjęcia w Androidzie

Chciałbym odfiltrować takie zdjęcia i pokazać powiadomienia (np. "Zdjęcie jest zbyt ciemne.) Zrób jeszcze jedno zdjęcie") do użytkownika po stronie aplikacji. Jak mogłem wykonać takie zadanie w Androidzie?

EDIT:

I odkryli, w jaki sposób obliczyć jasność dla jednego piksela (dziękuję do tej odpowiedzi: 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; 
} 

Ale nadal nie mam jasnego pojęcia jak aby określić jasność całego obrazu "status". Jakieś sugestie?

+0

Jeśli można określić jasność piksela przypalić, dlaczego nie analizować wszystkie piksele w taki sam sposób, aby uzyskać średnią wartość, i używać? – JonasCz

Odpowiedz

7

Jako wariant można zbudować histogram jasności zdjęcia. Oblicz jasność zgodnie z opisem tutaj: Formula to determine brightness of RGB color. Następnie zainicjuj tablicę o rozmiarze 256 i zwiększ ją o jeden element tablicy, którego indeks jest jasnością każdego piksela.

Następnie sprawdź, czy zbyt dużo wartości znajduje się po lewej lub prawej stronie, oznacza to, że obraz jest zbyt jasny/ciemny. Na przykład możesz spojrzeć na 10 prawych i lewych wartości.

przykład

Kod:

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

Dziękujemy za odpowiedź. Mogę obliczyć poziom brigtness dla jednego pojedynczego piksela (patrz moje edytowane pytanie) zgodnie z podanymi informacjami. Ale czy mógłbyś bardziej szczegółowo wyjaśnić dalsze kroki? Jak dokładnie mogę skonstruować histogram jasności obrazu? Również nie rozumiem w pełni tego zdania: "Następnie zainicjuj tablicę o rozmiarze 256 i zwiększ o jeden element tablicy, którego indeks jest jasnością każdego piksela." Czy mógłbyś zilustrować swój pomysł krótkim fragmentem kodu? – user2999943

+0

Dodano przykład kodu. Zapytaj mnie, czy coś nie jest oczywiste. –

+0

Teraz mam to. Dzięki! – user2999943