【python】实现图像中的阴影去除 | 方案和代码
去除图像中的阴影是一项复杂的图像处理任务,尤其是当阴影区域与图像的其他部分混合时。阴影的存在会影响图像的颜色平衡和亮度,导致图像分析和理解的困难。
目录
一 安装依赖
二 函数
① rgb2hsv
② hsv2rgb
三 实现图像中的阴影去除的方法
四 实践
① 代码
② 效果图
五 结论
去除阴影的方法包括基于色彩校正、图像分割以及深度学习的技术。图像分割可以用来识别阴影区域,然后单独处理这些区域。常用的技术包括阈值分割、区域生长、分水岭算法等。深度学习方法卷积神经网络(CNNs),可以非常有效地去除阴影。通过数据集进行模型训练,以便网络学习如何区分阴影和非阴影区域。
一 安装依赖
通过以下命令安装相关依赖:
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install scikit-image
二 函数
scikit-image库提供了颜色空间转换功能,其中包括从 RGB 到 HSV 和从 HSV 回到 RGB 的转换。
① rgb2hsv
函数用于将 RGB 图像转换为 HSV(色调、饱和度、明度)颜色空间。HSV 颜色空间通常更接近人类对颜色的感知方式。
skimage.color.rgb2hsv(rgb)
输入参数
rgb:输入的 RGB 图像。
返回值
返回一个形状相同的数组,但颜色空间为 HSV。
② hsv2rgb
函数的作用将 HSV 图像转换回 RGB 图像。
skimage.color.hsv2rgb(hsv)
输入参数
hsv:输入的 HSV 图像。
返回值
返回一个形状相同的数组,但颜色空间为 RGB。
三 实现图像中的阴影去除的方法
① 读取输入的图像。
② 色彩空间转换
使用rgb2hsv函数将RGB图像转换为HSV色彩空间。
③ 图像分割
使用Otsu阈值分割技术在V通道上检测阴影区域。
④ 阴影区域处理
对检测到的阴影区域进行亮度增强,以模拟去除阴影的效果。
⑤ 色彩空间转换
使用hsv2rgb函数将HSV 图像转换为RGB色彩空间。
⑥ 显示和保存结果
显示原始图像和阴影去除结果图像。保存阴影去除效果图像。
四 实践
① 代码
import cv2
import numpy as np
from skimage.color import rgb2hsv, hsv2rgb
from skimage.filters import threshold_otsu
def detect_and_remove_shadow(image_path):
# 读取图像
img = cv2.imread(image_path)
img_hsv = rgb2hsv(img)
# HSV色彩空间中的V通道用于阴影检测
v_channel = img_hsv[:, :, 2]
# 使用Otsu阈值分割进行阴影检测
thresh = threshold_otsu(v_channel)
shadow_mask = v_channel < thresh
# 对阴影区域进行亮度增强
shadow_region = img_hsv[:, :, :].copy()
# 创建增强因子数组
enhancement_factors = np.array([1, 1, 1.52])
# 确保阴影区域的增强操作在每个颜色通道上分别进行,增强亮度
shadow_region[shadow_mask] *= enhancement_factors
# shadow_region中的像素值限制在0到1之间
# np.clip函数:如果元素值小于指定的最小值,那么该元素将被设为最小值;
# 如果元素值大于指定的最大值,那么该元素将被设为最大值;
# 如果元素值在指定的范围内,那么该元素值保持不变。
shadow_region = np.clip(shadow_region, 0, 1)
# 将HSV图像转换回RGB
final_img = (hsv2rgb(shadow_region) * 255).astype(np.uint8)
# 显示和保存结果
cv2.imshow('Original', img)
cv2.imshow('Shadow Removed', final_img)
cv2.imwrite('shadow_removed.jpg', final_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
detect_and_remove_shadow('Test.jpg')
pass
② 效果图
五 结论
从结果图上看,阴影去除效果相当一般,之后尝试下其他的简易方法吧。
至此,本文的内容就结束啦。