How to smoothen a jagged border of an image into a straight line?
我有一个这样的图像(阈值,噪声消除等完成):
我的最终输出应该是没有任何锯齿状边缘且小于给定图像的图像。这样一来,我的意思是说这两个图像之间的唯一区别必须是在新图像中,必须除去锯齿状的边缘,而不是填充锯齿状的边缘。这样(最终图像必须是红色边框,红色边框仅用于说明):
我当时正在考虑使用Hough变换,或者先使用膨胀再进行腐蚀,但似乎没有任何效果(可能是我的错,因为我之前没有对它们进行过多的详细介绍)。
请注意,我不想在其中使用的语言是MATLAB。
有两个主要目的:
以更简洁的形式提出的问题:
编辑:
其他一些示例图像:
注意:所有要考虑的图像都将由彼此大约为90的矩形组成,没有其他图形。因此,例如,平滑具有弯曲边缘的图像将超出该问题的答案范围(甚至就此而言,梯形也是如此,尽管我认为平滑2个直线边缘应该相同,而不管是否边缘是否与另一个平行)。
这是另外一些图像,以供参考:
我不确定我的答案是否会满足您的要求。我将其放在此处是因为我认为发表评论的时间太长了。
- 由于您希望最终输出小于输入图像,因此请侵蚀输入图像。您可以选择适当的内核大小。
- 对这个侵蚀的图像执行角点检测。这将为您带来所有优势,但无需任何命令
- 跟踪侵蚀图像的边界。这应该给您边界像素的有序列表
- 现在,借助这些有序边界点,您可以对先前找到的角点进行排序
- 过滤形成大约90度角的角点。您可以考虑每个3个有序角点(在下图中两个绿色点和红色点之间)进行此操作。这只是出于说明目的,而不是我计算出的角点。在此操作结束时,所有红色点都在其中下方的图片以及其他黄色和绿色的拐角点均位于强角处)
- 现在您可以找到连接两个连续红点的直线方程
要么
-
将最小二乘法拟合到每两个连续的红色点(包括)之间的点
-
由于您已对本质上小于原始图像的侵蚀图像进行了所有这些处理,因此您应该获得较小的形状