【问题标题】:How can I find the middle points of x, y of a line segment in a binary image?如何在二值图像中找到线段的 x、y 的中点?
【发布时间】:2012-10-08 22:19:07
【问题描述】:

我在二进制图像中有一些损坏的线段,我需要修复它们(使它们笔直并保持原来的粗度)。为了做到这一点,我必须找到线段的中间点,所以当我检查邻域以找到线条的粗细时,我将能够找到像素停止为 1 的位置并且变成0。

【问题讨论】:

    标签: algorithm matlab image-processing line-segment


    【解决方案1】:

    假设您损坏的线段是直的,您可以使用 MATLAB 中的 regionprops 来找到每个边界框的中心。因为如果一个线段是直的,它总是边界框的对角线,因此框的中心也是线段的中心。

    【讨论】:

    • 不幸的是,这些段不是直的。你可以在这张图片中看到我的意思 [link] (imageshack.us/a/img825/1173/45157442.png)
    • 这里是我的想法,1.找到段的两个端点的大致位置,使用regionprops。 2. 做一个 Canny 边缘检测,这样你就得到了片段的轮廓。 3. 使用 Dijkstra 算法找到从一个端点到另一个端点的路径。 4.找到路径的中点。
    【解决方案2】:

    让我们称点 A 和 B 来减少歧义,A(Xa, Ya) 和 B(Xb, Yb)

    设C为中点。

    C(Xc, Yc)
    Xc = (Xa + Xb) / 2
    Yc = (Ya + Yb) / 2
    

    我们有四个有趣的数字,两个用于 X 坐标,两个用于 Y 坐标。

    Xmin = floor(Xc)
    Xmax = ceil(Xc)
    Ymin = floor(Yc)
    Ymax = ceil(Yc)
    

    中间点的 X 坐标是 Xmin 或 Xmax,中间点的 Y 坐标是 Ymin 或 Ymax。

    所以我们有四个潜在点:(Xmin, Ymin), (Xmin, Ymax), (Xmax, Ymin), (Xmax, Ymax)

    所以,最后,我们必须决定哪个点离 C 最近。

    P(Xp, Yp) 到 C(Xc, Yc) 的距离为:

    sqrt(sqr(Xp - Xc) + sqr(Yp - Yc))
    

    计算四个点到C的四个距离,选择最小值,这将是最好的中间点。

    【讨论】:

      【解决方案3】:

      假设

      A = [xa ya];
      B = [xb yb];
      

      然后

      C = round( mean([A;B]) );
      

      Matlab 的 round 将数字四舍五入到最接近的整数,因此这可以最大限度地减少从分析中心 (mean([A;B])) 到最近像素的(城市街区)距离。

      如果您想保持亚像素精度(这对于大多数计算来说实际上是可取的,直到需要从结果到像素索引的显式映射),只需删除 round 并仅使用 mean 部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-07
        • 1970-01-01
        • 1970-01-01
        • 2019-12-14
        • 2021-11-22
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        相关资源
        最近更新 更多