当前位置: 首页 > article >正文

【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

② 效果图

五 结论

从结果图上看,阴影去除效果相当一般,之后尝试下其他的简易方法吧。

至此,本文的内容就结束啦。


http://www.kler.cn/a/513545.html

相关文章:

  • 【Java数据结构】排序
  • ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认
  • 无人机飞手考证难度增加,实操、地面站教学技术详解
  • 3D Vision--计算点到平面的距离
  • KVM创建ubuntu20.04虚机,部署K8S,再克隆出二份,做为Worker节点加入集群,通过Helm创建2个Pod,让它们之间通过域名互访
  • 基于vite+vue3+mapbox-gl从零搭建一个项目
  • Nginx HTTP 服务器基础配置
  • 2090. 半径为 k 的子数组平均值
  • 【深度学习基础】多层感知机 | 多层感知机概述
  • Android开发,待办事项提醒App的设计与实现(个人中心页)
  • httpx上传文件/IO流缓慢的问题分析及解决
  • SQL-leetcode—1141. 查询近30天活跃用户数
  • 在亚马逊云科技上用AI提示词优化功能写出漂亮提示词(下)
  • css动画水球图
  • 【数学建模美赛速成系列】O奖论文绘图复现代码
  • VM模块开发 C++ 工程配置
  • “大模型横扫千军”背后的大数据挖掘--浅谈MapReduce
  • Spring Boot + Netty + WebSocket 实现消息推送
  • 深挖——final
  • 分布式搜索引擎02
  • Emacs折腾日记(十一)——求值规则
  • EXCEL的一些用法记录
  • 每日一刷——1.20——准备蓝桥杯
  • 【全栈】SprintBoot+vue3迷你商城(5)
  • 经验收录/用复盘的心态去学习
  • Stable Diffusion 提示词编写技巧及示例