2. 图像基础回顾:像素与色彩空间、图像直方图、图像滤波基础、图像金字塔
好,咱们正式开始啃图像预处理这块硬骨头。在动手写加速代码之前,我建议先把地基夯实。你想想看,如果连像素怎么存、颜色怎么表示都不清楚,后面做光照补偿很容易跑偏。
这一节我带你快速过一遍四个核心概念。都是老生常谈的东西,但我会结合项目里踩过的坑来讲。嗯,保证让你有新的收获。
2.1 像素与色彩空间
先说像素。一张数字图像,说白了就是一个二维数组。每个格子就是一个像素,里面存着颜色信息。灰度图每个像素只有一个值,范围 0~255,0 是黑,255 是白。彩色图呢,每个像素有三个通道,比如 RGB。
我个人习惯把像素理解成「最小的信息单元」。你在做光照补偿时,本质上就是在调整每个像素的亮度值。这个认知很重要。
色彩空间这块,我重点说三个你一定会用到的:
| 色彩空间 | 通道含义 | 适用场景 |
|---|---|---|
| RGB | 红、绿、蓝 | 显示、相机原始输出 |
| HSV | 色调、饱和度、明度 | 光照补偿、颜色分割 |
| Lab | 亮度、a 通道、b 通道 | 颜色距离计算、图像增强 |
为什么光照补偿常用 HSV 或 Lab?因为这两个空间把「亮度」单独拎出来了。你只动亮度通道,颜色就不会偏。我在做工业质检项目时,一开始直接在 RGB 上调亮度,结果产品颜色全变了,被产线负责人骂了一顿。后来换成 HSV,只调 V 通道,问题就解决了。
cv2.COLOR_BGR2HSV,别搞错了。
2.2 图像直方图
直方图是什么?就是统计每个像素值出现了多少次。横轴是像素值 0~255,纵轴是像素个数。它能直观反映一张图的明暗分布。
举个例子。一张过暗的图像,直方图会集中在左边(低像素值区域)。过亮的图,直方图集中在右边。正常曝光的图,直方图分布比较均匀。
我曾经接手过一个光照不均的矫正项目。原始图像左边亮右边暗,直方图有两个峰——一个在低灰度区,一个在高灰度区。这就是典型的「双峰分布」。后来我用直方图均衡化,把两个峰拉平,效果立竿见影。
直方图还有两个实用操作:
- 直方图匹配: 把一张图的直方图形状,映射到另一张图上。常用于风格迁移或光照归一化。
- 直方图反向投影: 用直方图做目标检测。比如肤色检测,先建肤色直方图,再反向投影到图像上找肤色区域。
2.3 图像滤波基础
滤波,说白了就是「卷积」。用一个小的窗口(核)在图像上滑动,每个位置做加权平均。不同的核,效果完全不同。
我按用途把常用滤波分成三类:
| 滤波类型 | 核特点 | 主要作用 |
|---|---|---|
| 均值滤波 | 所有系数相等 | 去噪,但边缘模糊严重 |
| 高斯滤波 | 中心权重高,边缘低 | 去噪,保留边缘更好 |
| 中值滤波 | 取邻域中值 | 去椒盐噪声,保边缘 |
你可能会问:做光照补偿为什么要懂滤波?因为光照不均本质上是一种「低频噪声」。你想提取光照分量,就得用低通滤波把它分离出来。后面章节我会详细讲这个思路。
代码示例,用 OpenCV 做高斯滤波:
import cv2
import numpy as np
img = cv2.imread('input.jpg')
# 高斯滤波,核大小 5x5,sigma 1.5
blurred = cv2.GaussianBlur(img, (5, 5), 1.5)
cv2.imwrite('blurred.jpg', blurred)
2.4 图像金字塔
图像金字塔,就是同一张图的不同分辨率版本。向下采样(缩小)叫高斯金字塔,向上采样(放大)叫拉普拉斯金字塔。
为什么需要金字塔?两个原因:
- 多尺度分析: 光照不均可能出现在不同尺度上。大范围阴影用低分辨率处理,局部高光用高分辨率处理。
- 加速计算: 先在小图上做粗处理,再映射回大图做精调。速度能提升好几倍。
我记得做视频实时光照补偿时,直接处理 1080p 图像根本跑不动。后来我用高斯金字塔降采样到 1/4 大小,处理完再上采样回去。帧率从 15 直接飙到 60。
pyrDown() 和 pyrUp() 是一对。向下采样前会先做高斯滤波,避免混叠。向上采样后图像会变模糊,需要配合拉普拉斯金字塔恢复细节。
下面这张图展示了图像金字塔的典型结构,以及它在光照补偿中的位置:
嗯,到这里图像基础就回顾完了。像素、色彩空间、直方图、滤波、金字塔——这五个东西是后面所有加速和补偿算法的基石。你先把它们吃透,后面讲 Retinex、同态滤波、多尺度融合时,就不会觉得突兀。