皮卡丘:“师兄! ”
师兄:“干嘛…?”
皮卡丘:“你帮我看看这个,这是我打车的发票,看起来有点不太清晰,老板说不给我报销…”
师兄:“你仿佛在特意逗我笑,这不是很清楚嘛!!! ”
皮卡丘:“我老板有强迫症,他说这个扫描之后不清楚,让我弄清晰点再给他,不然就不给我钱。师兄,你一定要帮我呀,不然以后都不能打车了。”
师兄:“不急,我先看看,我记得当初张康老师教过我对于这种信噪比很高的图像你要提取出想要的信息的话用二值化处理又简单又方便。“
皮卡丘:“这样啊,快弄给我看看。“
稍等,我开一下MATLAB…
皮卡丘只见师兄在命令行输入如下代码:
1 %copyright © [email protected] 2 %发票二值化处理 3 f = imread(‘czcfp.jpg‘); 4 figure( ‘NumberTitle‘,‘off‘,‘Name‘, ‘阈值为0.9处理前‘),imshow(f),title(‘阈值为0.9处理前‘) 5 fr = f(:,:,1); 6 fg = f(:,:,2); 7 fb = f(:,:,3); 8 thresh_r = 0.9 ; 9 thresh_g = 0.9 ; 10 thresh_b = 0.9 ; 11 %thresh_r = graythresh(fr); 12 %thresh_g = graythresh(fg); 13 %thresh_b = graythresh(fb); 14 r = im2bw(fr,thresh_r); 15 g = im2bw(fg,thresh_g); 16 b = im2bw(fb,thresh_b); 17 r = 255*r; 18 g = 255*g; 19 b = 255*b; 20 x=cat(3,r,g,b); 21 figure( ‘NumberTitle‘,‘off‘,‘Name‘, ‘阈值为0.9处理后‘),imshow(x),title(‘阈值为0.9处理后‘)
瞬间奇迹出现…
皮卡丘:“666666,快教我,师兄快教我。”
师兄:“这个其实很简单的。”
皮卡丘:“快说快说!!!”
师兄:“发票的扫描和信息识别一直是一个大家都很头疼的问题,尤其是出租车发票,因为出租车司机不会太注意这种东西,所以不会勤换墨。以至于打印出来的发票都不是很清晰,但是仔细辨认还是能够辨认出来的。”
皮卡丘:“就怕碰到我老板这种有强迫症的人”
师兄:“对,没错。这个时候数字图像处理的威力就展现出来了。这次你给我的是一副彩色图像,彩色图像是一个三维的矩阵,其中前两维是对应的行和列的灰度值,第三维中1 2 3分别对应R G B。所以我先提取出他们的RGB三个矩阵的分量,其次分别对他们二值化处理,其中的阈值可用matlab自动确定的阈值,也可用自己定下来的阈值。”
皮卡丘:“那他们之间有什么区别呢?“
师兄:“不急,我给你看看自动确定阈值的效果图。”
皮卡丘:“好像这样效果不太好诶…“
师兄:“是的,因为MATLAB自动确定阈值是使用“最大类间方差法“也就是我们常说的大津法简称OTSU。但是这种方法并不是对任何图像都管用的,最简单偷懒的方法就是先用OTSU确定一个阈值,再根据这个阈值适当调整一下就ok,当然这样笨的方法鲁棒性太差,如果你要做一个专门处理这个的系统,肯定要考虑很多因素进去,我这里有篇文献,你等下回宿舍可以好好看看。[1]谢志钢. 面向增值税发票的图像自动处理技术研究[D].上海交通大学,2015.”
皮卡丘:“好的,师兄再见 … ”
皮卡丘:“等等,师兄,你这里为什么要乘255( ⊙o⊙ )哇!“
师兄:“这个问题问得好,因为二值化处理之后所有的值都变成了1和0,所以我们乘一个255可以让图像对比度很高。“
皮卡丘:“这样呀,谢谢师兄。“