otsu算法_字形的识别算法及其在2D增强现实中的应用研究

7bdb71b35363e1861ef0b82642e6eb17.png

介绍

字形(或最常被称为光学字形)的识别是一个很重要的交叉主题,在许多不同领域都有应用。光学字形最流行的应用是增强现实,其中计算机视觉算法在视频流中找到它们,并用人工生成的对象替代,从而创建一个视图,该视图在现实世界中是一半真实,一半是虚拟物体。光学字形应用的另一个领域是机器人技术,其中字形可用于向机器人发出命令,或帮助机器人在某些环境中导航,其中字形可用于指示机器人方向。这是光学字形应用的不错的演示之一:

在本文中,我们将讨论用于光学字形识别的算法,这是迈向基于光学字形的所有应用程序的第一步。对于某些应用程序,这可能是第一步也是唯一的步骤,因为识别是唯一需要的步骤。但是对于其他人,例如3D增强现实,这仅仅是个开始。

为了进行算法原型设计和测试,我使用了A4Go应用程序,该应用程序是老周出图软件的一部分。通常,它确实简化了在许多图像上对该算法的测试,并允许将精力集中在概念本身上,而不是其他一些不需要的编码。

7a5557640c0b1f1c457e986f737b1ff3.png

以下是我们旨在识别的一些标志符号的示例。所有字形均由一个正方形网格表示,该网格均等地划分为相同的行数和列数。网格的每个单元格都填充有黑色或白色。每个字形的第一行和最后一行/列仅包含黑色单元格,这会在每个字形周围创建黑色边框。我们还假设每个行和列都至少有一个白色单元格,因此不存在完全黑的行和列(除了第一个和最后一个)。所有这些字形都以以下方式打印在白纸上,即字形的黑色边框周围有白色区域(上面的A4Go图片显示了它们在打印时的外观)。

cd6d18fb626232ef4387f5e149ee1232.png

寻找潜在的字形

在进行字形识别之前,还有另一项任务需要首先解决-在图像中找到潜在的字形进行识别。任务的目的是找到所有看起来像字形的四边形区域-一个有望用于进一步分析和识别的区域。换句话说,我们需要在源图像中找到每个字形的4个角。碰巧,这项任务是整个字形搜索-识别项目中最困难的一项。

第一步很简单-我们将对 原始图像进行灰度处理,因为它会减少要处理的数据量,而且我们无论如何都不需要颜色信息。

接下来是什么?我们可以看到,所有字形都是对比度很强的对象-白纸上的黑色边框字形。因此,最有可能的好方向是搜索被白色区域包围的黑色四边形并进行分析。但是,如何找到它们?想法之一是尝试进行阈值处理,然后进行斑点分析以找到黑色四边形。当然,我们不会使用 带有预定义阈值的常规阈值,因为它不会给我们带来任何好处-我们根本无法为所有可能的光照和环境条件设置一个阈值。尝试阈值化 可能会产生一些好的结果:

b506d6032c97035bcbe8c7042fab59b2.png

正如我们在上面的图片中看到的那样,大津阈值法的工作做得很好-我们得到了黑色四边形,周围是白色区域。使用blob计数器,可以找到上述二进制图像上的所有黑色对象,进行一些检查以确保这些对象是四边形,等等。从这点开始,实际上一切都可以工作,但是可能一些问题。问题在于Otsu阈值处理适用于以上图像,而实际上适用于许多其他图像。但并非所有人都如此。这是其中一张图片,其中的图片无法正常运行,并且所有想法都失败了。

d6b2e02d02eb62fcf874d70a1aa1e9bb.png

上图显示了全局阈值在某些光照/环境条件下效果不佳。因此,我们可能需要找到另一个想法。

如前所述,光学字形是相当对比度的对象-黑色字形被白色区域包围。当然,对比度可能会根据光线条件而变化,黑色区域可能会变亮,而白色区域可能会变暗。但是,除非我们的照明条件绝对不好,否则差异仍然应该足够大。因此,我们可以尝试查找图像亮度急剧变化的区域,而不是尝试查找黑色或白色四边形。这是边缘检测器的工作,例如差分边缘检测器:

e2081066bdcccc525f3103658bf22b03.png

为了摆脱图像亮度变化不大的区域,我们将进行阈值处理。这是我们开始的3个示例的样子:

13a90ee590291ee39d0eeecd4d0c4d30.png

正如我们在上面的图片中看到的那样,所有检测到的字形都由形成四边形的独立斑点表示。在光照条件不是很糟糕的情况下,所有这些字形的四边形都具有良好连接的边缘,因此它们实际上是用单个斑点表示的,使用斑点计数算法可以很容易地提取它们。

以下是不良照明条件的示例,其中阈值化和阈值边缘检测均无法产生任何可用于进一步的字形定位和识别的良好结果。

57af30ae131a9d078256a110fd746242.png

因此,我们决定进行边缘检测,因此这是代码的开头(我们将使用 UnmanagedImage 以避免对.NET托管图像进行额外的锁定/解锁):

// 1 - 灰度

UnmanagedImage grayImage = null;

if ( image.PixelFormat == PixelFormat.Format8bppIndexed )

{

    grayImage = image;

}

else

{

    grayImage = UnmanagedImage.Create( image.Width, image.Height,

        PixelFormat.Format8bppIndexed );

    Grayscale.CommonAlgorithms.BT709.Apply( image, grayImage );

}

// 2 - 边缘检测

DifferenceEdgeDetector edgeDetector = new DifferenceEdgeDetector( );

UnmanagedImage edgesImage = edgeDetector.Apply( grayImage );

// 3 - 阈值边缘

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值