opencv-python图像增强十一:文档阴影去除


一,简介

图像阴影是光学现象的一种,当物体遮挡光源时,光源无法直接照射到被遮挡的区域,这导致该区域的亮度低于周围未被遮挡的区域。在数字图像中,阴影通常表现为亮度较低的区域,与周围亮度较高的区域形成明显的对比。
在本项目中,我们将介绍一种用于去除文档图像中阴影的方法。这种方法旨在识别并修正由于光源遮挡而产生的低亮度区域,从而提高图像的整体质量和后续处理的准确性。通过应用特定的图像处理技术,我们可以有效减轻阴影对图像内容的影响,使得文档图像中的文本和其他关键信息更加清晰可见。

二,方案简述

去除文档中的阴影,其核心思想在于将文字与阴影背景区分开来。这一过程只需从原始图像中减去背景部分,便能获得无阴影的清晰文字区域。具体算法流程如下:首先,读取原始灰度图像并进行缩放处理;其次,应用形态学闭运算以清除图像中的噪声和细小元素;随后,通过背景减除和取反步骤来提取前景文字;然后,对提取的前景图像进行归一化,以确保像素值的准确性;最终,展示原始图像以及经过处理的图像,以供对比观察。

三,算法实现流程:

3.1 闭运算提取背景:

通过图像闭运算来将文字区域填充,以此得到带有阴影的背景
实现代码:

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (N, N))
# 应用开运算,以去除图像中的噪声和细小对象
B = cv2.morphologyEx(I, cv2.MORPH_CLOSE, kernel)

3.2 背景减除获取文字

通过cv2.absdiff函数对图像与求得的背景进行绝对值相减,相减完成的效果为白底黑字,将图像反转后归一化映射为0-255的图像即可获取文字区域
实现代码:

    # 计算前景图像 O,即 I 和 B 的绝对差值
    O = cv2.absdiff(I, B)
    # 对前景图像进行取反操作
    O = cv2.bitwise_not(O)
    # 创建一个与 O 相同大小的全零数组,用于归一化处理
    norm_img = np.zeros_like(O)
    # 显示原始的前景图像 O
    cv2.imshow("O", O)
    # 对 O 进行归一化处理,使其像素值在 0 到 255 之间
    cv2.normalize(O, norm_img, 0, 255, cv2.NORM_MINMAX)

四,整体代码:

import cv2  # 导入OpenCV库
import numpy as np  # 导入NumPy库
# 定义背景减除函数
def background_subtraction(I, B):
    # 计算前景图像 O,即 I 和 B 的绝对差值
    O = cv2.absdiff(I, B)
    # 对前景图像进行取反操作
    O = cv2.bitwise_not(O)
    # 创建一个与 O 相同大小的全零数组,用于归一化处理
    norm_img = np.zeros_like(O)
    # 显示原始的前景图像 O
    cv2.imshow("O", O)
    # 对 O 进行归一化处理,使其像素值在 0 到 255 之间
    cv2.normalize(O, norm_img, 0, 255, cv2.NORM_MINMAX)
    # 返回归一化后的前景图像
    return norm_img
# 定义处理图像的函数
def deal_img(N, I):
    # 创建一个 N x N 的矩形结构元素
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (N, N))
    # 应用开运算,以去除图像中的噪声和细小对象
    B = cv2.morphologyEx(I, cv2.MORPH_CLOSE, kernel)
    # 进行背景减除操作
    normalised_img = background_subtraction(I, B)
    # 返回归一化后的图像
    return normalised_img
# 读取原始图像 P
P = cv2.imread(r'F:\traditional_vison\Test_image.jpg', 0)  # 读取灰度图像
P = cv2.resize(P, (0, 0), fx=0.3, fy=0.3)  # 将图像缩放到原始大小的 0.3 倍
O_P = deal_img(N=21, I=P).astype(np.uint8)  # 处理图像并将其转换为 uint8 类型
# 显示原始图像 P 和处理后的图像 O_P
cv2.imshow("ori", P)
cv2.imshow("op", O_P)
# 等待按键后关闭所有窗口
cv2.waitKey(0)

五,效果:

原始图像:
在这里插入图片描述
去除阴影后的图像:
在这里插入图片描述

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值