如何实现工程应用三中的文本图像背景漂白、纯化、去除算法?
摘要:文本图像在图像处理的应用中也是占用了一个比较大的比例,特别是随着对基础教育的越来越重视,在学生的一些辅助教育、智能化作业批改等等方面的需求迅速增长。目前是市面上也已经有了很多这方面比较专业的软件。在这方面的算法当中,一个比较重要的过程就是对
文本图像在图像处理的应用中也是占用了一个比较大的比例的,特别是随着现在对基础教育的越来越重视,对学生的一些辅助教育、智能化作业批改等等方面的需求迅速增长。目前是上面也已经有了很多这方面比较专业的软件。在这方面的算法那当中,一个比较重要的过程就是对文本图像背景的纯化,也有叫漂白或者叫背景去除的,因为背景复杂了后,对于后续的二值化、识别等都会带来不利的影响。
本文结合工程实践,提出三种不同的背景漂白算法,分享给大家。
一、PhotoCopy算法
这是Photoshop软件里的一个内嵌算法,中文名字叫影印,PS的帮助文档对其专业的解释为:
“影印”滤镜模拟影印图像的效果。较大区域的暗度会导致仅在其边缘的周围进行拷贝,并且半调会背离纯黑或纯白。可以设置细节和暗度的色阶。
看完,不知所云啊。
经过测试,在PS中影印算法的结果是和背景色和前景色的设置有关的,在文本图像的应用中,前景色设置为黑色(字体的颜色),背景色为白色(纸张的颜色),此时就可以获取一个基本的漂白效果了,如下所示:
原图 影印效果(细节参数10,暗度参数10)
可以看到,漂白后的图背景部分有不少噪点,这个可以在执行影印前进行一些简单的去噪操作,比如DCT去做,或者其他的一些保边去噪算法(文字较之背景一般都是强边缘的)。
下面是经过了局部拉普拉斯去燥后的图已经用相同参数执行影印后的效果。
去噪后 再次执行影印
明显,这样处理后黑色的噪点少了很多,整体看起来更为完美。
关于影印算法的实现,其基础是高斯模糊,通过比较高斯模糊和原图之前的差异,再放大一定的倍数,然后用得到的结果作为权重,在背景和前景之间进行融合。这是个很容易实现和优化的算法。
在有文字区域,模糊的值和原图的差异较为明显,经过放大后,权重就较大,这个时候就显示为前景色,在其他区域,差异较小,权重小,结果就靠近背景色。
二、网络上分享的一个背景移除算法
具体的可以在https://www.cnblogs.com/jsxyhelu这个大侠的博客中查找。 这个算法的基础其实也是高斯模糊,一个简答的代码如下所示:
for (int Y = 0; Y < Height * Width; Y++)
{
if (Blur[Y] != 0)
{
Dest[Y] = IM_ClampToByte(Src[Y] * 255 / Blur[Y]);
}
}
这里的Blur通常也是取的高斯模糊的结果。
这是一个非常简单的代码,也是可以很高效的实现的,通常需要一个比较大的模糊,比如100左右。
原图 处理后的效果
这个算法在此类图像中能够成功的核心是:在原图中比较黑的文字部分,占用的整体是比较少的,当大半径模糊时,模糊的值是接近纸张之类的颜色的,也就是比较靠近白色,所以结果基本上没什么变化,而纸张那些地方的颜色,因为模糊的值和他们的原始值基本差不多,所以Src/Blur基本接近1,在乘以255,所以结果就变为白色了。
可以看出,这个算法那其实和PhotoCopy有所类似,都是比较模糊和原图的差异,只是一个用的减法,一个用的是除法。
但是这个算法有一个好处,他能够很好地保留原始文本图像的一些彩色信息,而不会出现不自然的现象。不过如果直接这个算法出来的结果还是有点对比度不够,后期在适当的增加点对比度效果会很不错。
比如下图,就是在处理后对比度增加了30的效果,而且红色文字和蓝色的LOGO得到了很好的保留。
三、一个基于局部方差和均值的改进算法
我们知道,在局部二值算法中,Sauvola二值化一直是个标杆算法,他比opencv自带的自适应二值化有着更为稳定和可靠的效果,而且他也有快速的O(1)算法。其基本的原理和计算公式如下:
某点(x,y)处的均值和方差表达式为:
则该点的二值化的阈值为:
其中 k为修正系数,有效范围[0,1], R可取定值128。
如果直接这样写,就成了2值化了,但是现在有很多库其实不是需要二值化的结果的,他需要的是一个比较纯净的图,实际上还是包含了很多边缘信息的。
