如何将图像的锯齿边缘平滑成直线?

4
我有这样的一张图片(已完成阈值处理,噪声去除等操作):
我的最终输出应该是一张没有任何锯齿边缘并且比给定图片小的图片。我指的是新旧两张图片唯一的不同之处在于新图片中的锯齿边缘被移除了,而不是填充了。就像这样(最终图片必须是红色边框内的区域,红色边框仅用于解释):
我想的是使用霍夫变换或使用膨胀然后腐蚀等方法,但似乎都无效(可能是我的问题,因为我之前没有详细研究过它们)。
请注意,我想要使用的语言是MATLAB。
这有两个主要目标:
1.使用霍夫变换获取边缘
2.当使用regionprops时,“Extrema”属性返回所需点,如下所示:
问如下:
1.如何在MATLAB中提取此T,以便它没有粗糙的边缘,但总体图形不会比原始图像更大,如上图二所示?换句话说,采用什么一组转换(在MATLAB中)可以使图像边缘平滑(尽量不损失面积,但不添加面积)以消除粗糙感?
2.是否有一种更有效的方法来提取角点(极值点),如上图二所示,而不需要经过第一步?
附加信息:
考虑到的所有图像都由大约相互垂直的矩形组成,没有其他图形。因此,使有曲线边缘的图像变平滑,例如,将超出这个问题的范围(或者说,一个梯形),尽管我认为使两条直边变得平滑应该是相同的,无论该边是否有另一条与之平行。
以下为几张参考图片:

2
你有什么问题? - Celeo
1
你能展示一些你希望这个算法工作的图片吗?我认为编写一个适用于这张图片的代码相对容易,但是很难将其推广到其他图片上,或者你只关心这张图片吗? - Autonomous
1
我认为即使对于这个图像,由于您的限制条件,问题也不是那么容易解决,例如红线应该在图像内部。无论如何,我建议您查看bwtraceboundary。它会给你一个二元向量,因此你可以跟踪边界,并从中得到边界的二元向量([行列])。对此进行差分并找出边界改变方向的点。一旦您获得了这些点,您只需要对其进行后处理以满足您的约束条件。您可能无法完全正确地解决问题,但这是我现在能想到的。 - Autonomous
你需要让你的红色线段与坐标轴对齐,还是可以有任意斜率? - beaker
谢谢。我已经更新了问题。 - aspiring_sarge
显示剩余6条评论
1个回答

2
我不确定我的答案是否能满足您的要求。我把它放在这里,因为我认为它对于评论来说太长了。
  • 由于您希望最终输出比输入图像小,请侵蚀输入图像。您可以选择适当的内核大小。
  • 在这个侵蚀图像上执行角点检测。这将给出所有强角点,但没有任何顺序。
  • 跟踪侵蚀图像的边界。这应该给你一个有序的边界像素列表。
  • 现在,借助这些有序的边界点,你可以排序之前找到的角点。
  • 过滤掉形成大约90度角的角点。您可以考虑每3个有序的角点(下面图片中的两个绿点和中间的红点,仅用于说明,不是我计算出的角点)。在此操作结束时,您有下图中的所有红点,它们是强角点,另外还有其他黄色和绿色角点。
  • 现在,您可以找到连接2个连续红点的线的方程。

或者

  • 对于每2个连续的红点之间的点,拟合最小二乘线

  • 由于您在侵蚀图像上进行了所有这些处理,该图像实际上比原始图像小,因此您应该得到一个较小的形状

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接