我有一個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中,它的數量無關緊要。 –
好的,它的像素數量是二次的,但像素的數量在圖像的線性維度上是二次的。 – sds