第10篇:曲线与直方图——色调重映射的两种方式 第10篇曲线与直方图——色调重映射的两种方式系列导语本文是有趣的图像处理系列第10篇。第8篇的点运算亮度/对比度/Gamma使用的都是固定形状的映射曲线直线或幂函数。本篇进入更灵活的工具色阶分段线性映射和曲线任意形状的样条映射以及从直方图出发自动推导映射曲线的直方图均衡化。[← 第9篇色相/饱和度/亮度的独立调控] | [第11篇色彩平衡与通道混合 →] | [系列目录]导语Photoshop 里有三个外观相似却功能各异的调色工具色阶Levels、曲线Curves、直方图均衡化Auto Tone。它们都在做同一件事——把输入像素值重映射到输出像素值——但控制粒度从粗到细色阶拖动三个滑块黑场、白场、灰场分段线性映射曲线在输入/输出坐标轴上自由放置控制点样条插值直方图均衡化不需要手动设置自动从图像直方图推导最优映射这三者都可以用**查找表LUT**实现效率极高。理解它们的数学本质就是理解调色曲线这一概念的全貌。一、直方图——像素值的分布图1.1 什么是直方图图像直方图统计每个灰度值0–255出现的像素个数H ( v ) ∣ { ( x , y ) ∣ I ( x , y ) v } ∣ , v ∈ [ 0 , 255 ] H(v) |\{(x,y) \mid I(x,y) v\}|, \quad v \in [0, 255]H(v)∣{(x,y)∣I(x,y)v}∣,v∈[0,255]直方图揭示了图像的曝光状态直方图集中在左侧低值→ 图像偏暗、欠曝直方图集中在右侧高值→ 图像偏亮、过曝直方图集中在中间 → 低对比度缺乏层次直方图均匀铺开 → 对比度充足层次丰富1.2 累积分布函数CDF直方图的累积求和得到CDFCumulative Distribution FunctionCDF ( v ) ∑ u 0 v H ( u ) \text{CDF}(v) \sum_{u0}^{v} H(u)CDF(v)u0∑v​H(u)归一化后除以总像素数n nn得到概率意义上的累积分布F ( v ) ∈ [ 0 , 1 ] F(v) \in [0,1]F(v)∈[0,1]。CDF 是直方图均衡化的核心工具。二、色阶——分段线性映射2.1 三个控制点色阶调整用三个参数控制输入范围黑场in_low低于此值的像素全部映射为 0纯黑白场in_high高于此值的像素全部映射为 255纯白中间调Gamma控制中间区域的非线性等同于 Gamma 校正简化版不含中间调 Gamma仅线性映射I out clamp ⁣ ( I in − in_low in_high − in_low × ( out_high − out_low ) out_low , 0 , 255 ) I_{\text{out}} \text{clamp}\!\left(\frac{I_{\text{in}} - \text{in\_low}}{\text{in\_high} - \text{in\_low}} \times (\text{out\_high} - \text{out\_low}) \text{out\_low},\ 0,\ 255\right)Iout​clamp(in_high−in_lowIin​−in_low​×(out_high−out_low)out_low,0,255)直觉把输入范围[ in_low , in_high ] [\text{in\_low},\ \text{in\_high}][in_low,in_high]拉伸到输出范围[ out_low , out_high ] [\text{out\_low},\ \text{out\_high}][out_low,out_high]。典型用途提升对比度设 in_low50, in_high200把中间段拉伸到全范围压缩高光设 out_high220使最亮像素不超过 220去除雾霾设 in_low 为雾霾灰度下限自动消除偏灰2.2 伪代码函数 色阶调整(图像 I, in_low, in_high, out_low0, out_high255): 范围 in_high - in_low 若 范围 0: 返回 全零图像保护除零 # 构建 LUT只需计算一次 对 v ∈ [0, 255]: lut[v] clamp( (v - in_low) / 范围 × (out_high - out_low) out_low, 0, 255 ) # 对每个 RGB 通道应用 LUT 对每个通道 c ∈ {R, G, B}: 输出[:,:,c] lut[输入[:,:,c]] 返回 输出左原图 / 右色阶调整in_low60in_high190。原本略显平淡的色调被拉伸到全范围黑色更深白色更亮整体对比度明显增强。三、曲线——任意形状的映射3.1 从直线到曲线色阶只能做线性映射加入 Gamma 后是分段线性幂函数。曲线工具允许在输入/输出坐标系上任意放置控制点用样条插值生成平滑的映射曲线可以对暗部、中间调、亮部分别设置不同的映射策略。常用曲线形状及其效果曲线形状公式/描述视觉效果对角线y x y xyx无变化恒等S 形曲线Sigmoidy 255 1 e − k ( x − 128 ) y \frac{255}{1e^{-k(x-128)}}y1e−k(x−128)255​暗部更暗、亮部更亮对比度增强反 S 形Sigmoid 取反对比度降低偏灰上凸曲线y x × 255 y \sqrt{x \times 255}yx×255​暗部提亮同 Gamma 1下凸曲线y ( x / 255 ) 2 × 255 y (x/255)^2 \times 255y(x/255)2×255亮部压暗同 Gamma 13.2 S 形曲线最常用S 形曲线是调色最经典的操作压暗暗部、提亮亮部、中灰保持不变视觉上层次更丰富I out 255 1 e − k ( I in − 128 ) I_{\text{out}} \frac{255}{1 e^{-k(I_{\text{in}} - 128)}}Iout​1e−k(Iin​−128)255​其中k kk控制 S 形的陡峭程度k 0.05 k0.05k0.05是轻微对比度增强k 0.1 k0.1k0.1是明显的对比增强。3.3 伪代码函数 曲线调整(图像 I, 曲线类型): # 构建 LUT 对 v ∈ [0, 255]: 若 曲线类型 S形: lut[v] 255 / (1 exp(-0.05 × (v - 128))) 若 曲线类型 提亮: lut[v] sqrt(v × 255) # 上凸曲线 若 曲线类型 压暗: lut[v] (v / 255)² × 255 # 下凸曲线 lut[v] clamp(lut[v], 0, 255) # 应用 LUT 到 RGB 通道 对每个通道 c ∈ {R, G, B}: 输出[:,:,c] lut[输入[:,:,c]] 返回 输出左原图 / 右上凸曲线brighteny x × 255 y\sqrt{x \times 255}yx×255​。暗部大幅提亮、细节涌现亮部变化相对较小效果与 levels 的对比增强方向相反清晰展示了曲线形状对亮度分布的影响。四、直方图均衡化——自动推导映射曲线4.1 目标让直方图均匀分布手动设置曲线需要经验直方图均衡化的目标是自动找到一条映射曲线使输出图像的直方图尽量均匀——每个灰度值出现的频率相同。均匀分布意味着对比度被最大化图像充分利用了 0–255 的全部灰度范围。4.2 数学推导用 CDF 构造映射设原始图像的归一化 CDF 为F ( v ) F(v)F(v)输出图像总像素数为n nn总灰阶数为L 256 L256L256。映射函数T ( v ) round ⁣ ( ( L − 1 ) × F ( v ) ) T(v) \text{round}\!\left((L-1) \times F(v)\right)T(v)round((L−1)×F(v))直觉CDF 是单调递增函数取值从 0 到 1。将其拉伸到[ 0 , L − 1 ] [0, L-1][0,L−1]就把像素密集的暗区展开、稀疏的亮区压缩最终使输出分布更均匀。4.3 伪代码函数 直方图均衡化(图像 I): # 步骤1计算直方图 对 v ∈ [0, 255]: hist[v] 值为 v 的像素个数 # 步骤2计算累积分布函数CDF cdf[0] hist[0] 对 v ∈ [1, 255]: cdf[v] cdf[v-1] hist[v] # 步骤3归一化 CDF构建映射 LUT n 总像素数 对 v ∈ [0, 255]: lut[v] round(255 × cdf[v] / n) # 步骤4应用 LUT 对每个通道 c ∈ {R, G, B}: 输出[:,:,c] lut[输入[:,:,c]] 返回 输出4.4 全局均衡 vs 自适应均衡CLAHE全局均衡对整张图像使用同一条映射曲线可能导致局部区域过曝或欠曝。CLAHEContrast Limited Adaptive Histogram Equalization对比度限制的自适应直方图均衡化将图像分成小块默认 8×8对每块独立均衡再用双线性插值拼接避免了全局均衡的局部失真问题。左人工模拟的低对比度版压缩到灰度范围 60–180模拟雾天/欠曝/ 右全局直方图均衡化YCrCb 亮度通道。暗部细节涌现整体对比度显著提升颜色无明显偏移。五、三种方法的统一框架LUT5.1 都是 LUT只是推导方式不同方法LUT 推导方式自由度色阶分段线性公式3–4 个参数低仅控制黑白场和中间调曲线控制点 样条插值高可对任意区间单独控制直方图均衡化从 CDF 自动计算无需手动设置但结果不可预测所有三种方法的执行都归结为同一操作对 256 个输入值预计算输出值存入 LUT然后用 LUT 替换每个像素。5.2 通道处理策略对每个通道独立均衡颜色会发生偏移因为 R/G/B 直方图各不相同转换到 Lab 或 YCbCr只均衡亮度通道保持色调不变是更专业的做法5.3 Gamma 校正与曲线的关系Gamma 校正第8篇是幂函数曲线的特例T γ ( v ) 255 × ( v / 255 ) 1 / γ T_\gamma(v) 255 \times (v/255)^{1/\gamma}Tγ​(v)255×(v/255)1/γ这条曲线是上凸γ1或下凸γ1的平滑曲线可以看作曲线工具的一种受限形式。曲线工具更通用——它可以模拟任何 Gamma 值也可以做 Gamma 做不到的非单调映射如局部反色。六、实现要点6.1 单调性与可逆性色阶和 S 形曲线是严格单调递增的映射这保证了不改变像素的相对明暗顺序映射可逆理论上可以找到逆映射还原图像直方图均衡化一般也是单调的但当多个输入值映射到同一输出值时直方图有空洞严格单调性不保证。6.2 LUT 的精度问题标准 8 位 LUT256 个元素对于 8 位图像完全足够。对于 16 位图像如 RAW 格式需要 65536 个元素的 LUT否则会产生色调分离Posterization现象——输出中出现明显的色阶跳变带。6.3 曲线工具的样条插值实际软件中曲线工具用三次 Hermite 样条或Catmull-Rom 样条插值控制点保证曲线平滑且通过每个控制点。最终还是转成 LUT 执行插值只是 LUT 的生成方式。结语本文厘清了色调重映射的完整体系✅直方图像素值分布的统计视图直接揭示曝光状态✅CDF直方图的累积求和是直方图均衡化的数学核心✅色阶黑场/白场/中间调三参数分段线性映射直观可控✅曲线任意控制点 样条插值对暗部/中间调/亮部分别精控✅直方图均衡化用 CDF 自动构造映射对比度最大化无需手动✅统一框架三种方法都归结为构建并应用 LUT核心操作相同下一篇进入色彩映射章节的最后一篇色彩平衡与通道混合——如何对阴影/中间调/高光分区调色以及通道间的线性组合。系列文章导航 当前位置第10篇 - 曲线与直方图➡️ 下一篇第11篇 - 色彩平衡与通道混合 上一篇第9篇 - 色相/饱和度/亮度的独立调控 系列首页总览篇标签图像处理曲线色阶直方图均衡化LUTCDFCLAHE色调映射对比度PythonOpenCV本文是有趣的图像处理系列的第10篇所有算法基于 Python OpenCV NumPy 实现完整代码见 Github。