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’,然后将其二值化矩阵作为一个模板,用该模板对二值化图像进行卷积,采用Python和OpenCV中的卷积函数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都被清楚地检测到了,没有遗漏。完成了项目所预期达到的目标。
领取专属 10元无门槛券
私享最新 技术干货