【问题标题】:How to smoothen a jagged border of an image into a straight line?如何将图像的锯齿状边框平滑成直线?
【发布时间】:2014-10-28 17:48:31
【问题描述】:

我有一张这样的图片(阈值化、去噪等已完成):

我的最终输出应该是没有任何锯齿状边缘的图像,并且小于给定图像。我的意思是说,两张图片之间的唯一区别在于,在新的一张中,锯齿状边缘必须移除,而不是锯齿状边缘填充。像这样(最终的图像必须是红色边框内的区域,红色边框仅用于说明):

我正在考虑使用 Hough 变换,或者使用膨胀然后腐蚀,但似乎没有任何效果(可能是我的错,因为我之前没有与它们进行过详细的研究)。

请注意,我希望使用的语言是 MATLAB。

这有两个主要目标:

  1. 使用霍夫变换自己获取边缘
  2. 这样在使用 regionprops 时,'Extrema' 属性会返回所需的品脱,如下所示:

问题,以更简洁的形式:

  1. 我将如何在 MATLAB 中提取这个 T,使其没有粗糙的边缘,但整体数字不大于原始数字,如上图第二个所示?换句话说,我将使用哪组转换(在 MATLAB 中)来平滑图像的边界尽可能少地丢失区域(但不添加区域),例如那种粗犷消失了?
  2. 是否有更有效的方法来提取如上图 2 所示的角(极值)点,而无需执行第 1 步?

编辑: 更多示例图片:

注意:考虑的所有图像都将由彼此大约成 90 度的矩形组成,而不是其他图形。因此,例如,平滑具有弯曲边缘的图像将超出该问题的答案范围(或者甚至,就此而言,梯形,尽管我认为平滑 2 个直边应该是相同的,无论是否边缘是否有另一个平行)。

这里还有几张图片,供参考:

【问题讨论】:

  • 你有什么问题?
  • 对不起。我已经更新了问题,以便问题更加突出
  • 您能否展示一些您希望该算法适用的图像。我认为编写适用于该图像的代码相对容易,但很难概括它,还是您只关心该图像?
  • 我进一步认为,由于您的限制,即使对于此图像,问题也不是那么容易,因此红线应该位于图像内部。无论如何,我建议你看看bwtraceboundary。它为您提供了一个 2 元素向量,因此您可以跟踪边界并从中获得边界 ([row col]) 的 2 元素向量。对此执行diff 并找出边界改变方向的点。一旦你得到这些点,你只需对它们进行后处理以满​​足你的约束。您可能无法得到完全正确的解决方案,但这是我目前能想到的。
  • 你要求你的红线段必须是轴对齐的,或者它们可以有任何斜率吗?

标签: image matlab image-processing


【解决方案1】:

我不确定我的回答是否能满足您的要求。我把它放在这里是因为我觉得评论太长了。

  • 由于您希望最终输出小于输入图像,因此侵蚀输入图像。您可以选择合适的内核大小。
  • 对此腐蚀图像执行角点检测。这将为您提供所有强角,但没有任何顺序
  • 追踪侵蚀图像的边界。这应该会给你一个有序的边界像素列表
  • 现在,借助这些有序的边界点,您可以对之前找到的角点进行排序
  • 过滤形成大约 90 度角的角点。您可以考虑每个 3 个有序角点(下图中的两个绿点和中间的红点。这只是为了说明,不是我计算的角点。在此操作结束时,所有红点都在除了其他黄色和绿色角点之外,下面的图像处于强角)
  • 现在您可以找到连接 2 个连续红点的直线方程

或

  • 将最小二乘线拟合到(包括)每两个连续红点之间的点

  • 由于您对本质上小于原始图像的侵蚀图像进行了所有这些处理,因此您应该得到更小的形状

【讨论】:

    猜你喜欢
    • 2019-04-30
    • 2018-02-22
    • 2016-01-10
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多