强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

GraphicsMagick 图像处理完整教程 / 第05章 颜色处理

第05章 颜色处理

5.1 色彩空间 (Color Space)

5.1.1 常见色彩空间

色彩空间 说明 典型用途
sRGB 标准 RGB(Web 标准) 网页、通用图像
RGB 线性 RGB 图像计算
CMYK 青品黄黑 印刷输出
HSL 色相-饱和度-亮度 颜色调整
HSV/HSB 色相-饱和度-明度 颜色调整
Lab/CIELAB 感知均匀色彩空间 色彩管理
YCbCr 亮度-色度 JPEG、视频
Gray 灰度 黑白图像
Rec709Luma 高清视频亮度 视频处理

5.1.2 色彩空间转换

# 查看当前图像的色彩空间
gm identify -verbose input.jpg | grep "Colorspace"

# 转换为灰度
gm convert -colorspace Gray input.jpg output_gray.jpg

# 转换为 sRGB
gm convert -colorspace sRGB input.jpg output_srgb.jpg

# 转换为 CMYK(印刷用)
gm convert -colorspace CMYK input.jpg output_cmyk.jpg

# 转换为 HSL
gm convert -colorspace HSL input.jpg output_hsl.jpg

# 转换为 Rec709Luma(高清视频标准亮度)
gm convert -colorspace Rec709Luma input.jpg output_luma.jpg

5.1.3 CMYK ↔ RGB 转换注意事项

# RGB → CMYK(需要 ICC 配置文件)
gm convert -profile sRGB.icc -profile USWebCoatedSWOP.icc \
  input_rgb.jpg output_cmyk.jpg

# CMYK → RGB
gm convert -profile USWebCoatedSWOP.icc -profile sRGB.icc \
  input_cmyk.jpg output_rgb.jpg

⚠️ 注意:RGB 与 CMYK 之间的精确转换需要 ICC 配置文件,简单的 -colorspace CMYK 可能导致颜色失真。


5.2 亮度与对比度调整

5.2.1 亮度调整 (Brightness)

# 增加亮度(-brightness-contrast BxC)
# B 范围: -100 到 +100
gm convert -brightness-contrast 30x0 input.jpg output.jpg   # 增亮 30%
gm convert -brightness-contrast -20x0 input.jpg output.jpg  # 变暗 20%

# 等价写法(旧语法)
gm convert -modulate 130,100,100 input.jpg output.jpg  # 增亮 30%
gm convert -modulate 80,100,100 input.jpg output.jpg   # 变暗 20%

5.2.2 对比度调整 (Contrast)

# 增加对比度
gm convert -brightness-contrast 0x30 input.jpg output.jpg

# 降低对比度
gm convert -brightness-contrast 0x-20 input.jpg output.jpg

# 同时调整亮度和对比度
gm convert -brightness-contrast 10x25 input.jpg output.jpg

5.2.3 自动对比度

# 自动拉伸对比度(Normalize)
gm convert -normalize input.jpg output.jpg

# 限制归一化范围(避免过曝/过暗)
gm convert -normalize -contrast-stretch 2%x1% input.jpg output.jpg

# 直方图均衡化(Histogram Equalization)
gm convert -equalize input.jpg output.jpg

5.2.4 亮度/对比度参数对照

操作 命令 效果
增亮 -brightness-contrast 30x0 整体变亮
变暗 -brightness-contrast -30x0 整体变暗
提高对比 -brightness-contrast 0x30 明暗差异加大
降低对比 -brightness-contrast 0x-30 明暗差异缩小
自动校正 -normalize 自动拉伸到全范围
均衡化 -equalize 直方图均衡

5.3 色调、饱和度与亮度 (HSL 调整)

5.3.1 -modulate 参数

-modulate 是 HSL 调整的核心命令,格式为:

-modulate 亮度,饱和度,色调

亮度:   100 = 原始,>100 更亮,<100 更暗
饱和度: 100 = 原始,0 = 灰度,200 = 双倍饱和
色调:   100 = 原始,范围 0-200(色相旋转 0°-360°)

5.3.2 色调/饱和度调整示例

# 去饱和(降低饱和度)
gm convert -modulate 100,50,100 input.jpg output.jpg   # 50% 饱和度
gm convert -modulate 100,0,100 input.jpg output.jpg    # 完全灰度

# 增加饱和度
gm convert -modulate 100,150,100 input.jpg output.jpg  # 150% 饱和度

# 色相旋转(调整色调)
gm convert -modulate 100,100,50 input.jpg output.jpg   # 色相旋转 90°
gm convert -modulate 100,100,150 input.jpg output.jpg  # 色相旋转 270°

# 综合调整:增亮 + 增加饱和 + 轻微色相偏移
gm convert -modulate 120,130,105 input.jpg output.jpg

5.3.3 业务场景:照片调色预设

#!/bin/bash
# photo_presets.sh — 照片调色预设脚本
# 用法: ./photo_presets.sh input.jpg preset_name

INPUT="$1"
PRESET="$2"
OUTPUT="output_${PRESET}.jpg"

case "$PRESET" in
  "warm")
    # 暖色调:增加亮度,微增饱和,色相偏暖
    gm convert -modulate 110,120,95 -brightness-contrast 5x5 "$INPUT" "$OUTPUT"
    ;;
  "cool")
    # 冷色调:微降亮度,色相偏冷
    gm convert -modulate 95,105,110 -brightness-contrast -5x10 "$INPUT" "$OUTPUT"
    ;;
  "vintage")
    # 复古:降饱和,提亮度,加棕褐色调
    gm convert -modulate 115,60,100 -sepia-tone 80% "$INPUT" "$OUTPUT"
    ;;
  "vivid")
    # 鲜艳:高饱和,高对比
    gm convert -modulate 105,180,100 -brightness-contrast 0x20 "$INPUT" "$OUTPUT"
    ;;
  "bw")
    # 黑白
    gm convert -colorspace Gray -brightness-contrast 0x15 "$INPUT" "$OUTPUT"
    ;;
  *)
    echo "未知预设: $PRESET"
    echo "可选: warm, cool, vintage, vivid, bw"
    exit 1
    ;;
esac

echo "已应用 $PRESET 预设: $OUTPUT"

5.4 颜色曲线与色阶

5.4.1 色阶调整 (Level)

# 色阶调整
# -level 黑点%,白点%,gamma
gm convert -level 10%,90%,1.0 input.jpg output.jpg  # 裁切暗部和亮部
gm convert -level 0%,100%,0.8 input.jpg output.jpg  # 调整 gamma

# 仅调整 gamma
gm convert -level 0%,100%,1.5 input.jpg output.jpg  # 提亮中间调
gm convert -level 0%,100%,0.6 input.jpg output.jpg  # 压暗中间调

# 通道级别调整
gm convert -channel R -level 10%,90% \
           -channel G -level 5%,95% \
           -channel B -level 15%,85% \
           input.jpg output.jpg

5.4.2 Level 参数说明

-level 黑点%,白点%,gamma

黑点%:  低于此值的像素变为纯黑 (0-100)
白点%:  高于此值的像素变为纯白 (0-100)
gamma:  伽马值,<1 提亮中间调,>1 压暗中间调

示例:
-level 5%,95%,1.0  — 裁切 5% 暗部和 5% 亮部
-level 0%,100%,0.5 — 整体提亮(gamma < 1)
-level 0%,100%,2.0 — 整体压暗(gamma > 1)

5.5 特殊颜色效果

5.5.1 色调分离 (Posterize)

# 减少颜色数量(色调分离)
gm convert -posterize 4 input.jpg output.jpg   # 每通道 4 级(64 色)
gm convert -posterize 8 input.jpg output.jpg   # 每通道 8 级(512 色)

5.5.2 色调映射 (Map)

# 使用参考图像的颜色映射
gm convert -map palette.png input.jpg output.jpg

# 内置调色板
gm convert -map plasma: input.jpg output.jpg

5.5.3 色彩量化

# 限制颜色数量
gm convert -colors 16 input.jpg output.jpg   # 最多 16 色
gm convert -colors 256 input.jpg output.jpg  # 最多 256 色

# 透明度处理(Web 场景常用)
gm convert -colors 256 -type Palette input.png output.png

5.5.4 负片效果

# 反转颜色(负片效果)
gm convert -negate input.jpg output.jpg

# 仅反转亮度
gm convert -channel R -negate \
           -channel G -negate \
           -channel B -negate \
           input.jpg output.jpg

5.6 颜色填充与替换

5.6.1 填充纯色

# 创建纯色图像
gm convert -size 800x600 xc:'#FF6B6B' red.png
gm convert -size 800x600 xc:skyblue blue.png
gm convert -size 800x600 "xc:rgb(100,200,150)" green.png

# 创建渐变
gm convert -size 800x600 gradient:'#FF0000'-'#0000FF' gradient.png
gm convert -size 800x600 radial-gradient:'#FFFFFF'-'#000000' radial.png

5.6.2 颜色替换

# 用指定颜色填充透明区域
gm convert -fill '#FFFFFF' -opaque none \
  transparent_input.jpg output_white_bg.jpg

# 替换特定颜色
gm convert -fill '#FF0000' -opaque '#00FF00' \
  input.jpg output.jpg  # 将绿色替换为红色

5.6.3 颜色容差 (Fuzz)

# 使用 fuzz 容差进行近似颜色匹配
gm convert -fuzz 10% -fill '#FF0000' -opaque '#FF0010' \
  input.jpg output.jpg

# 去除白色背景
gm convert -fuzz 5% -transparent white input.jpg output.png

5.7 ICC 色彩管理

5.7.1 ICC 配置文件简介

ICC (International Color Consortium) 配置文件确保颜色在不同设备间的一致性。

ICC 类型 说明 常见文件
sRGB 标准 Web 色彩空间 sRGB.icm
Adobe RGB 宽色域 RGB AdobeRGB1998.icc
USWebCoatedSWOP 美国印刷标准 USWebCoatedSWOP.icc
ISO Coated v2 欧洲印刷标准 ISOcoated_v2_300_eci.icc

5.7.2 查看和嵌入 ICC

# 查看图像中的 ICC 配置文件
gm identify -verbose input.jpg | grep -A5 "ICC"

# 嵌入 ICC 配置文件
gm convert -profile sRGB.icc input.jpg output.jpg

# 嵌入多个配置文件(转换)
gm convert -profile AdobeRGB1998.icc -profile sRGB.icc \
  input.jpg output.jpg

# 去除 ICC 配置文件
gm convert +profile '*' input.jpg output.jpg

# 仅去除特定配置文件
gm convert -profile '' input.jpg output.jpg

5.7.3 业务场景:印刷色彩管理

#!/bin/bash
# print_color_management.sh
# Web 图片转印刷图片的色彩管理流程

INPUT="$1"
OUTPUT="print_${INPUT}"

# 色彩管理配置
SRGB_PROFILE="/usr/share/color/icc/sRGB.icc"
CMYK_PROFILE="/usr/share/color/icc/USWebCoatedSWOP.icc"

# 检查配置文件
if [ ! -f "$SRGB_PROFILE" ]; then
  echo "错误: 找不到 sRGB 配置文件"
  exit 1
fi

# 转换流程
gm convert "$INPUT" \
  -profile "$SRGB_PROFILE" \
  -profile "$CMYK_PROFILE" \
  -density 300 \
  -units PixelsPerInch \
  -quality 100 \
  -colorspace CMYK \
  "$OUTPUT"

echo "印刷用 CMYK 图像已生成: $OUTPUT"
gm identify -verbose "$OUTPUT" | grep -E "Colorspace|Resolution|Depth"

5.8 单通道操作

5.8.1 通道分离与合并

# 分离通道
gm convert input.jpg -separate channel_%d.jpg
# 输出: channel_0.jpg (Red), channel_1.jpg (Green), channel_2.jpg (Blue)

# 提取单通道
gm convert input.jpg -channel R -separate red_channel.jpg
gm convert input.jpg -channel G -separate green_channel.jpg
gm convert input.jpg -channel B -separate blue_channel.jpg

# 查看各通道直方图
gm convert input.jpg -separate histogram:channel_%d.png

5.8.2 通道级调整

# 仅调整红色通道的亮度
gm convert -channel R -brightness-contrast 20x0 \
  input.jpg output.jpg

# 仅增强绿色通道的对比度
gm convert -channel G -contrast-stretch 2% \
  input.jpg output.jpg

# 交换通道
gm convert -channel R -separate /tmp/r.jpg \
           -channel G -separate /tmp/g.jpg \
           -channel B -separate /tmp/b.jpg
# 用 BGR 顺序合并
gm combine -channel B /tmp/r.jpg \
           -channel G /tmp/g.jpg \
           -channel R /tmp/b.jpg \
           output_swapped.jpg

5.9 颜色量化与调色板

5.9.1 颜色量化

# 查看图像颜色数量
gm identify -verbose input.jpg | grep "Number Unique"

# 量化到 16 色(GIF 风格)
gm convert -colors 16 input.jpg output.gif

# 量化到 256 色(Web 安全色)
gm convert -colors 256 input.jpg output.png

# 提取主要颜色
gm convert input.jpg -colors 5 -unique-colors txt:-

5.9.2 生成调色板

# 提取图像的 5 种主要颜色
gm convert input.jpg \
  -resize 1x1! \
  -format '%[pixel:u]' info:-

# 更精确的颜色提取
gm convert input.jpg \
  -resize 100x100! \
  -colors 5 \
  -unique-colors \
  palette.png

# 显示调色板
gm display palette.png

5.10 实战场景

场景:图片自动优化

#!/bin/bash
# auto_enhance.sh
# 自动优化图片(对比度、色彩、锐度)

INPUT="$1"
OUTPUT="enhanced_${INPUT}"

gm convert "$INPUT" \
  -auto-level \
  -modulate 105,115,100 \
  -unsharp-mask 0x0.5+0.5+0 \
  -quality 92 \
  "$OUTPUT"

echo "优化完成: $OUTPUT"

场景:创建颜色样本表

#!/bin/bash
# color_chart.sh
# 生成自定义色板

OUTPUT="color_chart.png"
CELL_W=80
CELL_H=60

# 定义颜色
COLORS=("#FF6B6B" "#4ECDC4" "#45B7D1" "#96CEB4" "#FFEAA7" "#DDA0DD")
NAMES=("珊瑚红" "青绿" "天蓝" "薄荷绿" "柠檬黄" "梅紫")

# 生成各色块
i=0
IMAGES=""
for color in "${COLORS[@]}"; do
  gm convert -size "${CELL_W}x${CELL_H}" "xc:${color}" \
    -font Helvetica -pointsize 14 -gravity center \
    -annotate +0+0 "${NAMES[$i]}" \
    "/tmp/cell_${i}.png"
  IMAGES="$IMAGES /tmp/cell_${i}.png"
  ((i++))
done

# 拼接
gm montage $IMAGES -tile ${#COLORS[@]}x1 -geometry "${CELL_W}x${CELL_H}+2+2" \
  -background '#333333' "$OUTPUT"

# 清理
rm -f /tmp/cell_*.png

echo "色板已生成: $OUTPUT"

5.11 颜色操作速查表

操作 命令 说明
灰度化 -colorspace Gray 转为灰度
去饱和 -modulate 100,0,100 饱和度降为 0
增饱和 -modulate 100,150,100 饱和度 +50%
增亮 -brightness-contrast 30x0 亮度 +30
提对比 -brightness-contrast 0x30 对比度 +30
自动色阶 -normalize / -auto-level 拉伸到全范围
负片 -negate 反转颜色
色调分离 -posterize N 每通道 N 级
限色 -colors N 最多 N 种颜色
Gamma -level 0%,100%,G 调 gamma
透明色 -fuzz N% -transparent COLOR 去背景
ICC 嵌入 -profile file.icc 嵌入 ICC
去 ICC +profile '*' 移除配置文件

5.12 本章小结

要点 说明
-modulate 是 HSL 调整核心 亮度,饱和度,色调 三元组
-brightness-contrast 调亮度对比 一行命令完成基础调色
-level 控制色阶和 gamma 更精细的明暗控制
ICC 配置文件确保色彩一致 印刷、跨设备必须
-colors-posterize 控制色彩数量 特效和优化用
通道操作可精细调色 -channel 分离调整

扩展阅读

  1. GraphicsMagick 颜色处理参考
  2. 色彩空间基础
  3. ICC 配置文件详解
  4. sRGB 色彩空间规范
  5. 摄影后期调色技巧

上一章第04章 几何变换 下一章第06章 绘图与合成