【OpenCV 例程200篇】208. Photoshop 对比度自动调整算法

OpenCV 例程200篇 总目录


【youcans 的 OpenCV 例程200篇】208. Photoshop 对比度自动调整算法

对比度是指图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,差异范围越大代表对比越大。 当对比率达到 120:1 就可以容易地显示生动、丰富的色彩,对比率高达 300:1 时就可支持各阶的颜色。

对比度对视觉效果的影响非常关键。高对比度对于图像的清晰度、细节表现、灰度层次表现都有很大帮助。

对比度调整的目的通常是增强对比度,形成清晰的图像效果和醒目的视觉冲击力。

Photoshop 提供了自动对比度调整功能(AutoContrast),通过自动将图像最深的颜色加强为黑色,最亮的部分加强为白色,以增强图像的亮度和暗度的对比度。

Photoshop 中的自动对比度调整算法,与自动色阶调整算法基本相同,区别在于对比度自动调整不是对三个通道分别调整,而是对各通道按统一的比例进行调整。首先获取图像的亮度信息,然后根据修剪比例对亮度进行动态范围的拉伸,同比例调整 R,G,B 三个通道,因此不会出现色偏问题。

Enhance Monochromatic Contrast
Clips all channels identically. This preserves the overall color relationship while making highlights appear lighter and shadows appear darker. The Auto Contrast command uses this algorithm.

参考文献: Set Auto adjustment options (adobe.com)

在这里插入图片描述

输入色阶调整,先根据黑场阈值和白场阈值对图像的动态范围进行线性拉伸,再根据灰场调节值进行伽马变换,对发白(曝光过度)或过暗(曝光不足)进行矫正。

V1={0,Vin<Sin255,Vin>Hin255∗(Vin−Sin)/(Hin−Sin),elseV2=255∗(V1/255)1/M\begin{aligned} & V_1 = \begin{cases} 0 &, V_{in}<S_{in} \\ 255 &, V_{in}>H_{in} \\ 255 * {(V_{in}-S_{in})}/{(H_{in}-S_{in})} &, else \end{cases} \\ \\ & V_2 = 255 * (V_1 / 255)^{1/M} \end{aligned} V1=0255255(VinSin)/(HinSin),Vin<Sin,Vin>Hin,elseV2=255(V1/255)1/M

输出色阶调整是基于动态范围进行线性拉伸:

Vout={0,V2<0255,V2>255Sout+(Hout−Sout)∗V2∗/255,elseV_{out} = \begin{cases} 0 &, V_{2}<0 \\ 255 &, V_{2}>255 \\ S_{out} + {(H_{out}-S_{out})} * V_2 */255 &, else \end{cases} Vout=0255Sout+(HoutSout)V2/255,V2<0,V2>255,else


例程 14.15:Photoshop 对比度自动调整算法

本例程实现 Photoshop 的对比度自动调整算法,对三个通道同时调整。

    # 14.15 Photoshop 对比度自动调整算法def autoLevels(img, cutoff=0.1):  # 自动色阶调整channels = img.shape[2]  # h,w,chtable = np.zeros((1,256,3), np.uint8)for ch in range(channels):# cutoff=0.1, 计算 0.1%, 99.9% 分位的灰度值low = np.percentile(img[:,:,ch], q=cutoff)  # ch 通道, cutoff=0.1, 0.1 分位的灰度值high = np.percentile(img[:,:,ch], q=100 - cutoff)  # 99.9 分位的灰度值, [0, high] 占比99.9%# 输入动态线性拉伸Sin = min(max(low, 0), high - 2)  # Sin, 黑场阈值, 0<=Sin<HinHin = min(high, 255)  # Hin, 白场阈值, Sin<Hin<=255difIn = Hin - SinV1 = np.array([(min(max(255*(i-Sin)/difIn, 0), 255)) for i in range(256)])# 灰场伽马调节gradMed = np.median(img[:,:,ch])  # 拉伸前的中值Mt = V1[int(gradMed)] / 128.  # 拉伸后的映射值V2 = 255 * np.power(V1/255, 1/Mt)  # 伽马调节# 输出线性拉伸Sout, Hout = 5, 250  # Sout 输出黑场阈值, Hout 输出白场阈值difOut = Hout - Souttable[0, :, ch] = np.array([(min(max(Sout + difOut*V2[i]/255, 0), 255)) for i in range(256)])return cv.LUT(img, table)def autoContrast(img, cutoff):  # 自动对比度调整gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # 转换为灰度图像# 计算 0.1%, 99.9% 分位的灰度值Sin = np.percentile(gray, q=cutoff)  # cutoff=0.1, 0.1 分位的灰度值Hin = np.percentile(gray, q=100 - cutoff)  # 99.9 分位的灰度值, [0, per999] 占比99.9%# 输入动态线性拉伸difIn = Hin - SinV1 = np.array([(min(max(255 * (i-Sin)/difIn,0), 255)) for i in range(256)])# 灰场伽马调节, Mt: 0.01~9.99gradMed = np.median(gray)  # 拉伸前的中值Mt = V1[int(gradMed)] / 160.  # 拉伸后的映射值V2 = 255 * np.power(V1/255, 1/Mt)  # 伽马调节# 输出线性拉伸Sout, Hout = 5, 250  # Sout 输出黑场阈值, Hout 输出白场阈值difOut = Hout - Souttable = np.array([(min(max(Sout + difOut*V2[i]/255, 0), 255)) for i in range(256)]).astype("uint8")imgTone = cv.LUT(img, table)return imgTone# Photoshop 自动对比度调整算法img = cv.imread("../images/Fig0310b.tif", flags=1)  # 读取彩色图像# img = cv.imread("../images/demist02.png", flags=1)  # 读取彩色图像# 色阶自动调整cutoff = 0.1  # 截断比例, 建议范围 [0.0,1.0]levelsAuto = autoLevels(img, cutoff)# 对比度自动调整cutoff = 0.1  # 截断比例, 建议范围 [0.0,1.0]contrastAuto = autoContrast(img, cutoff)plt.figure(figsize=(9, 6))plt.subplot(131), plt.title("Origin"), plt.axis('off')plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))plt.subplot(132), plt.title("AutoLevels"), plt.axis('off')plt.imshow(cv.cvtColor(levelsAuto, cv.COLOR_BGR2RGB))plt.subplot(133), plt.title("AutoContrast"), plt.axis('off')plt.imshow(cv.cvtColor(contrastAuto, cv.COLOR_BGR2RGB))plt.tight_layout()plt.show()

在这里插入图片描述


在这里插入图片描述

例程运行结果的上图接近灰度图像,色阶自动调整与对比度自动调整的效果类似,没有明显的区别。而在下图中出,色阶自动调整由于对 R/G/B 三个通道单独进行调整,出现了明显的色偏问题;而对比度自动调整则不会发生色偏。



【本节完】

版权声明:
参考文献: Use the Photoshop Levels adjustment (adobe.com)
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125389684)
Copyright 2022 youcans, XUPT
Crated:2022-6-20
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中

201. 图像的颜色空间转换
202. 查表快速替换(cv.LUT)
203. 伪彩色图像处理
204. 图像的色彩风格滤镜
205. 调节色彩平衡/饱和度/明度
206. Photoshop 色阶调整算法
207. Photoshop 色阶自动调整算法
208. Photoshop 对比度自动调整算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jsoup根据URL加载一个Document

有时候我们可能希望通过一个url地址&#xff0c;然后提取里面的内容&#xff0c;转换成document对象。 用 Jsoup.connect(String url)方法: Document doc Jsoup.connect("http://baidu.com/").get(); String title doc.title();解说 connect(String url) 方法创建…

java设计模式 外观,精掌握Java设计模式之外观模式(10)

定义通俗地解释&#xff0c;当你打开灯的时候&#xff0c;你只需要嗯一下开关就好了&#xff0c;不需要关心灯泡亮起来的这个流程&#xff0c;同理&#xff0c;打开电脑的时候&#xff0c;嗯一下开机键就好了&#xff0c;也不需要关心电脑是先运行cpu还是内核之类的。这样能让用…

【OpenCV 例程200篇】209. HSV 颜色空间的彩色图像分割

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】209. HSV 颜色空间的彩色图像分割 5.1 HSV 颜色空间的彩色图像分割 HSV 模型是针对用户观感的一种颜色模型。 HSV 颜色空间的各通道分别表示色调&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#x…

Jsoup从一个文件加载一个文档

在我们的磁盘里有一个HTML文件&#xff0c;我们需要对它进行解析从中抽取数据或进行修改。 使用静态 Jsoup.parse(File in, String charsetName, String baseUri) 方法&#xff1a; File input new File("/file/input.html"); Document doc Jsoup.parse(input, &…

【OpenCV 例程200篇】210. 绘制直线也会有这么多坑?

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】210. 绘制直线也会有这么多坑&#xff1f; 我不是标题党。 绘制直线当然是最简单的绘图&#xff0c;能有什么坑呢&#xff1f;不信的同学可以直接跳到注意事项。就算你是 OpenCV 大神&#xff0c;如果这 10 个问题点…

PHP配置微信测试号,关于微信开发模式和测试账号

自己刚开始学习微信开发&#xff0c;请帮忙解惑1.微信公众号使用模式分为编辑模式和开发者模式 &#xff0c;两个是互斥的&#xff0c;也就是开启一个另一个就不能用现在我的理解 上边两个模式是由服务器的开启停用区分的&#xff0c;启用即为开发者模式另外&#xff0c;我想知…

Jsoup使用DOM方法来遍历一个文档

要从一个HTML文档要从中提取数据&#xff0c;并了解这个HTML文档的结构需要先将HTML解析成一个Document之后&#xff0c;然后使用类似于DOM的方法进行操作。 File input new File("/file/input.html"); Document doc Jsoup.parse(input, "UTF-8", "…

【OpenCV 例程200篇】211. 绘制垂直矩形

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】211. 绘制垂直矩形 7.1 绘图函数基本参数 OpenCV提供了绘图功能&#xff0c;可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。 函数 cv.line()、cv.rectangle()、cv.circle()、cv.polylines() 等分别用来在图…

php自动采集入库,Phpcms v9自动采集入库自动发布组件

Phpcms v9自动采集入库自动发布组件是思优CMSYOU技术团队在实际SEO运维运用总结研究出的自动采集入库自动发布文章的组件&#xff0c;实现自动通过Phpcms后台采集模块的采集规则采集文章、并自动入库到对应栏目、入口后自动更新生成内容页自身HTML、栏目页HTML、首页HTML&#…

Jsoup使用选择器语法来查找元素

如果你想使用类似于CSS或jQuery的语法来查找和操作元素&#xff0c;我们可以使用Element.select(String selector) 和 Elements.select(String selector) 方法实现&#xff1a; File input new File("html path"); Document document Jsoup.parser(input, "U…

【OpenCV 例程200篇】212. 绘制倾斜的矩形

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】212. 绘制倾斜的矩形 7.1 绘图函数基本参数 OpenCV提供了绘图功能&#xff0c;可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。 函数原型&#xff1a; 函数 cv.rectangle() 用来在图像上绘制垂直于图像边界的…

java注释的理解,java注解原理——记录一下自己的理解

最近因为系统可能要更换成java语言&#xff0c;于是每天都在拼命的研究java的相关知识和框架。之前学习注解的时候&#xff0c;没有太深入的去理解它&#xff0c;只是觉得标注一下挺好用&#xff0c;但是现在在学到spring aop的时候&#xff0c;突然发现注解的功能是如此强大。…

Jsoup从元素中抽取属性 文本和HTML

在解析获得一个Document实例对象&#xff0c;并查找到一些元素之后&#xff0c;我们如何取得在这些元素中的数据呢&#xff1f;&#xff1f;&#xff1f; 使用Jsoup抽取属性&#xff0c;一般方法如下&#xff1a; 1.要取得一个属性的值&#xff0c;可以使用Node.attr(String k…

CSDN 技能树使用体验与产品分析(1)

文章目录1. 什么是技能树2. 技能树的产品结构3. 技能树的使用3.1 产品入口3.2 知识点的模块设置3.3 『练习题』模块3.4 『参考资料』模块3.5 『讨论区』与『笔记』模块4. 结束语C 站近期隆重推出了一个新产品『技能树』&#xff0c;这是一个很好的方向。 很早就想写一篇介绍和…

【OpenCV 例程200篇】213. 绘制圆形

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】213. 绘制圆形 7.1 绘图函数基本参数 OpenCV提供了绘图功能&#xff0c;可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。 7.3 绘制圆形 函数原型&#xff1a; 函数 cv.circle() 用来在图像上绘制圆形。 cv…

Jsoup处理URLs

我们在处理HTML内容时&#xff0c;可能经常会遇到这种问题&#xff0c;需要将html页面里面的链接地址从相对地址转换成绝对地址&#xff0c;如何使用Jsoup来解决这个问题呢&#xff1f; 方法 在你解析文档时确保有指定base URI&#xff0c;然后 使用 abs: 属性前缀来取得包含b…

matlab的fft点数,matlab fft的点数问题

看完下面的&#xff0c;也许你会明白点The FFT functions (fft, fft2, fftn, ifft, ifft2, ifftn) are based on a library called FFTW [3],[4]. To compute an N-point DFT when N is composite (that is, when NN1N2), the FFTW library decomposes the problem using the C…

【OpenCV 例程200篇】214. 绘制椭圆的参数详解

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】214. 绘制椭圆的参数详解 OpenCV提供了绘图功能&#xff0c;可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。 7.4 绘制椭圆 函数原型&#xff1a; 函数 cv.ellipse() 用来在图像上绘制椭圆轮廓、填充椭圆、椭…

mysql外键猫头,SQL进阶

SQL进阶1.约束之主键约束非空、唯一、被引用当表的某一列被指定为主键之后&#xff0c;该列就不能为空&#xff0c;不能有重复值出现。创建表时指定主键的两种方式&#xff1a;CREATE TABLE stu1(sid CHAR(6) PRIMARY KEY,sname VARCHAR(20),age INT,gender VARCHAR(10));指定s…

Jsoup获取所有链接

从一个URL获得一个页面。然后提取页面中的所有链接、图片和其它辅助内容。并检查URLs和文本信息。 运行下面程序需要指定一个URLs作为参数 package org.jsoup.examples;import org.jsoup.Jsoup; import org.jsoup.helper.Validate; import org.jsoup.nodes.Document; import …