首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

计算机视觉(三):请检测出文档中所有的字母l(即小写的L

Project 2:

请检测出文档中所有的字母l(即小写的L)

以上得到的是文档的原图。

待解决的问题:

是否能找到一个英文字符l所在的模板库,调用一下l的模板,并采用一种计算方法与文档中的一个个英文字母进行一一比对,最终根据运算结果,匹配识别出来,并用不同的颜色将l标记出来,完成检测的要求。亦或者自己裁剪出一个标准l的模板,然后根据l模板的像素特征,对图像进行卷积操作,对符合要求的l把它定位出来,并上色以示区分。

思路及原理:

主要思路是我打算先从图中剪切出一个l的模板,并采用卷积的方式对原图像进行运算。根据卷积得到的数值确定l所在点的位置,并将l用不同的颜色标记出来,以示区分。具体步骤如下:

1、将原始的BGR彩色图像读入,然后通过调用cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)函数将其转化为灰度图。

2、由于转化的灰度图背景是白色,字符是黑色,因此为了便于后面的卷积操作,将第一步得到的灰度图进行图像翻转,遍历原图想的像素矩阵,再对原图像的每个像素值用255减去操作。

3、对翻转之后的图像进行二值化,通过调用cv2.threshold函数进行二值化处理(既像素大于阈值的为黑,小于阈值的为白,抑或其他)。

4、将裁剪得到的模板与二值化图像进行卷积。该操作是本次实验的核心步骤,目的是在二值化图像上实现字符定位。首先在二值化图像中找到一个标准的字符‘l’,然后将其二值化矩阵作为一个模板,用该模板对二值化图像进行卷积,采用PythonOpenCV中的卷积函数cv2.filter2D进行卷积操作。

5、最后从卷积结果中对得到的矩阵的值进行判断,即可得到字符中心点的位置。通过找到‘l’的位置,然后在原始的彩色图上对‘l’上色,以示区分。

编程实现:

采用Python+OpenCV等方式来实现

首先读取文档中的原图像,并转化为灰度图,并得到原图的像素矩阵大小

,并使原图显示出来。

创建两个跟图像一样大小的矩阵,数值全部为零,用来存放每个像素的灰度值经过映射转化以后的BGR值。将灰度图翻转,方便之后的模板截取和卷积操作。

对图像进行二值化操作,其中四个参数,第一个是进行操作的对象是已经进行过灰度图翻转的图像,第四个参数是采用二值化的方式,在这里我采用cv2.THRESH_BINARY,即设定一个阈值(第二个参数),当大于该阈值时赋予一个像素值(即第三个参数)。

并在一个小的矩阵区域里面裁剪出了l的模板,并打印l模板矩阵中的各个像素点的像素值。

将原图像的二值图和l矩阵模板中的像素值为255的点转化为1,方便卷积操作。并查看l模板像素矩阵的各点的值。

创建一个矩阵dst1,用来存放卷积以后定位字符的像素矩阵。

对这两个矩阵进行卷积运算。

卷积以后得到一个与原图像一样大小的矩阵,因为l模板矩阵中有15个1,那么如果同样的面对原图像中的l卷积,最终中心点得到的结果也是15,那么就可以进行字符定位操作了。

定位以后,再对该点所在的一个15*7的矩阵为1的点进行染色(我这里把该l染成了绿色,即把,RB色道调为0,G色道调为255),并与原图进行区分,得到最终的检测结果。

并显示获得的结果。

结果及分析:

首先得到的是一张原图

接下来灰度化以后得到一张灰度图

再对灰度图进行灰度翻转,可以看到灰度翻转以后比原图看到清晰的多

可以看到灰度翻转以后的图像特别清晰,接下来对图像进行二值化处理

然后裁剪获得l的模板

他的像素矩阵为:

转化为1以后

可以看到一共是15个1,其余都是。接下来得到经过卷积运算以后的字符定位像素矩阵图

上图的小白点就是l字符所在的图中的位置。

然后从l字符定点所在的位置出发,以该点为中心点,取一个与l模板矩阵大小一样的区域,进行像素点的染色,以区分l与其他字符,并检验是否所有的l字符都被检测到了。

可以看到所有的l都被染成了绿色,可以看到和周边字符的区分还是很明显的。

结论:

由上图的检测结果可知,所有的l都被清楚地检测到了,没有遗漏。完成了项目所预期达到的目标。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180209G0BQQ400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券