一,简介
图像阴影是光学现象的一种,当物体遮挡光源时,光源无法直接照射到被遮挡的区域,这导致该区域的亮度低于周围未被遮挡的区域。在数字图像中,阴影通常表现为亮度较低的区域,与周围亮度较高的区域形成明显的对比。
在本项目中,我们将介绍一种用于去除文档图像中阴影的方法。这种方法旨在识别并修正由于光源遮挡而产生的低亮度区域,从而提高图像的整体质量和后续处理的准确性。通过应用特定的图像处理技术,我们可以有效减轻阴影对图像内容的影响,使得文档图像中的文本和其他关键信息更加清晰可见。
二,方案简述
去除文档中的阴影,其核心思想在于将文字与阴影背景区分开来。这一过程只需从原始图像中减去背景部分,便能获得无阴影的清晰文字区域。具体算法流程如下:首先,读取原始灰度图像并进行缩放处理;其次,应用形态学闭运算以清除图像中的噪声和细小元素;随后,通过背景减除和取反步骤来提取前景文字;然后,对提取的前景图像进行归一化,以确保像素值的准确性;最终,展示原始图像以及经过处理的图像,以供对比观察。
三,算法实现流程:
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)
五,效果:
原始图像:
去除阴影后的图像: