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

article/2025/6/23 20:36:32

 

 

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

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

原图

 

灰度化

 

二值化

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

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

  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;
}

python版本

import cv2image = cv2.imread("9.png",cv2.IMREAD_COLOR)
red_channel = image[:,:,2]
green_channel = image[:,:,1]
blue_channel = image[:,:,0]#或者使用cv2自带的函数,但是耗时比较多
#channels = cv2.split(image)gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
_,binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)ret,red_binary = cv2.threshold(red_channel,160,255,cv2.THRESH_BINARY)#合并各个通道的函数
merge = cv2.merge([blue_channel,green_channel,red_channel])cv2.imshow("red_binary",red_binary)
cv2.imshow("red_channel",red_channel)
cv2.imshow("binary",binary)
cv2.waitKey(0)

 

来多几张发票看看效果

移除前

移除后

移除前

 

移除后

下面这个情形比较经典,因为印章刚好把一些关键区域(金额)给遮挡住了,现在人的肉眼也很难辨别出它的具体数字了,那机器还能正确识别吗?如果不做任何处理,机器也是没办法识别的,但是预处理一下之后,机器就能准确识别出其数字了。

移除前

移除后

当然,这种分离通道+阈值分割的方法还可以用到其他场合,例如在红绿灯的检测上,也是可以借鉴这种方法的。我在网上找了张红绿灯的照片来测试,也看看效果吧~

检测红灯

 

检测绿灯

 

 


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

相关文章

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:…

css 居中问题的总结

1.css让浮动的盒子水平居中 解决方法&#xff1a; 给浮动的盒子加一个父盒子&#xff0c;设置宽度跟浮动盒子一样大小&#xff0c;并且overflow:hidden; 设置该盒子为margin: 0 auto; <!DOCTYPE html> <html lang"en"> <head><meta charset&qu…

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

情景一&#xff1a;单行文字垂直居中 1、line-height 原理是在于将单行文字的行高设定后&#xff0c;文字会位于行高的垂直中间位置 <div class"text-con">单行文字垂直居中</div><style>.text-con {width: 200px;height: 60px;line-height: 60px…

CSS垂直居中的10种实现姿势

前言 前端开发中元素居中是最常见和最经常使用到的css技巧&#xff0c;不仅开发中经常会用到&#xff0c;面试官出题考核基础时有时候也会问道这类问题。本文主要介绍10种垂直居中的方法。希望对你我都有帮组。 1、line-heightheight实现 如果子元素是行内文本元素的话&…

CSS 垂直居中的七种方法——史上最详细总结

博主目前在蚂蚁集团-体验技术部&#xff0c;AntV/S2 是博主所在团队的开源项目——多维交叉分析表格&#xff0c;欢迎使用&#xff0c;感谢到 S2 github 仓库点赞 star&#xff0c;有任何关于前端面试、就业、技术问题都可给在文章后留言。 我们在写页面时&#xff0c;通常会用…