6
社区成员
发帖
与我相关
我的任务
分享加法混色:通过发光(如屏幕像素)叠加不同颜色的光来产生颜色。三种基色光叠加,亮度会增加。
text
红色 + 绿色 = 黄色 红色 + 蓝色 = 品红(洋红) 绿色 + 蓝色 = 青色 红色 + 绿色 + 蓝色 = 白色 全部没有 = 黑色
每个通道:0 ~ 255(8位)或 0.0 ~ 1.0(归一化)
共可表示:256³ = 16,777,216 种颜色
| 颜色 | R | G | B |
|---|---|---|---|
| 纯红 | 255 | 0 | 0 |
| 纯绿 | 0 | 255 | 0 |
| 纯蓝 | 0 | 0 | 255 |
| 黑色 | 0 | 0 | 0 |
| 白色 | 255 | 255 | 255 |
| 灰色(50%) | 128 | 128 | 128 |
| 黄色 | 255 | 255 | 0 |
| 青色 | 0 | 255 | 255 |
| 品红 | 255 | 0 | 255 |
| 橙色 | 255 | 165 | 0 |
| 紫色 | 128 | 0 | 128 |
python
# RGB 混色示例 红色 = (255, 0, 0) 绿色 = (0, 255, 0) 黄色 = 红色 + 绿色 # (255, 255, 0) # 调整亮度 暗红 = (100, 0, 0) # 降低亮度 亮红 = (255, 50, 50) # 增加其他分量变亮
在 RGB 基础上增加 Alpha 通道 控制透明度。透明度决定了该颜色与背景颜色的混合程度。
text
最终颜色 = 前景色 * Alpha + 背景色 * (1 - Alpha)
R, G, B, A 各通道:0 ~ 255 或 0.0 ~ 1.0
A = 255(不透明),A = 0(完全透明)
python
# 50% 透明的红色叠加在白色背景上 前景色 = (255, 0, 0, 128) # Alpha = 128/255 ≈ 0.5 背景色 = (255, 255, 255) # 白色 # 混合结果 R = 255 * 0.5 + 255 * (1 - 0.5) = 255 G = 0 * 0.5 + 255 * 0.5 = 127.5 B = 0 * 0.5 + 255 * 0.5 = 127.5 结果 = (255, 127, 127) # 浅红色
| Alpha值 | 透明度效果 |
|---|---|
| 255 | 完全不透明 |
| 200 | 轻微透明(约78%) |
| 128 | 半透明(50%) |
| 80 | 较透明(约31%) |
| 0 | 完全透明 |
减法混色:通过吸收(反射)光线来产生颜色。油墨/颜料吸收一部分光,反射剩余的光。叠加越多,颜色越暗。
text
青色 + 品红 = 蓝色 青色 + 黄色 = 绿色 品红 + 黄色 = 红色 青色 + 品红 + 黄色 = 黑色(理论上)
每个通道:0% ~ 100%(或 0 ~ 255)
数值越大,该色油墨越多,颜色越暗
| 颜色 | C | M | Y | K |
|---|---|---|---|---|
| 纯青 | 100 | 0 | 0 | 0 |
| 纯品红 | 0 | 100 | 0 | 0 |
| 纯黄 | 0 | 0 | 100 | 0 |
| 纯黑 | 0 | 0 | 0 | 100 |
| 白色 | 0 | 0 | 0 | 0 |
| 红色 | 0 | 100 | 100 | 0 |
| 绿色 | 100 | 0 | 100 | 0 |
| 蓝色 | 100 | 100 | 0 | 0 |
| 灰色(50%) | 0 | 0 | 0 | 50 |
| 深蓝色 | 100 | 80 | 0 | 30 |
理论上 C+M+Y = 黑色,但实际油墨不纯,混合后是深棕色。使用纯黑色油墨:
颜色更纯正
节约彩色油墨
印刷文字时更清晰
python
# 假设 RGB 值范围 0-1 R, G, B = 1.0, 0.0, 0.0 # 红色 # 计算 CMYK C = 1 - R # 青色 = 1 - 红色 M = 1 - G # 品红 = 1 - 绿色 Y = 1 - B # 黄色 = 1 - 蓝色 K = min(C, M, Y) # 黑色 = 取最小值 # 减去黑色分量 C = (C - K) / (1 - K) M = (M - K) / (1 - K) Y = (Y - K) / (1 - K)
这是人类感知颜色的方式,通过三个属性描述:
| 属性 | 含义 | 范围 |
|---|---|---|
| H (Hue) - 色相 | 什么颜色? | 0° ~ 360°(红色=0°, 绿色=120°, 蓝色=240°) |
| S (Saturation) - 饱和度 | 颜色纯不纯? | 0 ~ 1(0=灰,1=纯色) |
| V (Value) - 明度 | 颜色亮不亮? | 0 ~ 1(0=黑,1=最亮) |
| L (Lightness) - 亮度 | 颜色亮不亮? | 0 ~ 1(0=黑,1=白) |
text
0° → 红色 60° → 黄色 120° → 绿色 180° → 青色 240° → 蓝色 300° → 品红 360° → 红色(回到起点)
| 颜色 | H | S | V |
|---|---|---|---|
| 纯红 | 0° | 100% | 100% |
| 纯绿 | 120° | 100% | 100% |
| 纯蓝 | 240° | 100% | 100% |
| 粉色 | 0° | 50% | 100% |
| 深红 | 0° | 100% | 50% |
| 灰色 | 0° | 0% | 50% |
| 白色 | 0° | 0% | 100% |
| 黑色 | 0° | 0% | 0% |
调整颜色更直观:
python
# 想要更鲜艳 → 增加 S # 想要更亮 → 增加 V # 想要换颜色 → 改变 H # 想要变灰 → 降低 S # 想要变暗 → 降低 V
| 通道 | 含义 | 范围 | 说明 |
|---|---|---|---|
| L | 明度 | 0 ~ 100 | 0=黑,100=白 |
| a | 绿-红轴 | -128 ~ +127 | 负值=绿色,正值=红色 |
| b | 蓝-黄轴 | -128 ~ +127 | 负值=蓝色,正值=黄色 |
| 颜色 | L | a | b |
|---|---|---|---|
| 纯红 | 53 | 80 | 67 |
| 纯绿 | 88 | -86 | 83 |
| 纯蓝 | 32 | 79 | -107 |
| 白色 | 100 | 0 | 0 |
| 黑色 | 0 | 0 | 0 |
| 灰色(50%) | 50 | 0 | 0 |
与设备无关:无论显示器还是打印机,相同的 Lab 值看起来一样
色彩空间更大:比 RGB 能表示更多颜色
感知均匀:数值变化与视觉变化一致
只有亮度信息,没有颜色信息。每个像素一个值表示亮度。
8位:0 ~ 255(0=黑,255=白)
归一化:0.0 ~ 1.0
python
# 标准公式(人眼对不同颜色敏感度不同) 灰度 = 0.299 * R + 0.587 * G + 0.114 * B # 简化公式(平均值) 灰度 = (R + G + B) / 3
| 灰度值 | 视觉效果 |
|---|---|
| 0 | 纯黑 |
| 64 | 深灰 |
| 128 | 中灰 |
| 192 | 浅灰 |
| 255 | 纯白 |
| 模型 | 通道数 | 混色方式 | 主要用途 | 值范围 |
|---|---|---|---|---|
| RGB | 3 | 加色(发光) | 显示器、屏幕 | 0-255 或 0-1 |
| RGBA | 4 | 加色 + 透明度 | 图像合成、UI | 0-255 + A |
| CMYK | 4 | 减色(吸光) | 印刷、打印 | 0-100% |
| HSV | 3 | 感知属性 | 图像编辑、调色 | H:0-360°, S/V:0-1 |
| HSL | 3 | 感知属性 | 图像编辑、调色 | H:0-360°, S/L:0-1 |
| Lab | 3 | 数学空间 | 色彩管理、转换 | L:0-100, a/b:-128~127 |
| 灰度 | 1 | 亮度 | 黑白图像 | 0-255 |
python
# OpenCV 颜色转换示例
import cv2 as cv
img = cv.imread('image.jpg') # BGR 格式
# 转换到不同色彩空间
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 灰度
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV) # HSV
lab = cv.cvtColor(img, cv.COLOR_BGR2Lab) # Lab
cmyk = cv.cvtColor(img, cv.COLOR_BGR2CMYK) # CMYK(需要额外库)
RGB 是屏幕发光,加色混合越加越亮
CMYK 是印刷吸光,减色混合越加越暗
RGBA 多透明度,透明叠加靠算法
HSV 像人眼,色相饱和度亮度
Lab 是标准,与设备无关色彩准
灰度 最简单,只存亮度没有色