2016-03-10 29 views
5

Kullanıcının ön kamera ile fotoğrafını çekip, ardından sunucuma yüklenmekte olduğu bir Android uygulamasına sahibim. Birçok fotoğrafın sunucumun çok karanlık olduğunu fark ettim (bazen kullanıcının yüzünü görmek neredeyse imkansızdır).Android'de karanlık fotoğraflar nasıl algılanır?

Bu tür fotoğrafları filtrelemek ve bildirimi göstermek istiyorum (ör. "Fotoğraf çok karanlık. Bir fotoğraf daha çekin"). Android'de böyle bir görevi nasıl başarabilirim?

DÜZENLEME:

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; 
} 

Ama yine de net bir fikir nasıl yok: Bir tek piksel için parlaklık nasıl hesaplanacağını öğrendim

(: https://stackoverflow.com/a/16313099/2999943 bu cevaba 's teşekkür) tüm görüntü parlaklığını "durum" belirlemek için. Baska öneri?

+0

niçin ortalama değeri elde etmek aynı şekilde tüm pikselleri analiz ve bu kullanılmasın? – JonasCz

cevap

7

Bir varyant olarak, fotoğrafınızın parlaklık histogramını oluşturabilirsiniz. Burada açıklandığı gibi parlaklık hesaplayın Formula to determine brightness of RGB color. Ardından, 256 büyüklüğündeki diziyi başlatabilir ve dizini, her pikselin parlaklığı olan bir dizi öğesiyle artırabilirsiniz.

Ardından, sol tarafta veya sağda çok fazla değer olup olmadığına bakın, bu, fotoğrafınızın çok açık/koyu olduğu anlamına gelir. Örneğin, 10 sağ ve sol değerlere bakabilirsiniz.

Kod örnek: Bir hafif yanık piksel için parlaklık belirleyebilirse

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

Cevabınız için teşekkürler. Sağladığınız bilgilere göre tek bir piksel için brigtness seviyesini (düzenlenmiş soruma bakın) hesaplayabilirim. Fakat daha fazla adımı daha ayrıntılı olarak açıklayabilir misiniz? Görüntü parlaklığı histogramını tam olarak nasıl oluşturabilirim? Ayrıca bu cümleyi tam olarak anlayamıyorum: "Daha sonra 256 büyüklüğündeki bir diziyi başlatabilir ve her bir pikselin bir parlaklığı olan bir dizi öğesi tarafından bir tane artar." Fikrinizi kısa kod snippet'i ile gösterebilir misiniz? – user2999943

+0

Kod örneği eklendi. Bir şey belli değilse bana sorun. –

+0

Şimdi anladım. Teşekkürler! – user2999943