Photoshop色阶、曲线命令图解和编程实现(附源码)

简介:

Photoshop功能强大,使用灵活。初级使用者通常有几个禁区:

1.图像->调整  菜单(色阶,曲线等命令都在此菜单中)

2.蒙版与矢量工具(如钢笔工具)

3.通道与色彩模式

4.图层混合模式

要用好这些命令,不但需要有较高的计算机操作水平,更重要的是需要对其原理有一定的了解。而这通常涉及到色彩模型等抽象概念与贝塞尔曲线(所有矢量工具的基础),线性映射(其实就是函数)等数学知识。其原理并不是十分复杂。本文前半部分解析色阶和曲线两个命令的基本原理,适合有一定基础的Photoshop初学者;后半部分使用C# 3.0语言编程实现,适合计算机图形学爱好者。

色阶,曲线两个命令,都基于“亮度映射”原理。其实,就是一个简单的函数。输入色阶(图像原来的色彩)为自变量,输出色阶(运算处理后的色彩)为因变量。在色阶命令中,这个映射是一个一次函数关系的线性映射。而在曲线命令中,还可以是自定义的非线性映射。看图就明白啦~~

如图所示,所有亮度低于输入色阶黑色滑块所指亮度的像素,全部被映射为输出色阶黑色滑块所指亮度

同理,所有亮度高于输入色阶白色滑块所指亮度的像素,全部被映射为输出色阶白色滑块所指亮度

Photoshop色阶、曲线命令图解和编程实现 - ︶ㄣ月下独酌 - ︶ㄣ月下独酌的博客

 

那在输入色阶黑白滑块之间的像素,是怎样映射的呢?

我们结合曲线命令来理解。下图的映射曲线与上图的色阶设置是完全等效的。其实,色阶命令只不过是曲线命令的一个子集。为了方便使用,又单独设置了一个色阶命令。上面色阶的设置,实际就对应的这样一条映射曲线。

 

Photoshop色阶、曲线命令图解和编程实现 - ︶ㄣ月下独酌 - ︶ㄣ月下独酌的博客

   输入色阶黑白滑块间的像素,按照一次函数,映射到输出色阶。标注在两图上的符号式对应的。大家可以对照理解。利用高中解析几何知识,我们可以求出曲线的斜率。从而编程实现色阶命令。

 

//////////////////////////华丽的分割线/////////////////////////下面开始编程///////////////////////

 

C#代码:

注意:编译时请打开/unsafe编译开关。

 

       using System.Drawing;//图像处理

using System.Drawing.Imaging;//LockBits

 

 /// <summary>

        /// 色阶调整

        /// </summary>

        /// <param name="b">位图对象,24位彩色</param>

        /// <param name="iB">输入色阶,黑场</param>

        /// <param name="iW">输入色阶,白场</param>

        /// <param name="oB">输出色阶,黑场</param>

        /// <param name="oW">输出色阶,白场</param>

        /// <returns>位图对象,24位彩色</returns>

        public static Bitmap Gradation(Bitmap b, byte iB, byte iW, byte oB, byte oW)

        {

            byte[] Map = new byte[256];//亮度映射表

            for (int i = 0; i <= iB; i++) //将小于输入色阶黑色滑块值的像素映射为输出色阶黑色滑块值

                Map[i] = oB;

            for (int i = iW; i <= 255; i++) //将大于输入色阶白色滑块值的像素映射为输出色阶白色滑块值

                Map[i] = oW;

            double detX = iW - iB;//x变化量,即输入色阶范围

            double detY = oW - oB;//y变化量,即输出色阶范围

            double k = detY / detX;//映射曲线斜率

            double Sum = oB;//色彩映射累加器,相当于因变量y

            for (int i = iB + 1; i < iW; i++)

            {

                Sum += k;

                Map[i] = (byte)Math.Round(Sum);

            }

            return ApplyMapping(b, Map); //将映射表应用于图像

        }

 

        /// <summary>

        /// 应用色彩映射

        /// </summary>

        /// <param name="bp">位图对象,24位彩色</param>

        /// <param name="Map">色彩映射表(0~255byte数组)</param>

        /// <returns>位图对象,24位彩色</returns>

        public static Bitmap ApplyMapping(Bitmap bp, byte[] Map)

        {

            Bitmap b = new Bitmap(bp);  //若仅作一次处理,不进行实时预览,此行可去掉

            BitmapData data = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),

ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            int offset = data.Stride - data.Width * BPP;

            unsafe

            {

                byte* p = (byte*)(data.Scan0);

                for (int i = 0; i < data.Height; i++) //循环读取每个像素的每个通道,查表赋值

                {

                    for (int j = 0; j < data.Width; j++)

                    {

                        for (int k = 0; k < 3; k++)

                        {

 

                            p[k] = Map[p[k]];

                        }

                        p += BPP;

                    }

                    p += offset;

                }

            }

            b.UnlockBits(data);

            return b;

        }

本文转自博客园知识天地的博客,原文链接:Photoshop色阶、曲线命令图解和编程实现(附源码),如需转载请自行联系原博主。


相关文章
|
开发工具 Nacos git
Git如何checkout远程tag
Git如何checkout远程tag
4067 0
|
5月前
|
JavaScript 前端开发 物联网
全面解析鸿蒙相关概念:鸿蒙、开源鸿蒙、鸿蒙 Next 有何区别
程序员晚枫近期研究了鸿蒙系统相关概念,主要包括 OpenHarmony、HarmonyOS 和 HarmonyOS NEXT。OpenHarmony 是开源项目,适用于物联网设备;HarmonyOS 由华为开发,兼容安卓应用,用于手机和平板等;HarmonyOS NEXT 剔除安卓生态,采用纯鸿蒙技术,专注原生应用开发。三者在技术架构、应用场景和开发工具上各有特点,共同推动鸿蒙生态系统的发展。
1129 5
全面解析鸿蒙相关概念:鸿蒙、开源鸿蒙、鸿蒙 Next 有何区别
|
C# C++
GDAL打开中文路径和读写中文字段的问题
版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/40394839 GDAL不同的版本对中文的默认支持不一,有时候默认支持,有时候需要自己去设置。
1900 0
|
8月前
|
机器学习/深度学习 编解码 自动驾驶
YOLOv11改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
YOLOv11改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
276 16
YOLOv11改进策略【模型轻量化】| 替换骨干网络为MoblieNetV1,用于移动视觉应用的高效卷积神经网络
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
827 0
|
机器学习/深度学习 PyTorch 算法框架/工具
使用FP8加速PyTorch训练的两种方法总结
在PyTorch中,FP8数据类型用于高效训练和推理,旨在减少内存占用和加快计算速度。虽然官方尚未全面支持,但在2.2版本中引入了`torch.float8_e4m3fn`和`torch.float8_e5m2`。文章通过示例展示了如何利用FP8优化Vision Transformer模型,使用Transformer Engine库提升性能,并探讨了PyTorch原生FP8支持的初步使用方法。实验表明,结合TE和FP8,训练速度可提升3倍,性能有显著增强,特别是在NVIDIA GPU上。然而,PyTorch的FP8支持仍处于试验阶段,可能带来不稳定性。
562 0
|
数据可视化 数据挖掘
R语言复杂网络分析:聚类(社区检测)和可视化
R语言复杂网络分析:聚类(社区检测)和可视化
|
Shell 开发工具 git
git拉去代码报错"Failed to connect to 127.0.0.1 port 31181: Connection refused"
在克隆`https://example.git/`时遇到错误:&quot;fatal: unable to access &#39;https://example.git/&#39;: Failed to connect to 127.0.0.1 port 31181: Connection refused&quot;。原因是Windows上代理设置未正确关闭,影响了Git配置。解决方法是通过git bash运行命令检查并取消代理:`git config --global http.proxy`和`git config --global --unset http.proxy`。
399 1
 git拉去代码报错"Failed to connect to 127.0.0.1 port 31181: Connection refused"
Command ‘nohub‘ not found, did you mean: command ‘nohup‘ from deb coreutils (8.32-4.1ubuntu1)
Command ‘nohub‘ not found, did you mean: command ‘nohup‘ from deb coreutils (8.32-4.1ubuntu1)