以编程方式识别手写形状:找到矩形的关键点

我的一个不切实际的目标是使用白板上的草图作为定义程序的方法 。 我的意思是您可以执行的正式程序。 当然,通过草图,您可以使用高级领域特定语言定义程序,例如描述状态机或实体关系图。

为此,我想开始识别矩形。 然后,我将继续识别其他形状,连接线并识别图中存在的文本。 现在,让我们专注于识别矩形。

我的一般方法如下:

  1. 认识有意义的路线
  2. 识别那些线中的关键点
  3. 使用AI对这些关键点进行分类
  4. 通过组合分类的关键点来找到形状

好。 这将不是我在一个周末内完成的工作。

输入图像

我们将使用3张图像:我在不同的光照条件下在白板上绘制了2张图像。 第三个是在Internet上找到的。 其特殊之处在于,草图是在方格纸上绘制的(即,在纸上有网格)。

sm2-150x150

白板(自然光)

sm3-150x150

白板(人造光)

状态流程图-150x150

方格纸

让我们看看如何处理这些图像。 我们将使用Java和BoofCV图像处理库。

灰阶

首先,我们将图像转换为灰度。 在这里我们遇到了在人造光下拍摄的图像的问题:

截图来自2016-04-02-14-51-23-1024x482

我们要删除右下角的那个巨大的灰色斑点。 为此,我们将使用导数。

衍生品

我们对图像进行模糊处理,以减少噪声的影响并计算导数。 这是一种捕获垂直或水平出现的颜色急剧变化的方法。

对于在自然光下拍摄的图像,我们将得到如下所示的图像:

截图来自2016-04-02-14-44-43-821x1024

但是,对于在人造光下拍摄的图像,我们会看到噪声:

截图来自2016-04-02-14-53-42-1024x479

在这一点上,我们获取图像的每个点,并查看图像周围是否有大量具有高导数的点(水平或垂直)。 我们保持满足条件的点,并将所有其他点设置为白色。 我们做了几次。

结果如下:

截图来自2016-04-02-14-56-12-1024x479

等高线

我们进行了一些额外的过滤,然后调用一个函数来查找图像内部的轮廓。 我们将外部轮廓绘制为红色,将内部轮廓绘制为蓝色。

屏幕截图-来自-2016-04-02-14-58-19-1024x484

然后我们删除短轮廓

屏幕截图-来自-2016-04-02-14-59-01-1024x475

关键点

我们得到的轮廓被绘制为非常短的线段列表。 让我们用蓝色绘制分段的极限。

屏幕截图来自2016-04-02-15-00-19-1024x483

是的,它们短:您只会看到一系列连续的极端,彼此之间非常接近。 我们希望获得更少的细分市场,更长的时间。

为此,我们基本上使用两种策略:

  1. 我们只是合并非常接近的连续极限
  2. 我们采用三个连续点的序列:A,B,C。如果B非常靠近A和C之间的线,我们只需移除B

我们对这两种策略都应用了两次,并获得了更简单的轮廓。 这是最终结果。

屏幕截图-来自-2016-04-02-15-03-35-150x150 屏幕截图-来自-2016-04-02-15-03-19-150x150 屏幕截图-来自-2016-04-02-15-05-50-150x150

接下来是什么

现在我们有合理数量的相关点。 我现在想通过机器学习技术对它们进行分类。 例如,我想将单个点识别为矩形的左上角或箭头的点部分。 然后,我将结合这些公认的点来获得整个形状(我的矩形!)。

现在,我已经在生成图像进行分类,并且正在考虑将哪些功能用于机器学习。 我有一些想法,但我们将在下一篇文章中看到它们。

训练图像如下所示:

point_1_109

翻译自: https://www.javacodegeeks.com/2016/04/recognizing-hand-written-shapes-programmatically-find-key-points-rectangle.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值