使用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)

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

 

 

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要去除卷子上的红勾,可以通过以下步骤实现: 1. 使用 OpenCV 读取卷子图片。 2. 将图片转换为灰度图像。 3. 使用阈值处理将红色区域分离出来。 4. 对红色区域进行形态学操作,如开运算和闭运算,以去除噪声并填充空洞。 5. 使用 Canny 边缘检测算法找到红色区域的边缘。 6. 对边缘进行霍夫变换,找到其中符合直线条件的线段。 7. 将符合条件的线段标记出来并将其从图像中去除。 以下是一个基本的代码框架: ```python import cv2 import numpy as np # 读取卷子图片 img = cv2.imread("paper.png") # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 分离红色区域 lower_red = np.array([0, 0, 200]) upper_red = np.array([50, 50, 255]) mask = cv2.inRange(img, lower_red, upper_red) # 形态学操作 kernel = np.ones((5,5),np.uint8) opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel) # 边缘检测 edges = cv2.Canny(closing, 50, 150, apertureSize=3) # 霍夫变换 lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100, minLineLength=100, maxLineGap=10) # 去除线段 for line in lines: x1, y1, x2, y2 = line[0] cv2.line(img, (x1, y1), (x2, y2), (0, 0, 0), 5) # 显示结果 cv2.imshow("Result", img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,这只是一个基本的框架,具体的参数需要根据实际情况进行调整。 ### 回答2: 要使用PythonOpenCV去除卷子上的红勾,可以按照以下步骤进行: 1. 导入必要的库:首先,需要导入OpenCV库和NumPy库。可以使用以下代码导入它们: ```python import cv2 import numpy as np ``` 2. 读取图像:使用`cv2.imread()`函数读取包含卷子图像的文件,并使用`cv2.imshow()`函数显示图像,以便查看效果: ```python image = cv2.imread('paper.jpg') cv2.imshow('Original Image', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 3. 转换图像颜色空间:有时红色会在不同的颜色空间中表现出不同的特征。为了方便处理,可以将图像从BGR颜色空间转换为HSV颜色空间: ```python hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) ``` 4. 指定红色区域的上下界:在HSV颜色空间中,可以通过调整下界和上界来选择红色区域。可以使用以下代码创建一个包含红色H、S和V通道下界和上界的NumPy数组: ```python lower_red = np.array([0, 100, 100]) upper_red = np.array([10, 255, 255]) ``` 5. 创建掩膜:通过使用`cv2.inRange()`函数根据上界和下界创建一个二值掩膜来提取红色区域。这将创建一个二进制图像,其中红色区域的像素值为255,其他区域的像素值为0: ```python mask = cv2.inRange(hsv_image, lower_red, upper_red) ``` 6. 应用掩膜到原始图像:使用`cv2.bitwise_and()`函数将掩膜应用到原始图像上,以便提取出红色区域: ```python result = cv2.bitwise_and(image, image, mask=mask) ``` 7. 显示结果图像:使用`cv2.imshow()`函数显示去除红勾后的图像: ```python cv2.imshow('Result Image', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 通过以上步骤,可以使用PythonOpenCV成功去除卷子上的红勾。具体效果可能因输入图像质量和红色标记的特征而有所不同,可能需要调整参数来获得更好的结果。 ### 回答3: 使用PythonOpenCV去除卷子上的红勾可以通过以下步骤实现: 1. 导入所需的库:导入OpenCV和NumPy库。 2. 读取图像:使用`cv2.imread()`函数读取卷子图像。 3. 转化图像:将图像从BGR格式转换为HSV格式。HSV颜色空间可以更好地提取红色区域。 4. 提取红色区域:使用`cv2.inRange()`函数根据设定的红色范围提取出红色区域的二值化图像。 5. 消除噪点:使用`cv2.morphologyEx()`函数对二值化图像进行形态学操作,如开运算或闭运算,以去除噪点。 6. 轮廓检测:使用`cv2.findContours()`函数检测处理后的二值化图像中的轮廓。 7. 去除红勾:遍历轮廓,判断轮廓的区域面积是否大于设定的阈值,并且红勾形状满足特定条件,若满足则使用`cv2.drawContours()`函数将轮廓用背景颜色填充。 8. 显示结果:使用`cv2.imshow()`函数显示去除红勾后的图像。 9. 保存结果:使用`cv2.imwrite()`函数将结果保存为新的图像文件。 注意:以上步骤仅为大致方案,可能需要根据具体情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值