OpenCV探索之路(二十六):如何去除票据上的印章
来源:互联网 发布:淘宝网44号女士运动鞋 编辑:程序博客网 时间:2024/04/28 19:51
http://www.cnblogs.com/skyfsm/p/7638301.html
最近在做票据识别的编码工作时遇到一些问题,就是票据上往往会有一些红色印章把一些重要信息区域给覆盖了,比如一些开发票人员盖印章时比较随意,容易吧一些关键区域给遮蔽了,这让接下来的票据识别很困难,因此,我们必须先对票据图像进行一定的预处理来移除印章干扰,再进行字符识别,这样子识别准确率才有保证。
我们从简单例子说起,比如我们有以下一张票据,上面盖有红色印章,虽然该印章没有遮挡关键信息,但是我们还是打算将其移除,那该怎么办?首先想到的肯定移除红色像素点的方法,这种方法需要查到红色的颜色范围,然后遍历全图像素点,在范围内的像素点就将它设置为白色。这种方法用起来其实不太好,毕竟这个“红色范围”的设定还是蛮困难的一件事。那现在我说一下我的方法,用几行代码移除红色印章。
原图
灰度化
二值化
做票据识别一般都要将票据转化为二值图像,我们从上面的二值图像可以看出,票据上还是存在大块的印章痕迹,我们此刻的任务就是,将它从票据中移除!
其实实现的方法非常简单,关键就是分离颜色通道 + 阈值分割。步骤如下:
- 对彩色图分离通道,拿到红色通道图
- 进行阈值分割
先看一下用split函数分离出来的三通道图像
红色通道
绿色通道
蓝色通道
从上面各通道的图像看出,每个通道的图像是略有不同,不同的地方就在于对不同颜色的敏感度不同。看一下红色通道的图,我们发现原图中的红色基本不见了!总结一下就是,原图中颜色越接近红色的地方在红色通道越接近白色。在纯红的地方在红色通道会出现纯白。绿色、蓝色也是同样的道理。
但是仔细观察一下票据图像中还是有一些印章痕迹,这时再使用一下阈值分割技术就可以移除一些印章痕迹了。
上面就是阈值分割后的图,可以看出,该二值图像已经完全看不出有印章的痕迹了,这时我们可以说比较好地移除了印章干扰。
代码
#include "opencv2/imgproc.hpp"#include "opencv2/highgui.hpp"using namespace cv;int main(){ Mat src = imread("100.bmp"); //resize(src, src, Size(700, 500)); Mat gray; cvtColor(src, gray, CV_RGB2GRAY); if (src.empty()) { printf("fail to open image!\n"); return -1; } // 全局二值化 int th = 180; //阈值要根据实际情况调整 Mat binary; threshold(gray, binary, th, 255, CV_THRESH_BINARY); vector<Mat> channels; split(src, channels); Mat red = channels[2]; Mat blue = channels[0]; Mat green = channels[1]; Mat red_binary; threshold(red, red_binary, th, 255, CV_THRESH_BINARY); imshow("src", src); imshow("gray", gray); imshow("binary", binary); imshow("red channel", red); imshow("blue channel", blue); imshow("green channel", green); imshow("red+binary", red_binary); waitKey(); return 0;}
来多几张发票看看效果
移除前
移除后
移除前
移除后
下面这个情形比较经典,因为印章刚好把一些关键区域(金额)给遮挡住了,现在人的肉眼也很难辨别出它的具体数字了,那机器还能正确识别吗?如果不做任何处理,机器也是没办法识别的,但是预处理一下之后,机器就能准确识别出其数字了。
移除前
移除后
当然,这种分离通道+阈值分割的方法还可以用到其他场合,例如在红绿灯的检测上,也是可以借鉴这种方法的。我在网上找了张红绿灯的照片来测试,也看看效果吧~
检测红灯
检测绿灯
- OpenCV探索之路(二十六):如何去除票据上的印章
- OpenCV探索之路(二):图像处理的基础知识点串烧
- opencv学习笔记(二十六)直方图有关的操作
- Android探索之旅(第二十六篇)Android如何运用Fidder进行对AndroidApp应用数据的抓取
- cas 入门之二十六:person directory(上)
- OpenCV探索之路(二十三):特征检测和特征匹配方法汇总
- OpenCV探索之路(二十四)图像拼接和图像融合技术
- OpenCV探索之路(二十四)图像拼接和图像融合技术
- OpenCV探索之路(二十四)图像拼接和图像融合技术
- OpenCV入门(二十六)-- 轮廓检测
- 操作系统理论的探索: (之二)
- opencv学习笔记(二十六)——相机标定之棋盘提取角点
- Python探索之路(二)---输出
- OpenCV之路(二)
- OpenCV探索之路(十):图像修复技术
- 我的编程之路(二十六) 国庆假期(一)
- angularJS学习之路(二十六)---创建服务的五大方法---constant
- Hibernate的学习之路二十六(多对多)
- 注释变强哦
- Java多线程
- 二维码
- 字母变成其下一字母
- 洛谷 P3932 浮游大陆的68号岛 前缀和
- OpenCV探索之路(二十六):如何去除票据上的印章
- Android Studio Gradle Scripts配置说明
- poj2458 Highways(最小生成树模版)
- 计算N!
- 第十六篇 深入elasticsearch聚合数据分析
- 2017.11.3 測試總結并今日總結
- 显示密码
- Unity Splash Screen
- Spring Boot简介及安装