2016-08-10 7 views
1

私はAndroidアプリで作業しており、電話カメラで撮影した画像のエッジを探したいと思います。私はこれらのエッジを見つける際の最善の策は、2つの重要な色である2つのピクセルの間のピクセルを探すことであると考えました。たとえば、緑の色合いと黒の色合いです。ピクセル間で新しい重要な色の変化に達するのはいつ知っていますか?

どうすればこのピクセルを見つけることができますか?さまざまな色と色合いに関連する数字の範囲はありますか?私。 100-200は赤、200-300は青などですか?

+0

を見ることができるときは、最初の形式を知っておく必要があることに注意してください'JPG'、' PNG'、 'BMP'などの画像(画像ファイルの形式がたくさんあります)があります。この形式のバイナリデータを解凍または解析して、動作中のピクセルデータを取得する必要があります。次に、そのファイル内のすべてのピクセルをループして、2つの他のピクセルの間にある1つのピクセルが有意な色の変化を示すかどうかを確認する必要があります。これは、RGB、ARGB、RGBA、ICMYなど、さまざまな色のフォーマットには触れません。 –

+0

私はAndroidのカメラやそのAPIに精通していませんが、イメージはファイルに直接保存されず、代わりにストリームから読み込むことができます。この場合、イメージファイルを解析する必要はなく、生のピクセルデータにアクセスできます。 –

+0

実際に何を達成しようとしているのか分かりませんが、FYI:ほとんどのエッジ検出アルゴリズムでは、単一のピクセルではなくピクセルの_neighborhood_が検査されます。 https://en.wikipedia.org/wiki/Edge_detection –

答えて

1

まず、android.graphics.Bitmapを使用できます。 あなたのイメージは、デバイスのカメラやデバイスのメディアからのものである場合、あなたはこれを行うことができます:

Bitmap bitmap = MediaStore.Images.Media.getBitmap(activity.getContentResolver(), uri); 

ビットマップではあまり総ピクセルがあるので、あなたはまた、画像の縮小版をたいこともあるでしょう。これはパフォーマンスで大いに役立つでしょう:

bitmap = createScaledBitmap(bitmap, bitmap.getWidth()/scaleFactor, bitmap.getHeight()/scaleFactor, false); 

第二に、あなたがこれを行うことができ、画素取得するには:赤、青、緑、黒、白、など、使用を評価するために、

int [] pixels = new int[bitmap.getWidth() * bitmap.getHeight()]; 
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); 

サードを

black = 0x000000 
red = 0xff0000 
green = 0x00ff00 
blue = 0x0000ff 
white = 0xffffff 

使用する範囲を特定の色に限定してください。

final static int SIGNIFICANT_CHANGE_AMOUNT = 0xff; 

int pixelA = pixels[i]; 
int pixelB = pixels[i+1]; 
boolean sigChange = false; 
int changeInRed = Math.abs(((pixelA & 0xff0000) >> 16) - ((pixelB & 0xff0000) >> 16)); 
int changeInGreen = Math.abs(((pixelA & 0x00ff00) >> 8) - ((pixelB & 0x00ff00) >> 8)); 
int changeInBlue = Math.abs(((pixelA & 0x0000ff) >> 0) - ((pixelB & 0x0000ff) >> 0)); 
int overallChange = changeInRed + changeInGreen + changeInBlue; 
if (overallChange > SIGNIFCANT_CHANGE_AMOUNT) { 
    sigChange = true; 
} 

あなたはまだ領域を検出するアルゴリズムを記述する必要がありますが、私はあなたがFlood Fill Algorithmウィキに従うならば、それは大いに役立つだろうと思う:私は、大きな変化は以下によって計算されることをお勧め。再帰的なものは実際には実行可能ではないので、私はキューベースの実装を使用しました。

はまた、あなた、あなたが透明バイトをマスクすることになるでしょうアンドロイドビューとして使用されてきたビットマップからgetPixelsは...あなたはこのpost

関連する問題