天天看点

c++ opencv实现区域填充_如何使用OpenCV+Python去除手机拍摄文本底色

c++ opencv实现区域填充_如何使用OpenCV+Python去除手机拍摄文本底色

点击上方蓝字关注我们

微信公众号:OpenCV学堂

关注获取更多计算机视觉与深度学习知识

起因

最近经常被要求手机拍摄考试卷,但是拍摄完之后,跟实际的黑白考试卷有很大的色差,打印出来之后背景就变成了灰色,看着很不舒服。于是我想起了好久以前,我用过的一个软件叫全能扫描王,发现它里面是有去除这种文本底色的功能的,但是有时候也很坑!我就想手动写一个简单python程序来实现。最终我写出的程序测试效果如下:

c++ opencv实现区域填充_如何使用OpenCV+Python去除手机拍摄文本底色

左侧是用手机拍摄的图像,右侧是用opencv-python处理之后的结果。

思路分析

首先看一下输入的原图,(小学生作业找不到了,让我给他打印是起因,他要手写,我说我来处理一下打印出来),别人拍的原图:

c++ opencv实现区域填充_如何使用OpenCV+Python去除手机拍摄文本底色

我发现这些图像基本上都是黑白纸张或者有些有虚线的纸张,我首先想到把文字部分从输入图像中都抠出来来,不需要太精准,大致就可以了,所以要获取图像中文字的mask,我就想到了用二值化的方法,我首先尝试了全局二值化OTSU与三角法来获取mask,发现效果都有点坑爹!图示如下:

c++ opencv实现区域填充_如何使用OpenCV+Python去除手机拍摄文本底色

最终效果是这样,而当光线稍微有点不均匀的时候,这个就直接在二值话时候翻车了!会丢失信息,所以我想到了用自适应的二值化方法,最终选择:

binary = cv.adaptiveThreshold(image, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY_INV, 25, 15)
           

该函数来完成二值化,实现mask提取提取完成之后,通过了一个形态学操作来实现简单的膨胀操作,这样确保每个字像素范围足够大,不会丢失。最终自适应的mask:

c++ opencv实现区域填充_如何使用OpenCV+Python去除手机拍摄文本底色

然后与原图实现与操作,得到真实文字区域,使用mask区域取反得到mask1,然后对mask与输入的灰度图像完成bitwise_and操作,得到的结果与mask1相加即可得到最终的效果,图示如下:

c++ opencv实现区域填充_如何使用OpenCV+Python去除手机拍摄文本底色

不会像二值话之后的那样让人眼睛看到不舒服的黑色,想要获取该例子完整源代码,请关注  OpenCV学堂,然后回复 “ 文本去背景 ”

君子藏器于身,待时而动

 推荐阅读 

OpenCV4系统化学习路线图-视频版本!

Tensorflow + OpenCV4 安全帽检测模型训练与推理

汇总 | OpenCV DNN模块中支持的分类网络

OpenCV中支持的人脸检测方法整理与汇总

从3D人脸到自动驾驶,CVPR2020十个顶级开源数据集

轻松学Pytorch – 构建UNet实现道路裂纹检测

详解ENet | CPU可以实时的道路分割网络

从Pytorch 的ONNX到OpenVINO中IR中间层

OpenVINO中的FCOS人脸检测模型代码演示

详解OpenVINO 模型库中的人脸检测模型

效果特好 | OpenVINO手写数字识别

OpenVINO+OpenCV 文本检测与识别

OpenVINO + OpenCV实现点头与摇头识别验证

OpenVINO + OpenCV实现车辆检测与道路分割

OpenCV二值图像分析之寻找缺失与靶心

OpenCV 基于Inception模型图像分类

OpenCV4.4 + YOLOv4 真的可以运行了…..

c++ opencv实现区域填充_如何使用OpenCV+Python去除手机拍摄文本底色

继续阅读