2016-10-17 7 views
0

イメージ内の特定のピクセルを検索する最も速い方法は何ですか? イメージファイルのサイズは16 MBです。アルゴリズムの観点からは、私は線形検索よりも良くなるとは思いません。 私は各CPUごとに2つの象限1で画像を分割し、画像をメモリにロードしてそこから読み取ろうとしました。 私にできることは他にありますか?画像内のピクセル固有のピクセルを検索する最速の方法

+0

複数の検索を画像で行うのか、それとも1つだけで検索しますか? – harold

+0

1回。特定の色が何回出現するかを数えてください。 – Xtal

+1

ファイル形式は何ですか?圧縮されていれば(例えば、ランレングス符号化されている場合)、全体を解凍してイメージを反復処理するのではなく、解凍するときにピクセル数をカウントすることで処理速度を上げることができます。圧縮解除された結果も格納する必要はありません。 – samgak

答えて

0

は通常、向上させることができる唯一のことではない:

もし、あなたのアプリケーションのためには、正確な結果が発見される前に、あなたは早く結果を得るとき、次のように、あなたが改善することができるという利点ですが、この努力は価値がないかもしれません投資時間:

ステップ1:2または3ピクセルのステップで検索します。色が似ている場合にのみさらに検索を行います。見つかった場合はリターンピクセル。 (あなたはSTEP1でoverjumpedこと)、

をピクセルの残りの部分を検索する。しかし、色の類似度を計算するため、いくつかのピクセルをoverumpingのゲインを超えるだろう、このアルゴ:見つからない場合

ステップ2を行います直線的な検索がおそらく最も良い解決策であることを示しています。

0

特定のピクセルを見つける機会が少ない可能性のあるピクセル範囲をいくつかの範囲でプル/スキップする方法があります。しかし、リニア検索を実行すると、ディスク上のシーク時間を確実に最適化することができます。Loop Blockingこのようにして、メインメモリを最大限に活用し、ディスクルックアップを減らすことができます。

ます。また、インテルの記事improve memory utilization by means of loop blocking

1

象限は、実際に少しうるさいですが起こった空間に何かがあるとき、彼らは助けることができる見ることができますが、これは単なる線形検索ですので、彼らはすべてが素敵なシーケンシャルアクセスパターンを破るあります。したがって、データの元の2D次元を無視して、イメージを1Dスライスのメモリで分割するだけです。

さらに、コードがコンパイラによって自動ベクトル化されているかどうかを確認し、そうでない場合(または改善が可能であっても)、SIMD組み込み関数を使用して手動でベクトル化します。 24bppはそれを少し面倒にするでしょうが、48バイトをロードしてから4つのベクトルレジスタにそれをいくつかのシャッフルで再配布することで対処できます。 32bppは非常に簡単です。あなたが見つけたいピクセルと色の間に_mm_cmpeq_epi32(対象とするとx86を想定しています)を適用し、カウントから結果を差し引きます。

+0

これは行く方法です。あなたは()OpenCVの関数 'INRANGEを見れば'それはhttps://github.com/opencv/opencv/blob/master/modules/core/src ...あなたが欲しいものを多かれ少なかれ行い、ここでは組み込み関数でコーディングされています/arithm.cpp –

関連する問題