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 分离调整 |
扩展阅读
- GraphicsMagick 颜色处理参考
- 色彩空间基础
- ICC 配置文件详解
- sRGB 色彩空间规范
- 摄影后期调色技巧
上一章:第04章 几何变换
下一章:第06章 绘图与合成