2つのBufferedImageの間の画素値を比較するための最速の方法は?
-
21-09-2019 - |
質問
私はタイプ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;
Iは、候補画像の対応する画素にR / G / B値を比較し、二乗差を合計します。
比較のこの種を行うにはより高速な方法はありますか? JREソース覗く、私はちょうど再びバイトに、それを破壊していますので、BufferedImage.getRGBは()実際に、私の目的のために無駄である一緒にラスタ、から構成RGB値をOR演算されていることがわかります。
私は直接それを行う試してみるつもりですが、私が見逃している可能性があることを、JavaまたはサードパーティのAPIを介してのいずれか、これを行うのは良い方法がない場合、私は疑問に思う。
解決
のVolatileImageからのデータの読み出しは速くなりません。どのような「より速く」VolatileImagesを作ることは、彼らが画像を描画するための加速(VRAM)メモリの代わりに、システムメモリ(RAM)を使用することです。読み取りを行うときしかし、それは別のバスを介してアクセス・メモリに必要とこれらの操作のためのシステムメモリよりも遅くなることがあります。
BufferedImageのを比較するための最速の方法は、整数の比較、あなたの記事で議論する方法を用いることであろうが、あなたはパフォーマンス上の理由のgetRGBを使用することはできません言及として。あなたは配列にピクセルのバッチを得ることができますが、全体的に、あなたはおそらく、パフォーマンスのためにラスターとDataBufferを覗く必要があります。
他のヒント
、あなたは少し速くなりラスタのDataBufferを、上の比較を行うことができます。
そして、あなたが持っている二つの画像間のの違いのものに新しいイメージを作成するために、2Dでを使用して検討しているし、代わりに差分画像を分析する?
私の最初のアプローチは、画像Aの負を取り、画像Bを追加することになる。
余分なクラスをロードバイト+に分解することは問題である場合は、これを試してみます:
のバッファ画像値フォームをRGB画素値を取得する
img = 65536*R + 256*G + B - 16777216;
のバッファ画像値からRGB値を取得するIMG の
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));
これはそれを行うには良い/より高速な方法ですが、それは余分なクラスを使用していない別の代替方法であり、かつストレート数学のプロセス(あるいはハック)である場合、私はわからない...これはなるかもしれません(してくださいダブルチェックそれは私が一緒にプレイするのに十分な時間を持っていなかったことを私自身の方法であるため)いくつかの場面で役立ちます。
私はあなたのピクセル値の間に必要な比較の種類を知らないので、これは、私は誰かが実際にこの便利!
を見つける願っています...この記事はどのようになるまでのところです