摘要
本文以“去除图像中的红色印章”为研究对象,应用颜色特征,将图像的前景从背景中分离。编制Python程序并进行仿真,最终提取出的前景图非常令人满意。
问题
给定如下一张图片:
我们希望去除图像中的红色印章,以便能更好地读取文字。
技术路线
该问题中,字
像素为前景(frontground),印章
和纸
所在的像素为背景(background)。我们希望能将前景(字
)提取出来。
分析图片我们发现,字
的颜色是黑色, 印章
的颜色是红色,纸
的颜色是灰色(接近白色)。
前景和背景在颜色上存在差异,这就启发我们通过颜色特征将前景和背景分离。
现在,我们分别提取原始图片的Red, Green和Blue三个颜色通道,得到如下三张图片:
图3,4与原始图像相似,利用价值不高。然而图2,即红色通道灰度值图片,非常值得我们关注:图1中越红的像素点在图2中的灰度值就越大,越接近255,在图2中看起来就越白。我们还得到以下发现:
印章
像素为白色,灰度值接近255纸
的像素为灰色(接近白色),灰度值接近255字
的像素为黑色,灰度值接近0
此时,我们就可以通过一个阈值
,将前景像素(字
)提取出来。
公式为:
其中:$I_{r}(x,y)$是坐标$(x,y)$处的像素点的红色分量的灰度值,$threshold $为阈值,可以通过求取图2的灰度直方图进行设定,如图5所示
我们可以看到,图5所示的红色通道直方图中,明显存在两个集中区域
,左侧的区域灰度值较低,对应颜色为黑色
,是前景像素(字
);右侧集中区域灰度值较高,对应颜色为白色区域,是背景像素(印章
和纸
)。
在这两个灰度集中的区域的中间部分,设定一个阈值,可以将这两个区域分割开来。需要指出的是,阈值的设定对于最终的处理结果具有较大影响,这里我们选择阈值为110.
对于二值化后的图片,我们还可以通过数学形态学中的膨胀
算子对图像进行视觉增强操作。
现在总结技术路线:
- 读取原始图像A
- 提取图像的红色通道,得到红色通道灰度值图片B
- 计算B的统计直方图C,确定最佳的阈值threshold
- 根据阈值,对B进行二值化,得到最终图片D
- (可选)应用膨胀算子对D进行操作,得到图片E
源代码
采用Python 2.7,更高版本估计也可以(未测试)。主要的包为OpenCV 3.4
1 | # -*- coding: utf-8 -*- |
计算结果
图1,图3,图6分别对应计算流程的A,B,C三张图。下面给出D,E两幅图:
结论
将图1和图7做对比,我们发现,印章完全消失了!效果非常令人满意。
“去除图像中的印章”,这个任务看起来很困难,但是如果知道颜色通道的思想,该任务就显得非常简单。但这里的关键是,能够想到这个思想,这就需要对图像处理的知识掌握扎实,在以后的应用中才会灵活运用。
参考文献
- [OpenCV探索之路(二十六):如何去除票据上的印章]
- python opencv入门 形态学转换(13)
- 《数字图像处理》冈萨雷斯