导读在做OCR票据识别的时候,有些票据上经常会有印章。对于新的文本检测和识别模型,印章的存在肯定会影响模型识别的准确性,所以我们通常先将印章从图片中去除,然后再送入文本检测和识别模型。
本文介绍一种去除红色印章的简单方法。
取下红色封条。我们经过分离图片的通道,提取图片的红色通道,然后是通过阈值来去除红色的印章.
import v2 import numpy as NP def Remove _ red _ seal(input _ img)3360 #通道blue _ c,green _ c,red _ c=cv2 . split(input _ img)# threshold threshold由Otsu法自动选择,Ret=cv2.threshold (red _ c,0,255,cv2.thresh _ otsu) #调整阈值filter _ condition=int(thresh * 0.90)# Remove the red seal _,red _ thresh=cv2.threshold (red _ c,Filter _ condition, cv2.thresh _ binary) #将画面转回通道3 Result _ img=NP . expand _ dims(red _ thresh,axis=2)Result _ img=NP . concatenate((Result _ img,Result _ img,Result _ img),axis=-1)return Result _ img input _ img=cv2 . im read(' 1 . jpg ')remove _ seal=remove _ red _ seal(input _ img)cv2 . im write(' remove _ seal . jpg ',remove _ seal)
拆下密封件后
注意:对于不同的场景,您可能需要微调阈值(百分比),以获得您认为的最佳阈值。百分比越小,红色印章去除越干净,同时可能会去除一些文字信息。
阈值函数threshold (src,thresh,maxval,type,dst)-ret,dst
Src:灰度图像或单通道图像thresh: threshold maxval:最大值type: threshold type这里主要介绍type参数的取值。其值如下图所示。
当对图片进行二值化时,需要设置阈值来对图片进行二值化。但是在一些复杂的场景下,如果采用固定的阈值,可能在一些场景下效果很好,但在另一些场景下就不行了。
这时,我们会想要使用自动阈值。这时,我们可以使用两个参数THRESH_OTSU和THRESH _三角形。他们会根据图像的灰度直方图计算一个阈值,将图像分为前景和背景。下面是它们的实现方式。
THRESH_OTSU OTSU法(OTSU):又称最大类间差法,被认为是图像分割阈值选取的最佳算法。它计算简单,鲁棒性强,不受图像亮度和对比度的影响,因此在数字图像处理中得到广泛应用。
根据图像的灰度直方图,将图像分为前景和背景。因为方差是衡量图像灰度分布是否均匀的指标,所以图像的背景和前景的差异越大,它们之间的方差差距就会越大。因此,如果能保证图像的前景和背景的方差差最大,就能达到最佳的前景和背景分离效果。实际效果还是要看具体的场景,可能需要根据不同的要求微调阈值。
其实只要抓住Otsu法的核心思想,最大化前景和背景的方差,通过代码推导公式并不难。接下来,我们来推导这个公式。
假设灰度T是图像分割前景和背景的最佳阈值,图像中任意一点属于前景的概率为1,属于背景的概率为2。前景的平均灰度值为1,背景的平均灰度值为2,所以图像的平均灰度值为
根据类间方差的计算公式,前景和背景的类间方差计算如下
因为
="https://tupian.lamuhao.com/pic/img.php?k=图片里的公章怎么提取,图片里的文字怎么去掉6.jpg">结合上面3个式子可得
为了方便我们后面编程来实现,还需要对上式做一些调整,这里引入几个参数pi表示灰度值等于i的概率,图像的灰度取值在< 0 , 255 > 范围内取整数。假设灰度值t可以使图像前景和背景的方差最大,m1为灰度级t tt的累加均值,m为图像的灰度级L的均值累加
可得μ1和μ2
接下来我们对δ2 结合上面的式子做个变换
我们只需要使上式最大化即可
代码实现OTSU上面我们推导了大津法的公式,以及如何来求解阈值划分前景和背景,下面我们用python来实现这个算法
大津法
比较一下我们自己实现的大津法和opencv内置的函数
最终两者输出的阈值都是160,不过python实现的代码是opencv时间的25倍左右,所以python在这方面对比c确实是硬伤。
THRESH_TRIANGLE三角法(TRIANGLE):是基于直方图利用几何的方法来求分割的最佳阈值,假设的成立条件是直方图的最大波峰在靠近最亮的一侧,然后再通过三角形来求解最大的距离找到最佳阈值。
如图所示,在灰度直方图上,从最高峰bmax到最暗对应直方图的bmin构造一条直线,然后从bmin 到bmax开始计算到直线的垂直距离d,当d达到最大时,此时所对应的灰度值t就是分割图像的最佳阈值
接下来我们看看,使用三角法求解阈值值的整个流程,这里引入两个参数灰度级L和频率f:
将图片转换为灰度图,通过OpenCV可以很容易实现计算灰度图的灰度直方图,也就是每个灰度级L对应的频率f 对灰度直方图进行排序,按灰度级进行排序,由小到大确定直方图最大值(也就是f)所对应灰度级L的位置,如果在左侧(灰度值小)就需要对灰度直方图进行翻转根据左侧边界的灰度级点( Lmin , fmin)和最亮部分频率最大对应的灰度级点( Lmax , fmax) ,由两点式我们可以确定这条直线计算Lmin到Lmax的任意一点(L, f )到直线的距离d,当d最大时所对应的L就是我们要求的最佳阈值
代码实现
大津法和三角法的对比共同点:两者都是算法自动计算出阈值,不需要指定阈值不同点:大津法适合双波峰的灰度直方图,三角法适合单波峰的灰度直方图opencv显示灰度直方图
参考:
https://blog.csdn.net/weixin_40647819/article/details/90179953https://www.cnblogs.com/ZFJ1094038955/p/12027836.htmlhttps://blog.csdn.net/qq_45769063/article/details/107102117