6

タイプ TYPE_INT_BGR の BufferedImage があります。2 つの画像間の「距離」を計算するには、別の BufferedImage とピクセル単位で比較する必要があります。動作するものがありますが、遅いです。「参照」画像からピクセルを取得し、次のように RGB バイトに分割します。

    int pixel = referenceImage.getRGB(col, row);
    int red   = (pixel >> 16) & 0xff;
    int green = (pixel >> 8) & 0xff;
    int blue  = (pixel) & 0xff;

r/g/b 値を候補画像の対応するピクセルと比較し、差の二乗を合計します。

この種の比較を行うためのより高速な方法はありますか? JRE ソースを覗いてみると、BufferedImage.getRGB() が実際にはラスターの構成要素の RGB 値を OR 演算していることがわかります。

私はそれを直接やってみるつもりですが、見逃したかもしれないJavaまたはサードパーティのAPIを介して、これを行うより良い方法がないのではないかと思います.

4

4 に答える 4

3

VolatileImage からのデータの読み取りは高速ではありません。VolatileImages を「高速」にするのは、イメージの描画にシステム (RAM) メモリではなく高速化 (VRAM) メモリを使用することです。ただし、読み取りを行う場合は、別のバスを介してメモリにアクセスする必要があり、それらの操作ではシステム メモリよりも低速です。

BufferedImages を比較する最も速い方法は、投稿で説明した方法で整数比較を使用することですが、言及したように、パフォーマンス上の理由から getRGB を使用することはできません。ピクセルのバッチを配列に取得できますが、全体的には、パフォーマンスのために Raster と DataBuffer を覗くだけでよいでしょう。

于 2009-12-29T18:58:24.193 に答える
2

両方の画像が同じカラー モデルとサンプリングを使用している場合は、ラスターの DataBuffer で比較を実行できます。これは少し高速になります。

于 2009-12-29T17:40:52.430 に答える
0

バイトに分割して余分なクラスをロードすることが問題である場合は、これを試してください。

RGB ピクセル値から BufferedImage 値を取得する

img = 65536*R + 256*G + B - 16777216;  

BufferedImage 値 img から RGB 値を取得する

R=  Math.round((((371*img)+24576000000) / 96000000)
G=  Math.round((65536 + 0.003906*img - 256*R));
B=  Math.round((65536*R + 256*G -img - 16777216));

これがより良い/より高速な方法であるかどうかはわかりませんが、追加のクラスを使用せず、単純な数学プロセス (またはハック) である別の代替方法です...これは一部で役立つ場合があります場合によっては(十分に時間をかけてプレイできなかった私自身の方法であるため、再確認してください)。

ピクセル値間で必要な比較の種類についてはわかりませんので、これがこの投稿の行き先です...誰かが実際にこれが役立つことを願っています!

于 2012-09-30T17:01:56.013 に答える