2016-03-10 8 views
5

私は、ユーザーがフロントカメラで自分の写真を撮ってから写真を自分のサーバーにアップロードしているAndroidアプリを持っています。私は多くの写真が私のサーバーに来ていることに気付きました(ユーザーの顔を見るときれいにすることはほとんど不可能です)。Androidで暗い写真を検出する方法

このような写真を除外して、アプリ側の通知を表示したい(「写真が暗すぎる、写真をもう一度撮る」など)。 Androidでこのような作業をどのように達成できましたか?

EDIT:

私は1つのピクセルのための明るさを計算する方法を見出した(この回答への感謝: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; 
} 

しかし、それでもまだ、私はどのように明確な考えを持っていません画像全体の明るさ「状態」を決定する。助言がありますか?

+0

は、なぜ平均値を取得するのと同じ方法ですべてのピクセルを分析し、それを使わないのでしょうか? – JonasCz

答えて

7

あなたの写真の輝度ヒストグラムを作成することができます。ここに記載されているように明るさを計算するFormula to determine brightness of RGB color。次に、サイズ256の配列を初期化し、インデックスを各ピクセルの輝度とする配列要素を1つ増分します。

次に、左側または右側に値が多すぎる場合は、画像が明るすぎる/暗すぎることを意味します。たとえば、右と左の10個の値を見ることができます。

コード例:あなたは焦がす画素の明るさを決定することができる場合

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

ありがとうございました。私はあなたの提供された情報に基づいて1つのピクセル(編集された質問を見てください)の明るさのレベルを計算することができます。しかし、さらに詳細な手順を説明できますか?どのくらい正確に画像の輝度ヒストグラムを構築できますか?また、私は完全にこの文を取得しません: "サイズ256の配列を初期化し、インデックスがすべてのピクセルの明るさである配列要素を1つ増分します。短いコードスニペットでアイデアを説明できますか? – user2999943

+0

コード例を追加しました。何かが明らかでないかどうか私に尋ねてください。 –

+0

今私はそれを得た。ありがとう! – user2999943

関連する問題