【发布时间】:2017-06-15 19:13:16
【问题描述】:
我有一个用黑白像素填充的二维图像。现在对于我想知道(到)最近黑色像素的每个白色像素,以及对于我想知道(到)最近白色像素的每个黑色像素的每个黑色像素。
一个简单的算法应该是:
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) -
天真的方法是图像中像素数的 O(n^2)。将它们排列成 2D、3D 还是 N-D 并不重要,重要的是元素的数量:)。
-
好的,它的像素数是二次方的,但像素数是图像线性维度的二次方。
标签: algorithm 2d dynamic-programming