使用python和opencv去除试卷痕迹

小朋友做试卷,有时需要重新做一遍。才2年级,使用的是铅笔,批改用的是红笔,就想着自己使用opencv处理下,直接恢复到初始的空白试卷。

想法比较简单,通过灰度图和阀值,过滤掉铅笔的痕迹。使用提取红色通道及阀值,过滤掉红色的批改痕迹。再将两个图做一次“或”,就可以得到需要的空白试卷了。

关于红色的过滤参考了:https://blog.csdn.net/wl_Honest/article/details/107569135?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161872855116780264052508%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161872855116780264052508&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-8-107569135.pc_search_result_hbase_insert&utm_term=opencv+%E5%8E%BB%E9%99%A4%E7%BA%A2%E8%89%B2

 

# -*- encoding: utf-8 -*-
import cv2
import numpy as np
 
 
class SealRemove(object):

    def remove_red_seal(self, image):
        # 获得红色通道
        blue_c, green_c, red_c = cv2.split(image)
        # 多传入一个参数cv2.THRESH_OTSU,并且把阈值thresh设为0,算法会找到最优阈值
        thresh, ret = cv2.threshold(red_c, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
        # 实测调整为95%效果好一些
        filter_condition = int(thresh * 0.95)
 
        nominator_thresh, red_thresh = cv2.threshold(red_c, filter_condition, 255, cv2.THRESH_BINARY)
        return red_thresh

 
    def shijuanqingli(self, image):
        # img = cv2.imread(image, 0)
        thresh, dst1 = cv2.threshold(image, 50, 255, cv2.THRESH_BINARY)
        dst1_without_pen = dst1
        return dst1_without_pen

    def join_image(self, img_without_red, dst1_without_pen):
        ret = cv2.bitwise_or(img_without_red, dst1_without_pen)
        return ret

if __name__ == '__main__':
    src = r'/home/pi/Pictures/img20210417_12203672.bmp'
    image0 = cv2.imread(src)
    seal_rm = SealRemove()
    image_0 = seal_rm.remove_red_seal(image0)
    # image_0_1 = cv2.cvtColor(image_0, cv2.COLOR_BGR2GRAY)

    image1 = cv2.imread(src, 0)
    image_1 = seal_rm.shijuanqingli(image1)
    image_result = seal_rm.join_image(image_0, image_1)

    cv2.imshow('new image', image_result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    src_temp = src.split(r'.')
    src_result = src_temp[0] + '_new.' + src_temp[1]

    cv2.imwrite(src_result,image_result)

处理后的图片如下。(处理前的图片有小朋友的答案在上面了,就不发了)

 

 

【资源说明】 基于python实现手写痕迹文档图像摩尔纹消除源码+项目运行说明.zip 二、数据分析 **数据划分**:使用1000张做为训练集,81张作为验证集。 官方提供了训练集1081对,测试集A、B各200张。包含以下几个特征: 1.图像分辨率普遍较大 2.手写字包含红黑蓝多种颜色,印刷字基本为黑色 3.手写字除了正常文字外,还包含手画的线段、图案等内容 4.试卷上的污渍、脏点也属于需要去除的内容 5.手写印刷字存在重叠 **mask**:根据原始图片标签图像的差值来生成mask数据 计算RGB通道的平均差值 平均差值在20以上的设为 1 平均差值在20以下的设为 差值/20 三、模型设计 网络模型,是基于开源的EraseNet,然后整体改成了Paddle版本。同时也尝试了最新的PERT:一种基于区域的迭代场景文字擦除网络。基于对比实验,发现ErastNet,在本批次数据集上效果更好。从网络结构图上可以直观的看出ErastNet是多分支以及多阶段网络其中包括mask生成分支两阶段图像生成分支。此外整个网络也都是基于多尺度结构。在损失函数上,原版的ErastNet使用了感知损失以及GAN损失。两个损失函数,是为了生成更加逼真的背景。但是本赛题任务的背景都是纯白,这两个损失是不需要的,可以直接去除。此外,由于ErastNet网络是由多尺度网络组成,结合去摩尔纹比赛的经验,我把ErastNet网络的Refinement替换成了去摩尔纹比赛使用的多尺度网络 双模型融合: 模型一:erasenet去掉判别器部分,仅保留生成器 模型二:erasenet二阶段网络使用基于Non-Local的深度编解码结构 四、训练细节 **训练数据:** 增强仅使用横向翻转小角度旋转,保留文字的先验 随机crop成512x512的patch进行训练 **训练分为两阶段:** 第一阶段损失函数为dice_loss + l1 loss 第二阶段损失函数只保留l1 loss ## 五、测试细节 测试trick: **分块测试**,把图像切分为512x512的小块进行预测,保持训练一致 **交错分块测试**,测试图像增加镜像padding,且分块时边缘包含重复部分,每次预测仅保留每块预测结果的中心部分,这么做的原因是图像边缘信息较少,预测效果要差于中心部分 测试时对**测试**数据使用了横向的镜像**增强** 测试时将两个**模型**的预测结果进行**融合** 七、其他 data:定义数据加载 loss:定义损失函数 model:定义网络模型 compute_mask.py:生成mask文件 test.py: 测试脚本 train.py: 训练脚本 代码运行: 1.指定数据文件夹 2.运行sh train.sh 生成mask并开始训练 3.指定测试文件夹模型路径,执行sh test.sh开始测试 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值