我尝试实现一种用种子点分割图像的方法,并将每个像素分配到最近的点。
例如,如果像素接近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目前的方法耗时太长,计算(宽度*高度* numPoints)次数多,有没有算法可以更快?
处理5 9478 * 1868图像7秒,numPoints =8
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;
}
}发布于 2022-11-22 17:41:21
这实际上是一个"Voronoi“,所以你可以用这个词来研究最优的方法。
您可以通过以下方式演示它:
并将输入图缩放成10倍,以使结果足够大以便于查看。然后在终端中用ImageMagick绘制它:
magick -size 60x30 xc: \
-sparse-color Voronoi '10,10 red 40,20 lime 50,0 blue' \
result.png

如果您只想坚持单通道灰度,而不是颜色,您可以使用:
magick -size 60x30- xc: \
-sparse-color Voronoi '10,10 black 40,20 gray 50,0 white' result.png

安东尼·蒂森( Anthony Thyssen 这里 )对此和类似技术进行了出色的讨论和指导。
这与"Delaunay三角剖分“有关,虽然我还没有测试过,但我预计OpenCV 实现会非常快。
发布于 2022-11-22 15:49:48
您可以使程序按时间与像素数量成比例工作。
维护您当前“正在处理”的像素的队列。
初始化此队列,使其包含最初非零的所有像素。
然后在队列不为空时循环:
https://stackoverflow.com/questions/74535347
复制相似问题