opencv去除印章痕迹

article/2025/6/23 22:58:01

今天看到一个很有意思的程序,就是去除票据上的红色印章,觉得很有意思,就把它抄过来记录一下,同时自己也开了一下脑洞。

原来的程序来自:https://www.cnblogs.com/skyfsm/p/7638301.html

可以看到图像效果很不错,下面是源码实现:

#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.jpg");Mat gray;cvtColor(src, gray, CV_RGB2GRAY);if (src.empty()){cout << "cant load image" << endl;return false;}//全局二值化int th = 155;Mat binary;threshold(gray, binary, th, 255, CV_THRESH_BINARY);vector<Mat> channels;split(src, channels);Mat blue = channels[0];Mat green = channels[1];Mat red = channels[2];Mat red_binary;threshold(red, red_binary, th, 255, CV_THRESH_BINARY);Mat test;threshold(src, test, th, 255, CV_THRESH_BINARY);imshow("test", src);//imshow("src", src);/*imshow("gray", gray);imshow("binary", binary);imshow("blue channels", blue);imshow("green channels", green);imshow("red channels", red);*/imshow("red+binary", red_binary);waitKey();return 0;
}

在这里我开了一个脑洞,就是我可不可以单独改变中间这些红色像素,当我遍历到这个红色像素的时候用其他的颜色来填充是不是就可以去除彩色图上的印章了呢?想到就行动,首先要获取印章部分的RGB值和其他地方的RGB值才能替换。这里推荐一个网站用来取色http://xiaohudie.net/RGB.html,要注意的是opencv里默认顺序是BGR,网站上是RGB,一开始没反应过来。随便取几个地方的值,发现印章像素值大概分布在这几个数值之间R:30~40,G:30~40,B:170~180,其他地方则是:R:190~200,G:210~210,B:210~220,有了这个数值就可以干活了。下面是代码:

#include <iostream>
#include <fstream>
#include <opencv\cv.h>
#include <opencv2\highgui\highgui.hpp>using namespace std;
using namespace cv;int main()
{IplImage *img = cvLoadImage("3.jpg");for (int i = 0; i < img->height; i++){for (int j = 0; j < img->width; j++){CvScalar s = cvGet2D(img, i, j);cout << "B=" << s.val[0] << "G" << s.val[1] << "R" << s.val[2] << endl;if (30 < s.val[0] && 30 < s.val[1]  && 150 < s.val[2] ){s.val[0] = s.val[0];s.val[1] = s.val[1];s.val[2] = s.val[2];}else{s.val[0] = 195;s.val[1] = 215;s.val[2] = 215;}cvSet2D(img, i, j, s);		}}cvShowImage("img", img);waitKey(0);return 0;
}

上面的代码可以输出每个三个通道的每个像素的值:所以不用取色器也可以,这样就能看到像素值了。

输出像素要花很长时间所以建议大家注释掉,下面看看效果图

可以看到还是有一点效果的。

 

但是这里有发现一个问题,就是大家可以看到我的程序里的像素取值并不是一个小的范围,我尝试输入像30~40这样的范围的时候输出来的结果一点没变,只有大于一个数时才有用,这里想不出结果,也不知道什么原因造成的。当然这次也不是完全没有收获,至少知道了使用get2D和set2D来改变每一个像素的值,不知道opencv3是使用哪两个函数?这个程序还有很多优化的地方,等我想到在改改。

 

更新:2018/10/28

今天重新看c++primer的时候终于想到为什么之前的程序不能在一个区间取像素了,因为在程序中像i<j<k,这样的写法是错的,因为程序先比较i<j得到的是一个布尔值,这样的值是不能和后面的k比较的,而我原来就是这样写的,所以要修改这个地方才行,更正后的代码如下:

#include <iostream>
#include <fstream>
#include <opencv\cv.h>
#include <opencv2\highgui\highgui.hpp>using namespace std;
using namespace cv;int main()
{IplImage *img = cvLoadImage("1.jpg");for (int i = 0; i < img->height; i++){for (int j = 0; j < img->width; j++){CvScalar s = cvGet2D(img, i, j);//cout << "B=" << s.val[0] << "G" << s.val[1] << "R" << s.val[2] << endl;if (20 < s.val[0] && s.val[0] < 80 && 20 < s.val[1] && s.val[1] < 80 && 160 < s.val[2] && s.val[2] < 230){s.val[0] = 195;s.val[1] = 215;s.val[2] = 215;}else{s.val[0] = s.val[0];s.val[1] = s.val[1];s.val[2] = s.val[2];}cvSet2D(img, i, j, s);		}}cvShowImage("img", img);waitKey(0);return 0;
}

可以看到效果比以前好了很多,还有一点是之前的代码写错了,修改像素的部分写反了,看图片可以知道明显的红色已经被消除了,但是边缘部分和原先定的范围肯定有一定的差距,所以边缘部分不是很明显,而消除之后的填充颜色也效果不佳,后面的优化可能会用一个随机范围内的像素值来优化这部分,边缘的红色处理目前还有想到好的方法。


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

相关文章

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;通常会用…

严题集6.65//Leetcode105 已知二叉树前序序列和中序序列分别存放在两个一位数组中,建立该二叉树的二叉链表

一、问题描述 注意可以假设数组中没有重复元素&#xff0c;这位我们判断子树是否为空时提供了便利。 二、DVC版本 先是在DVEC上编译的&#xff0c;供读者参考。 后面有LeetCode版的。 BiTree Resume_BiTree(TElemType *pre,TElemType *mid,int prelen,int midlen) //6-65 前…

二叉树的前序序列、中序序列、后序序列、层次序列

前序序列根 左子树 右子树&#xff0c;中序序列左子树 根 右子树&#xff0c;后序序列左子树 右子树 根&#xff0c;层次序列根 第二层从左到右 第三层从左到右 以此类推。中序序列又称为对称序列。 前序序列第一个节点为根节点&#xff0c;后序序列最后一个节点为根节点&…

331.验证二叉树的前序序列化

如果只给一个前序遍历&#xff0c;是不能构造出二叉树的&#xff0c;但是把空节点也加上&#xff0c;就可以唯一构造一个二叉树&#xff0c;按要求模拟一遍&#xff1a; 代码的执行过程被唯一限制住&#xff0c;还有一类是最优化问题&#xff0c;用算法解决该类问题。 class …

【数据结构】二叉树的链式存储结构(通过前序序列和中序序列构造二叉树

说明&#xff1a;需要分别输入要二叉树的前序序列和中序序列才能构建二叉树。如果构建失败&#xff0c;程序会报错。 比如我们给定一个二叉树&#xff0c;容易知道 前序序列为&#xff1a;GDAFEMHZ 中序序列为&#xff1a;ADEFGHMZ 程序运行结果&#xff1a; 源代码 #include&…