欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

手写数字识别(一)

程序员文章站 2022-03-28 13:48:49
...

手写数字识别(一)

纸张边缘检测以及寻找角点

项目基于c++ 的 CImg库
1. 读取图片

通过CImg构造函数从对应路径中读出图像

string infile = "../Dataset/";
infile = infile+file_name+".jpg";
CImg<float> in(infile.c_str());

效果:
手写数字识别(一)

2. 应用Canny对图像进行边缘检测,采用非极大值抑制

Canny是一种通过不同角度计算图像灰度值变换而进行边缘检测
手写数字识别(一)
可以看到A4纸的边缘已经被提取出来了,但是由于外部环境还有许多噪音,而且纸张内容也会影响直线提取,所以应当做一些处理排除干扰

3. 通过简单的bfs排除纸张边缘外的噪音干扰

首先是对提取的Canny边缘进行膨胀操作
然后在图像*区域做一个多源BFS,只能通过黑色区域进行搜索,对于所有搜索过的黑色区域以及触碰到的边缘分别打上不同的标记
手写数字识别(一)
通过这个我们可以保证搜索区域只在纸张内部,并且纸张边缘都被打上了标记,于是我们便可以通过一次搜索把所有没搜到过的点都变为黑点,清除了纸张外部的所有噪音
同理在纸张外部做一次同样操作(我选的是[0,0]点进行的bfs),也可以把纸张内部的噪音除去
手写数字识别(一)
结果就剩下一个简单的A4纸边缘框
手写数字识别(一)

4. 通过hough变换找到直线,并且搜到角点

Hough变换是一种很经典的寻找图像中直线的方法,主要是通过一次坐标变换,使得在原坐标中同一直线上的点在变换后交于同一点,通过搜索可以找出直线
Hough空间:可以看到明显的四个角点(图像空间是循环的)
手写数字识别(一)
画出直线:
手写数字识别(一)
找出角点:略有误差:)
手写数字识别(一)