第三章 色彩空间与校正:RGB/HSV/YUV色彩空间、白平衡算法、色彩矩阵校正
做内窥镜图像处理这些年,我最大的感触就是:色彩是内窥镜的“第二生命”。你想想看,医生盯着屏幕看的是啥?不是像素,不是信噪比,而是黏膜的颜色、血管的走向、病灶的边界。如果颜色偏了,再高的分辨率也是白搭。
这一章,咱们就聊聊色彩空间和校正。说白了,就是解决两个问题:颜色怎么表示,以及颜色怎么调准。
3.1 三大色彩空间:RGB、HSV、YUV
不同的色彩空间,就像不同的语言。RGB是硬件说的,HSV是人眼说的,YUV是传输说的。你得学会在它们之间自由切换。
3.1.1 RGB色彩空间
RGB是最基础的,每个像素由红、绿、蓝三个分量组成。内窥镜的CMOS传感器直接输出的就是RGB数据。但这里有个坑——RGB分量之间相关性太强。你调一下亮度,三个分量一起变,很难单独处理色偏。
关键点:RGB适合显示,不适合做图像处理。我建议把校正算法放在其他空间做。
3.1.2 HSV色彩空间
HSV把颜色拆成色调(H)、饱和度(S)、明度(V)。这玩意儿太适合内窥镜了。为什么?因为人体组织的色调是相对稳定的——黏膜是粉红的,血管是暗红的,胆汁是黄绿的。你只需要在H通道上做校正,不影响亮度。
转换公式(从RGB到HSV):
V = max(R, G, B)
S = (V - min(R, G, B)) / V (if V != 0)
H = 根据R/G/B的相对大小计算,范围0-360°
我在项目中遇到过一个问题:HSV转换后,低亮度区域的S值会剧烈抖动,导致伪影。后来我加了一个阈值判断——当V小于某个值时,直接保留原始色相,不参与校正。
3.1.3 YUV色彩空间
YUV是视频传输的标准。Y是亮度,U和V是色差。内窥镜视频流通常走YUV422或YUV420格式。好处是:亮度信息单独存放,做增强时不会影响颜色。
| 色彩空间 | 适用场景 | 我的建议 |
|---|---|---|
| RGB | 传感器原始数据、显示 | 尽量少做处理 |
| HSV | 白平衡、色调校正 | 首选,直观好用 |
| YUV | 视频编码、亮度增强 | 注意色度采样 |
小技巧:如果你在做实时处理,尽量用查表法做色彩空间转换。别每次算三角函数,太慢了。
3.2 白平衡算法
内窥镜的光源是冷光源,色温通常在5500K-6500K。但人体组织反射后,颜色会偏红。白平衡就是把这个“偏色”拉回来。
3.2.1 灰度世界法
这个算法假设:一幅图像中,所有颜色的平均值是灰色的。说白了,就是让R、G、B三个通道的平均值相等。
R_avg = mean(R)
G_avg = mean(G)
B_avg = mean(B)
K = (R_avg + G_avg + B_avg) / 3
R_gain = K / R_avg
G_gain = K / G_avg
B_gain = K / B_avg
R_out = R * R_gain
G_out = G * G_gain
B_out = B * B_gain
嗯,这里要注意。内窥镜图像里,黏膜区域占了大部分,本身就是偏红的。直接用灰度世界法,会把红色压得太狠,导致图像发青。我曾经踩过这个坑,后来加了一个区域选择——只对图像中部的非高光区域做统计。
3.2.2 完美反射法
这个算法假设:图像中最亮的点应该是白色的。找到这些“白点”,用它们的RGB值做参考。
步骤很简单:
- 把图像转成灰度,找到亮度最高的前1%像素
- 统计这些像素的R、G、B平均值
- 计算增益系数,让这些点的RGB相等
警告:内窥镜里经常有高光反光点(比如金属器械、湿润的黏膜表面)。这些点不是“完美反射”,而是“过曝”。直接用会出问题。我建议先做高光检测,把这些点排除掉。
3.2.3 自适应白平衡
这是我个人比较喜欢的方法。它结合了灰度世界和完美反射的优点,还加入了色温估计。
核心思路:
- 先估计当前场景的色温
- 根据色温查表得到目标增益
- 用低通滤波器平滑增益变化,避免闪烁
为什么加低通?因为内窥镜在移动时,场景变化很快。如果增益跟着剧烈跳变,画面会一闪一闪的,医生看着头晕。我一般用一阶IIR滤波器,系数取0.3左右。
3.3 色彩矩阵校正
白平衡搞定了全局色偏,但每个摄像头的色彩响应曲线都不一样。这就是色彩矩阵校正的用武之地。
3.3.1 3x3色彩校正矩阵
说白了,就是用一个3x3的矩阵,把传感器输出的RGB值映射到标准色彩空间。
[R_out] [a11 a12 a13] [R_in]
[G_out] = [a21 a22 a23] * [G_in]
[B_out] [a31 a32 a33] [B_in]
这个矩阵怎么来的?用色卡标定。拍一张标准色卡(比如X-Rite ColorChecker),然后最小二乘法拟合出矩阵系数。
我在项目中遇到过一个问题:矩阵系数可能是负的。负系数会导致某些颜色溢出或截断。比如一个像素的R_in很小,但a12是负的,G_in又很大,算出来的R_out可能变成负数。这时候必须做截断处理。
3.3.2 非线性校正
有时候3x3矩阵不够用。因为传感器的响应不是完全线性的。这时候需要引入非线性项,比如多项式校正。
一个常用的二阶模型:
R_out = a0 + a1*R + a2*G + a3*B + a4*R^2 + a5*G^2 + a6*B^2 + a7*R*G + a8*R*B + a9*G*B
嗯,参数多了很多,但精度确实能提升。代价是计算量大了。如果你做实时处理,建议只在关键帧上做非线性校正,中间帧用线性插值。
核心原则:色彩校正不是越复杂越好。内窥镜图像最重要的是“一致性”——同一台设备在不同时间、不同场景下,颜色表现要稳定。我宁愿用简单的线性矩阵加一个稳定的白平衡,也不用复杂的非线性模型但参数飘忽不定。
3.4 本章知识体系
下面这张图,是我自己总结的色彩空间与校正的完整流程。你可以看到,从传感器原始数据到最终显示,每一步都有对应的处理策略。
你看,整个流程其实不复杂。关键是要理解每一步在做什么,以及为什么这么做。我见过很多工程师,上来就调矩阵系数,结果越调越乱。其实先搞定白平衡,色彩矩阵只需要微调就够了。
我的经验:调试色彩校正时,准备一套标准色卡图像。每次改参数后,用色卡做对比。别凭肉眼感觉调,人眼会疲劳,会欺骗你。
好了,这一章就到这里。色彩空间和校正,说白了就是让内窥镜“看到”的颜色,和医生肉眼看到的保持一致。下一章我们会聊更刺激的内容——图像增强与去噪。不过那是后话了,先把色彩搞明白再说。
公众号:蓝海资料掘金营,微信deep3321