手写数字识别(一)
程序员文章站
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空间:可以看到明显的四个角点(图像空间是循环的)
画出直线:
找出角点:略有误差:)