我尝试实现一种使用种子点分割图像的方法,并将每个像素分配给最近的点。
例如,如果像素靠近1,则设置为1。
输入:
0 0 0 0 0 3 0
0 1 0 0 0 0 0
0 0 0 0 2 0 0
0 0 0 0 0 0 0
输出:
1 1 1 3 3 3 3
1 1 1 2 2 3 3
1 1 1 2 2 2 2
1 1 1 2 2 2 2
目前的方法需要计算 (宽度 * 高度 * 点数) 次,花费时间太长了,有什么算法可以更快吗?
处理 5 9478 * 1868 张图像,点数为 8,需要 7 秒的时间。
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
byte index = 0;
double distance = double.MaxValue;
for (int m = 0; m < elements.Count; m++)
{
CircleROI circle = roiResized[m];
double currentDistance = Math.Abs(i - circle.Center.Y) +
Math.Abs(j - circle.Center.X);
if (currentDistance < distance)
{
distance = currentDistance;
index = (byte)m;
}
}
*data++ = index;
}
}
numPoints
接近于与width * height
成比例,那么width * height * numPoints
就表示二次时间。而使用高效数据结构的线性时间方法可以轻松地快得多。 - Stefcircle.Center.Y
、circle.Center.X
或Math.Abs(..)
是否会花费大量时间。distance
可以是整数(性能分析可以告诉我们这是否有任何影响)。 - MrSmith42