首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用一组点分割图像,将每个像素分配到最近的点?

如何用一组点分割图像,将每个像素分配到最近的点?
EN

Stack Overflow用户
提问于 2022-11-22 15:45:25
回答 2查看 48关注 0票数 3

我尝试实现一种用种子点分割图像的方法,并将每个像素分配到最近的点。

例如,如果像素接近1,则设置为1。

投入:

代码语言:javascript
运行
复制
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

产出:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
            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;
                }
            }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-22 17:41:21

这实际上是一个"Voronoi“,所以你可以用这个词来研究最优的方法。

您可以通过以下方式演示它:

  • 红色表示在坐标(1,1)处的颜色1
  • 在坐标(4,2)处,你的颜色为石灰绿。
  • 在坐标(5,0)处蓝色表示你的颜色3

并将输入图缩放成10倍,以使结果足够大以便于查看。然后在终端中用ImageMagick绘制它:

代码语言:javascript
运行
复制
magick -size 60x30 xc: \
   -sparse-color  Voronoi '10,10 red  40,20 lime  50,0 blue' \
   result.png

如果您只想坚持单通道灰度,而不是颜色,您可以使用:

代码语言:javascript
运行
复制
magick -size 60x30- xc: \
    -sparse-color  Voronoi '10,10 black 40,20 gray 50,0 white' result.png

安东尼·蒂森( Anthony Thyssen 这里 )对此和类似技术进行了出色的讨论和指导。

这与"Delaunay三角剖分“有关,虽然我还没有测试过,但我预计OpenCV 实现会非常快。

票数 3
EN

Stack Overflow用户

发布于 2022-11-22 15:49:48

您可以使程序按时间与像素数量成比例工作。

维护您当前“正在处理”的像素的队列

初始化此队列,使其包含最初非零的所有像素。

然后在队列不为空时循环:

  • 从队列中弹出像素(x,y);
  • 将(x,y)的每个零邻域涂上与(x,y)相同的颜色;
  • 将已着色的每个像素添加到队列中。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74535347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档