代码之家  ›  专栏  ›  技术社区  ›  Ido Weinstein

连接点-连接轮廓点之间的线

  •  4
  • Ido Weinstein  · 技术社区  · 14 年前

    • 除以2(100/2=50)
    • 在结果周围定义一个标注栏(50-5=45到50+5=55)
    • 标记带中所有有值的点(45到55之间)

    (所有参考资料、链接、想法等都将被接受)

    6 回复  |  直到 14 年前
        1
  •  4
  •   Rex Kerr    14 年前

    你的算法允许整个图像,除了一个像素,成为“轮廓”。我不确定那正是你想要的;通常轮廓是 边境

    考虑以下图像。

    ........
    ..%%%%..
    .%%%%...
    ...%%%%.
    ....%...
    ........
    

    在这里,我将所有内容都标记为“黑暗”(<50,也许)作为 % 一切都那么明亮 . . 现在您可以选择两个区域之间边界上的任何像素(我将选择暗面;您也可以在亮面绘制轮廓,或者直接在亮面和暗面之间进行更多的工作。)

    ........
    ..%%%%..
    .*%%%...
    ...%%%%.
    ....%...
    ........
    

    现在你试着沿着黑暗区域的外边缘移动,一次一个像素。首先,你朝着明亮的方向看(例如,直接向左看)。然后你逆时针旋转直到你碰到一个暗像素。

    ........
    ..%%%%..
    1*5%%...
    234%%%%.
    ....%...
    ........
    

    一旦你击中位置 5 ,你看,天黑了。所以,你把它标记为轮廓的一部分,然后试着从你刚从的像素开始扫来扫去,找到轮廓上的下一块

    ........
    ..%%%%..
    .0*%%...
    .123%%%.
    ....%...
    ........
    

    0 你是从哪里来的-你不会回到那里-然后你尝试像素 1 2 (两个光,这是不好的),直到你击中像素 3 ,这是黑暗的。

    通过这种方式,你可以一个像素一个像素地绕着轮廓走——既可以识别轮廓,也可以得到像素的顺序——直到你与你开始使用的同一个像素发生碰撞 会离开它,所以你击中了你第一次离开它时做的同一个像素。然后轮廓闭合。在我们的例子中,我们制作一个8连通的轮廓(即,我们看8个邻域,而不是4个邻域),我们会得到以下结果(其中 @

    ........
    ..@@@@..
    .@@%@...
    ...@%@@.
    ....@...
    ........
    

    在这一点上,你已经涵盖了 整个边界。但可能还有其他人。一直在亮像素旁边寻找暗像素,直到你在它们上面画了一个轮廓。现在,您已经转换了两级图片(深色&明亮的像素)形成一组轮廓。

    如果轮廓太嘈杂,首先考虑模糊图像。这将使轮廓变得平滑(或者,您可以先找到等高线,然后使用移动窗口平均坐标。)

        2
  •  1
  •   mbeckish    14 年前

    其他形状可能要复杂得多,没有明显的方法来连接这些点。

    如果你被允许把你的分数减少到 convex hull ,那就容易多了。

        3
  •  1
  •   wladik    14 年前

    我还试图创建一个算法,将连接到平滑曲线轮廓点。查看我的开源项目 http://outliner.codeplex.com . 这个想法和fuzzxl提出的是一样的,但我不理解他对复杂性的担忧:处理时间与所有轮廓笔划的总长度成正比。

        4
  •  0
  •   aioobe    14 年前

    我不知道收集这些积分是否能帮你走得更远(我能想出一些情况,在这种情况下,几乎不可能知道他们应该按哪个顺序来。)


    去亮度点,比如说,360个点围绕这个点,距离,比如说,5个像素。
    从那里继续,但确保不要回到原来的地方:)

        5
  •  0
  •   fuz    14 年前

    或许可以试试:

    1. 从一开始
    2. 连接a和b
    3. 等等。

    可能不太好,因为复杂性有点像O(n)。正如aioobe所建议的,你可以通过只寻找接近起点的点来简化这个过程。这个算法很好,如果点之间的距离只有2-3px,但是可能会创建非常奇怪的网格。

        6
  •  0
  •   Community Bayu Bramantya    7 年前

    另请参见 Flood fill 可爱的小程序 mapping-a-branching-tile-path