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

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宽色域 RGBAdobeRGB1998.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章 绘图与合成