“阴影/高光”命令是一种用于校正由强逆光而形成剪影的照片,或者校正由于太接近相机闪光灯而有些发白的焦点的方法。在用其他方式采光的图像中,这种调整也可用于使阴影区域变亮。“阴影/高光”命令不是简单地使图像变亮或变暗,它基于阴影或高光中的周围像素(局部相邻像素)增亮或变暗。正因为如此,阴影和高光都有各自的控制选项。默认值设置为修复具有逆光问题的图像,来自 Adobe 官网。

阴影
主要用于提亮阴影区域,对非阴影区几乎不产生效果
数量:用于控制阴影区要校正的程度,值越大,阴影区域被提的越亮
色调:控制被提亮的阴影区域的范围,较小的值会限制只对较暗的区域进行提亮,值越大,影响的阴影范围越宽
半径:控制每个像素周围的局部相邻像素的大小

高光:
主要用于压暗高光区域,对非高光区几乎不产生效果
数量:用于控制高光区要校正的程度,值越大,高光区域被压的越暗
色调:控制被压暗的高光区域的范围,较小的值会限制只对较亮的区域进行压暗,值越大,影响的高光范围越宽
半径:控制每个像素周围的局部相邻像素的大小

调整:
颜色:正值增加阴影区被提亮像素和高光区被压暗像素的饱和度,负值为减小饱和度
中间调:用来调整中间调的对比度,负值降低对比度,正值增加对比度
修剪黑色:设定将图像中多少比例的阴影变成纯黑
修剪白色:设定将图像中多少比例的高光变成纯白

Python 实现阴影区抠取及阴影区提亮

1、提取阴影区域

自动提前阴影区域,具体方式见我的另一一篇博客《Python 用 OpenCV 实现 PS 高光/阴影选区》

阴影区域提取:
先将原图转成灰度图,然后对灰度图做反相后做为两个输入源做正交叠底,对结果做阈值限制后输出

luminance = (1 - luminance) * (1 - luminance)
luminance = np.where(luminance > shadowThreshold, luminance, 0)


然后对阴影区提亮,并对非阴影去做过渡,否则会有明显边界。
提亮使用的非线性亮度调整,公式为伽马矫正公式,见《PS 色阶调整之算法公式原理详解及 Python 实现》中的中间调调整。

2、阴影区域提亮及完整代码

依赖的环境:Python3 numpy OpenCV

# -*- coding: utf-8 -*-
# @Time    : 2021-04-26 19:45
# @Author  : AlanWang4523
# @FileName: ps_shadow_highlight.pyimport os
import sys
import cv2
import numpy as npclass PSShadowHighlight:"""色阶调整"""def __init__(self, image):self.shadows_light = 50img = image.astype(np.float)/255.0srcR = img[:, :, 2]srcG = img[:, :, 1]srcB = img[:, :, 0]srcGray = 0.299 * srcR + 0.587 * srcG + 0.114 * srcB# 高光选区# luminance = luminance * luminance# luminance = np.where(luminance > 0.64, luminance, 0)# 阴影选区luminance = (1 - srcGray) * (1 - srcGray)self.maskThreshold = np.mean(luminance)mask = luminance > self.maskThresholdimgRow=np.size(img, 0)imgCol=np.size(img, 1)print("imgRow:%d, imgCol:%d, maskThreshold:%f" % (imgRow, imgCol, self.maskThreshold))print("shape:", img.shape)self.rgbMask = np.zeros([imgRow, imgCol, 3], dtype = bool)self.rgbMask[:, :, 0] = self.rgbMask[:, :, 1] = self.rgbMask[:, :, 2] = maskself.rgbLuminance = np.zeros([imgRow, imgCol, 3], dtype = float)self.rgbLuminance[:, :, 0] = self.rgbLuminance[:, :, 1] = self.rgbLuminance[:, :, 2] = luminanceself.midtonesRate = np.zeros([imgRow, imgCol, 3], dtype = float)self.brightnessRate = np.zeros([imgRow, imgCol, 3], dtype = float)def adjust_image(self, img):maxRate = 4brightness = (self.shadows_light / 100.0 - 0.0001) / maxRatemidtones = 1 + maxRate * brightnessself.midtonesRate[self.rgbMask] = midtonesself.midtonesRate[~self.rgbMask] = (midtones - 1.0) / self.maskThreshold * self.rgbLuminance[~self.rgbMask] + 1.0self.brightnessRate[self.rgbMask] = brightnessself.brightnessRate[~self.rgbMask] = (1 / self.maskThreshold * self.rgbLuminance[~self.rgbMask]) * brightnessoutImg = 255 * np.power(img / 255.0, 1.0 / self.midtonesRate) * (1.0 / (1 - self.brightnessRate))img = outImgimg[img < 0] = 0img[img > 255] = 255img = img.astype(np.uint8)return imgdef ps_shadow_highlight_adjust_and_save_img(psSH, origin_image):psSH.shadows_light = 50image = psSH.adjust_image(origin_image)cv2.imwrite('py_sh_out_01.png', image)def ps_shadow_highlight_adjust(path):"""阴影提亮调整"""origin_image = cv2.imread(path)psSH = PSShadowHighlight(origin_image)# ps_shadow_highlight_adjust_and_save_img(psSH, origin_image)def update_shadows_light(x):psSH.shadows_light = x# 创建图片显示窗口title = "ShadowHighlight"cv2.namedWindow(title, cv2.WINDOW_NORMAL)   cv2.resizeWindow(title, 800, 600)cv2.moveWindow(title, 0, 0)# 创建阴影提亮操作窗口option_title = "Option"cv2.namedWindow(option_title, cv2.WINDOW_NORMAL)   cv2.resizeWindow(option_title, 400, 20)cv2.moveWindow(option_title, 0, 630)cv2.createTrackbar('shadows_light', option_title, psSH.shadows_light, 100, update_shadows_light)while True:image = psSH.adjust_image(origin_image)cv2.imshow(title, image)if cv2.waitKey(1) == ord('q'):breakcv2.destroyAllWindows()        if __name__ == '__main__':'''运行环境:Python 3执行:python3 ps_shadow_hightlight.py <图片路径>如:python3 ps_shadow_hightlight.py test.jpg'''if len(sys.argv) == 1:print("参数错误:未传入图片路径!")sys.exit(-1)img_path = sys.argv[1]print("img_path Params:", img_path)ps_shadow_highlight_adjust(img_path)

3、最终效果

默认效果(程度 50%)与 PS 中阴影的默认效果对比:
下图为与 PS 默认效果对比,左边为 PS 默认效果(数量 30,色调 50%,半径 30,饱和度 +20),右边为上面的 python 实现的默认 50% 程度的效果,基本差不多。

其他逆光图片的效果图:
以下是 Python 实现的在其他图片效果,左边是原图,右边是处理后的图,默认参数都是 50%,阴影阈值使用的正交叠底后的均值(每张图自动计算,不需人为修改):





PS 阴影/高光中阴影提亮效果之 Python 实现相关推荐

  1. Lightroom Classic 教程:如何在 Lightroom 中调整高光和阴影?

    欢迎观看 Lightroom Classic 教程,小编带大家学习 Lightroom Classic 的基本工具和使用技巧,了解如何在 Lightroom 中调整高光和阴影. 有时会发现,使用曝光度 ...

  2. 4.17 使用阴影/高光命令解决图像曝光不足问题 [原创Ps教程]

    原文:http://coolketang.com/staticPhotoshop/5a98d43c128fe1189bd9515d.html 1. 本节课程将为您演示,如何使用[阴影/高光]命令,调整 ...

  3. HDR阴影高光图像增强

    1. 技术背景 HDR图像处理的技术本质上是对阴影,高光的细节增强.即图像太暗或者太亮的部分,其细节丢失的比较明显,HDR图像处理就是对暗部和高亮部分的细节进行恢复的过程. HDR的处理思路是这样的. ...

  4. Unity Shader 麻将平面阴影高光

    做了一个麻将高光和阴影的材质,第一个shader,纪念一下~直接贴代码 // 高光在第一个pass,阴影在第二个pass // Upgrade NOTE: replaced '_Object2Worl ...

  5. 【CSS】笔记3-三大样式、盒子模型、PS、圆角、阴影

    目录 一.三大特性 1.层叠性 2.继承性 3.优先级 4.CSS权重叠加 二.盒子模型 1.盒子模型 (1)边框(border) (2)border-collapse表格细线边框 (3)边框会影响盒 ...

  6. css第4天笔记-圆角边框;盒子阴影;文字阴影;浮动;PS切图

    学习内容:圆角边框:盒子阴影:文字阴影:浮动:PS切图 一.其他样式 1.圆角边框 在 CSS3 中,新增了圆角边框样式,这样我们的盒子就可以变圆角了. border-radius 属性用于设置元素的 ...

  7. 2d shader unity 阴影_Unity中实现2D光照系统

    在一些 2D 游戏中引入实时光影效果能给游戏带来非常大的视觉效果提升,亦或是利用 2D 光影实现视线遮挡机制.例如 Terraria, Starbound. 2D 光影效果需要一个动态光照系统实现, ...

  8. 初学绘画怎么去注意头发的高光和阴影?如何才能画好高光和阴影?

    怎样才干绘画好头发?怎么才干绘画好头发的高光?怎么才干绘画好头发的暗影?学习绘画难吗?怎样才干学好绘画?想必这些都是绘画初学者们常常在想的问题吧,就是不知道怎么才干绘画好头发的光影效果,比方头发的高光 ...

  9. 江苏省小学升初中数学题:求图中阴影面积

    江苏省小学升初中数学题:求图中阴影面积 分析:小学升初中数学题应该是要考察图形的分割与拼接,而此题中的阴影面积实际最终需要用到三角函数的知识,无法简单通过图形的分割与拼接求得.如果是小学数学题,其真实 ...

最新文章

  1. [转]关于重定向RedirectAttributes的用法
  2. 为什么现在大家喜欢用3*3小卷积?
  3. vim全局搜索并跳转
  4. angr学习笔记(4) (寄存器符号化)
  5. 中国和英国的旅行的对比
  6. Canvas设置样式无效导致圆变成椭圆的问题研究剖析
  7. unity编辑器扩展_07(创建对话框,检测按钮的点击,点击按钮后提示信息,保存设置的数据,显示点击按钮后的处理的进度条信息)...
  8. 订餐系统oracle实训报告,网上订餐系统设计报告.doc
  9. TIA博途中如何为IO设备分配设备名称?
  10. 迅雷5官方最新版免费下载
  11. e5服务器系列天梯图,至强e5系列cpu天梯图_2020年5月至强e5天梯图排行
  12. 计算机技术与软件专业技术资格 (水平) 考试 - 报考指南
  13. 图像拼接(八):拼接多幅图像+Matlab实现+Stanford Open Course
  14. GGT: Graph-Guided Testing for Adversarial Sample Detection of Deep Neural Network 论文笔记
  15. 有时候可用 UIWebView 代替 UITextView,解决行间距问题
  16. unity3d 批量替换模型材质的脚本 一键替换模型及子物体材质
  17. 二、VSCode——MiKTeX编写latex编码
  18. sql/oracle数据库之取整函数round()、ceil()、floor()等等及示例
  19. Dvwa之暴力破解全级别学习笔记
  20. PPT设计Tips总结

热门文章

  1. 对[我所认识的BIOS]系列 -- CPU的第一条指令 一文扩充(II):从FDF到Bios Rom image
  2. 数据中心IP代理与住宅 IP 代理的区别(上)
  3. 成人高考中湖南师范大学录取分数线是
  4. 再创业之吴洪声:离开腾讯系之后
  5. 29、栈的压入、弹出序列
  6. 2021年熔化焊接与热切割复审考试及熔化焊接与热切割模拟考试题库
  7. [转]SQL注入漏洞攻防必杀技
  8. 现在无法停止通用卷设备,请稍候再停止设备 的解决办法
  9. 股票分时数据HTML,股票数据(五档分笔分时成交、逐笔、逐单全息)简介
  10. OpenGL2.0 和 OpenGL3.0 的不同与共同点