python 基于OpenCV的图像试卷阴影去除

13 min read
import cv2
import numpy as np

img = cv2.imread('2.jpg', 0)

rgb_planes = cv2.split(img)

result_planes = []
result_norm_planes = []
for plane in rgb_planes:
    dilated_img = cv2.dilate(plane, np.ones((7, 7), np.uint8))
    bg_img = cv2.medianBlur(dilated_img, 21)
    diff_img = 255 - cv2.absdiff(plane, bg_img)
    norm_img = cv2.normalize(diff_img, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)
    norm_img[norm_img > 200] = 255
    result_norm_planes.append(norm_img)

result_norm = cv2.merge(result_norm_planes)

# 保存修改后的图片
cv2.imwrite('res.jpg', result_norm)

对于每一个颜色通道,它执行以下步骤:

  1. 对图像进行膨胀,使用的是 7x7 的单位矩阵作为卷积核。
  2. 对膨胀后的图像进行中值滤波,使用的是 21x21 的卷积核。
  3. 计算输入图像和中值滤波后的图像的差,将结果归一化到 0 到 255 之间。
  4. 将经过处理的图像添加到结果图像阵列 (result_planes) 和归一化结果图像阵列 (result_norm_planes) 中。