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

article/2025/6/23 18:35:30

 

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

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

原图

灰度化

二值化

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

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

  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探索


http://chatgpt.dhexx.cn/article/NQE8Sf3Q.shtml

相关文章

OpenCV实践:去除票据中的红色印章

现实生活中&#xff0c;一些票据&#xff08;比如发票、车票&#xff09;等都会有一个红色印章&#xff0c;有时会盖在某个关键区域&#xff0c;影响了其他的字符识别。因此&#xff0c;为了提高准确率&#xff0c;我们尽量会移除红色印章&#xff0c;具体实现方法如下&#xf…

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

http://www.cnblogs.com/skyfsm/p/7638301.html 最近在做票据识别的编码工作时遇到一些问题&#xff0c;就是票据上往往会有一些红色印章把一些重要信息区域给覆盖了&#xff0c;比如一些开发票人员盖印章时比较随意&#xff0c;容易吧一些关键区域给遮蔽了&#xff0c;这让接下…

OPENCV实践项目-去除票据中的红色印章

目录 1. 实现方法2. 代码实现3. 结果展示 1. 实现方法 现实生活中&#xff0c;一些票据&#xff08;比如发票、车票&#xff09;等都会有一个红色印章&#xff0c;有时会盖在某个关键区域&#xff0c;影响了其他的字符识别。因此&#xff0c;为了提高准确率&#xff0c;我们尽…

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

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

OpenCV—python 发票印章去除或分割(图像内容识别预处理)

前言 在做发票内容识别时&#xff0c;发现发票的印章遮挡住文字信息&#xff0c;尤其在合计金额处&#xff0c;导致这一处的信息提取出问题&#xff0c;于是想到去除发票印章。 思路一&#xff1a;通过颜色通道获取所需信息图 &#xff08;代码主要是参考 http://www.deanha…

【图像处理通道分离去除印章】

如下图所示&#xff0c;想要取出图像上的红色印记&#xff0c;我们可以采用通道分离的方法&#xff0c;具体如下&#xff1a; #include<opencv2\opencv.hpp> #include<string> #include <vector>using namespace cv; using namespace std;int main() {Mat sr…

C++OpenCV去除发票中红色的印章部分实战

1.背景 最近一个客户要求去除发票中的红色印章部分: 就是票据上往往会有一些红色印章把一些重要信息区域给覆盖了,比如一些开发票人员盖印章时比较随意,容易吧一些关键区域给遮蔽了,这让接下来的票据识别很困难,因此,我们必须先对票据图像进行一定的预处理来移除印章干扰…

opencv去除印章痕迹

今天看到一个很有意思的程序&#xff0c;就是去除票据上的红色印章&#xff0c;觉得很有意思&#xff0c;就把它抄过来记录一下&#xff0c;同时自己也开了一下脑洞。 原来的程序来自&#xff1a;https://www.cnblogs.com/skyfsm/p/7638301.html 可以看到图像效果很不错&#…

Python OpenCV基于颜色通道分离法去除图片中的红色印章

最近一段时间的工作都是研究如何去除图片中的红色印章&#xff0c;在网上查找了大量的大佬写过的方法&#xff0c;发现大多数是采取颜色通道分离法来做&#xff0c;并且效果还不错。站在前人的肩膀上&#xff0c;我又做了些许调整&#xff0c;谈不上是改进&#xff0c;但是能应…

OCR图片预处理之去除印章(一)

导读 在做OCR票据类识别的时候经常会遇到一些票据上会有印章&#xff0c;而对于的文字检测和文字识别模型而言&#xff0c;印章的存在一定会影响模型识别的准确率&#xff0c;所以通常我们都是先将图片去除印章之后&#xff0c;再将图片送入到文字检测和文字识别模型中。 本篇…

CSS垂直居中的几种方法

目录 1.设置行高line-height 2.内边距法&#xff08;padding&#xff09; 3.模拟表格法 4.绝对定位 5.使用flex布局 1.设置行高line-height 如果要垂直居中的只有一行或几个文字&#xff0c;那它的制作最为简单&#xff0c;只要让文字的行高和容器的高度相同即可 div {hei…

CSS中垂直居中的七种方法

前言&#xff1a; 我们在编辑一个版面&#xff0c;通常都会用到水平居中和垂直居中来设计&#xff0c;而水平居中很好处理&#xff0c;不外乎就是设定margin:0 auto&#xff1b;或是text-align:center&#xff1b;&#xff0c;就可以轻松解决掉水平居中的问题&#xff0c;但一…

CSS文本垂直居中的几种方法

观看更佳-点击前往 一、单行文本的居中 1.文字水平居中 <div classbox style"text-align: center;">hello world</div>2.文本垂直水平居中 <div class"box2" style"width:150px;height:100px;line-height: 100px;">文本垂直…

css如何设置文本垂直居中显示,css中怎么设置文本居中?css文本垂直居中的设置方法...

在网页设计的过程中&#xff0c;有时候可能为了布局美观可能需要让文本居中&#xff0c;那么&#xff0c;怎么设置文本居中呢&#xff1f;本篇文章将给大家介绍关于css设置文本垂直居中的方法。 首先我们要知道通过css实现元素的水平居中较为简单&#xff1a;对文本&#xff0c…

css表格怎么垂直居中对齐,css表格垂直居中怎么设置?

css设置表格垂直居中的方法&#xff1a;1、在表格外面嵌套一层table&#xff0c;用table中的td来控制居中。2、将表格放在div标签中&#xff0c;通过为div设置css样式display:table-cell实现垂直居中。 css设置表格垂直居中的方法&#xff1a;1、在表格外面嵌套一层table&#…

竖排文字垂直居中css样式

竖排文字垂直居中css样式 <div class"item"><p class"bgcolor-green">A0001</p><p class"bgcolor-yellow">A0002</p><p class"bgcolor-red">A0003</p><p class"bgcolor-green"…

CSS实现水平垂直居中的五种方法

前言 今天来看看一个之前困扰我很久的问题&#xff0c;在CSS中&#xff0c;水平垂直居中&#xff0c;能有几种写法。 方法一&#xff1a;margin:auto 子绝父相&#xff0c;当元素绝对定位的时候&#xff0c;会根据最近父元素进行定位&#xff0c;利用这个特性&#xff0c;我…

CSS 元素垂直居中的 6种方法

转自&#xff1a;http://blog.zhourunsheng.com/2012/03/css-%E5%85%83%E7%B4%A0%E5%9E%82%E7%9B%B4%E5%B1%85%E4%B8%AD%E7%9A%84-6%E7%A7%8D%E6%96%B9%E6%B3%95/ 利用CSS进行元素的水平居中&#xff0c;比较简单&#xff0c;行级元素设置其父元素的text-align center&#xff…

使用 CSS 实现垂直居中的8种方法

​​​​​​CSS垂直居中的8种方法 目录 ​​​​​​CSS垂直居中的8种方法 1、通过vertical-align:middle实现CSS垂直居中。 2、通过display:flex实现CSS垂直居中。 3、通过伪元素:before实现CSS垂直居中。 4、通过display:table-cell实现CSS垂直居中。 5、通过隐藏节点…

css垂直居中的6种方式

在线demo演示地址&#xff1a;https://rondsjinhuajin.github.io/demo/index.html 个人博客主页&#xff1a;KinHKin的博客_CSDN博客-vue,中秋活动,性能优化领域博主 使用人群&#xff1a;前端面试&#xff0c;日常开发小技巧 目录 1、效果演示如下 ​编辑 1、使用display:…