关于Matlab:如何将图像的锯齿状边缘平滑成直线?

How to smoothen a jagged border of an image into a straight line?

我有一个这样的图像(阈值,噪声消除等完成):

Original Image

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

Image showing how final border should be

我当时正在考虑使用Hough变换,或者先使用膨胀再进行腐蚀,但似乎没有任何效果(可能是我的错,因为我之前没有对它们进行过多的详细介绍)。

请注意,我不想在其中使用的语言是MATLAB。

有两个主要目的:

  • 要获取边缘本身,请使用霍夫变换
  • 这样,在使用regionprops时," Extrema"属性将返回所需的品脱,如下所示:
  • enter image description here

    以更简洁的形式提出的问题:

  • 我将如何在MATLAB中提取该T,以使其没有粗糙的边缘,但是整体图形不大于原始图形,如上面的第二个图形所示?换句话说,我将使用哪组转换(在MATLAB中)来平滑图像的边界,并尽可能减少损失的面积尽可能少(但不添加任何区域),从而使坚固性消失?
  • 是否有一种更高效的方法可以提取角(极值)点(如上图2所示),而无需执行步骤1?
  • 编辑:
    其他一些示例图像:

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

    这是另外一些图像,以供参考:

    reference image 2
    reference image 3, proof of my not-so-great GIMP skills


    我不确定我的答案是否会满足您的要求。我将其放在此处是因为我认为发表评论的时间太长了。

    • 由于您希望最终输出小于输入图像,因此请侵蚀输入图像。您可以选择适当的内核大小。
    • 对这个侵蚀的图像执行角点检测。这将为您带来所有优势,但无需任何命令
    • 跟踪侵蚀图像的边界。这应该给您边界像素的有序列表
    • 现在,借助这些有序边界点,您可以对先前找到的角点进行排序
    • 过滤形成大约90度角的角点。您可以考虑每个3个有序角点(在下图中两个绿色点和红色点之间)进行此操作。这只是出于说明目的,而不是我计算出的角点。在此操作结束时,所有红色点都在其中下方的图片以及其他黄色和绿色的拐角点均位于强角处)
    • 现在您可以找到连接两个连续红点的直线方程

    要么

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

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

    enter image description here