私は、黒と白のピクセルで満たされた2次元イメージを持っています。今度は、各白い画素について、最も近い黒の画素を知りたい(その距離)、そして黒の画素ごとに、最も近い白の画素を知りたい(距離)。距離マップの効率的な計算
素朴なアルゴリズムは次のようになります。私は、二次複雑であると思い
for(var y = 0; y < height; y++)
{
for(var x = 0; x < width; x++)
{
var min = float.MaxValue;
var me = image[x,y];
for(var sy = 0; sy < height; sy++)
{
for(var sx = 0; sx < width; sx++)
{
var target = image[sx,sx];
if(target != me)
{
// target is the opposite color
var distance = Distance(x, y, sx, sy);
if(distance < min)
{
min = distance;
}
}
}
}
distanecImage[x,y] = min;
}
}
。これをスピードアップする方法はありますか?私はあなたがあなたのすべての隣人のための最も近い目標ピクセルを知っている場合、あなたはあなた自身の最も近い距離を計算することができます、イメージ全体をループする必要がないという考えを持っていました。しかし、私はそのアイデアを使ってアルゴリズムを作るのが難しいですか、そのようなアルゴリズムがどのように呼び出されるかは問題です。
私はDirectX9レベルのハードウェアに限られていますが、必要に応じてGPUを使用して処理速度を上げることができます。最大サイズは256x256です。
4 'for'ループは双二次時間複雑度' O(n^4) 'を示します – sds
単純なアプローチは、画像のピクセル数でO(n^2)です。 2D、3D、N-Dのいずれに配置するかは、要素の数には関係ありません:)。 –
これはピクセル数が2次であるが、ピクセル数は画像の線形次元では2次である。 – sds