最近在做票据识别的编码工作时遇到一些问题,就是票据上往往会有一些红色印章把一些重要信息区域给覆盖了,比如一些开发票人员盖印章时比较随意,容易吧一些关键区域给遮蔽了,这让接下来的票据识别很困难,因此,我们必须先对票据图像进行一定的预处理来移除印章干扰,再进行字符识别,这样子识别准确率才有保证。

我们从简单例子说起,比如我们有以下一张票据,上面盖有红色印章,虽然该印章没有遮挡关键信息,但是我们还是打算将其移除,那该怎么办?首先想到的肯定移除红色像素点的方法,这种方法需要查到红色的颜色范围,然后遍历全图像素点,在范围内的像素点就将它设置为白色。这种方法用起来其实不太好,毕竟这个“红色范围”的设定还是蛮困难的一件事。那现在我说一下我的方法,用几行代码移除红色印章。

原图

灰度化

二值化

做票据识别一般都要将票据转化为二值图像,我们从上面的二值图像可以看出,票据上还是存在大块的印章痕迹,我们此刻的任务就是,将它从票据中移除!

其实实现的方法非常简单,关键就是分离颜色通道 + 阈值分割。步骤如下:

  1. 对彩色图分离通道,拿到红色通道图
  2. 进行阈值分割

先看一下用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探索之路(二十六):如何去除票据上的印章(C++ )相关推荐

  1. OpenCV探索之路(二十六):如何去除票据上的印章

    http://www.cnblogs.com/skyfsm/p/7638301.html 最近在做票据识别的编码工作时遇到一些问题,就是票据上往往会有一些红色印章把一些重要信息区域给覆盖了,比如一些开 ...

  2. OpenCV:如何去除票据上的印章

    最近在做票据识别的编码工作时遇到一些问题,就是票据上往往会有一些红色印章把一些重要信息区域给覆盖了,比如一些开发票人员盖印章时比较随意,容易吧一些关键区域给遮蔽了,这让接下来的票据识别很困难,因此,我 ...

  3. opencv学习(二十六)之图像金字塔(高斯金字塔、拉普拉斯金字塔)

    在进行数字图像处理时,我们可能会需要将某种尺寸的图像转换为其他尺寸的图像,这样会存在放大图像核缩小图像两种可能.opencv提供了一个真正意义上的图像所方函数resize(),但在本篇中主要学习以下使 ...

  4. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  5. OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

    OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...

  6. OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

    OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...

  7. OpenCV学习(二十) :分水岭算法:watershed()

    OpenCV学习(二十) :分水岭算法:watershed() 参考博客: OpenCV-分水岭算法 图像处理--分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法--wat ...

  8. GPS从入门到放弃(二十六) --- RTKLIB函数解析

    GPS从入门到放弃(二十六) - RTKLIB函数解析 为了贴合这个系列的标题"从入门到放弃",在入门之后现在就要放弃此方向了.虽然感觉遗憾,暂时也没有办法.在此附上此系列最后一篇 ...

  9. (转)tensorflow入门教程(二十六)人脸识别(上)

    https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...

最新文章

  1. Android开发--Spinner控件的使用
  2. 用sysctl调整linux内核参数
  3. 中国家用中央空调行业发展动态解析及规划趋向预测报告2022-2028年版
  4. tf报错之raise TypeError(“pred must not be a Python bool“)
  5. 桐花万里python路-基础篇-05-字符串及浮点数
  6. StateListDrawable 动态更换背景
  7. 回文自动机算法+马拉车算法概述及习题【回文串系列问题】
  8. ofd文件怎么复制文字
  9. UE4游戏提取的通用步骤(21_9_8)
  10. 数据结构与算法分析(C++版) 张铭 等译
  11. 创建微信卡券 php
  12. HDU 6437 (费用流)
  13. 二进制计算机课教案,《二进制与计算机》教学设计
  14. Windows 7/Vista 桌面快捷方式小箭头变成黑块,如何恢复?
  15. java jdk 配置不成功_JDK配置环境变量不成功的原因
  16. 如何将google的扩展程序打包:
  17. S3C2440移植linux3.4.2内核之内核框架介绍及简单修改
  18. mysql带条件的插入语句
  19. 70个JavaScript面试题集锦,内含解答,自测 JS 掌握程度
  20. i3 1215U 和 i5 1235U选哪个好

热门文章

  1. SPC Control Chart Tools for WPF 3.1 Crack
  2. 【100%通过率】华为OD机试真题 Java 实现【垃圾短信识别】【2023 Q1 | 100分】
  3. xp系统打印机服务器不可用,WinXP系统添加打印机操作无法完成如何解决?
  4. 服务器没响应smtp,smtp服务器网关没响应
  5. mysql数据库ftp备份_Linux下自动备份MySQL数据库并上传到远程FTP服务器且删除指定日期前的备份Shell脚本...
  6. 双路快速排序以及三路排序算法
  7. android 手机充电慢,安卓手机充电慢是怎么回事
  8. Metaverse Web 3.0 和 DeFi大师班
  9. cm是什么域名_cm域名和com域名有什么差别?
  10. mysql索引 include_MySql索引详解