手写数字识别(一)

手写数字识别(一)

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

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

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

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

效果:
手写数字识别(一)_第1张图片

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

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

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

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

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

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

你可能感兴趣的:(项目)