2. 图像基础回顾:像素与色彩空间、图像直方图、图像滤波基础、图像金字塔

好,咱们正式开始啃图像预处理这块硬骨头。在动手写加速代码之前,我建议先把地基夯实。你想想看,如果连像素怎么存、颜色怎么表示都不清楚,后面做光照补偿很容易跑偏。

这一节我带你快速过一遍四个核心概念。都是老生常谈的东西,但我会结合项目里踩过的坑来讲。嗯,保证让你有新的收获。

2.1 像素与色彩空间

先说像素。一张数字图像,说白了就是一个二维数组。每个格子就是一个像素,里面存着颜色信息。灰度图每个像素只有一个值,范围 0~255,0 是黑,255 是白。彩色图呢,每个像素有三个通道,比如 RGB。

我个人习惯把像素理解成「最小的信息单元」。你在做光照补偿时,本质上就是在调整每个像素的亮度值。这个认知很重要。

核心概念: 像素值是离散的整数,范围 [0, 255]。超出这个范围的值在显示时会被截断。

色彩空间这块,我重点说三个你一定会用到的:

色彩空间 通道含义 适用场景
RGB 红、绿、蓝 显示、相机原始输出
HSV 色调、饱和度、明度 光照补偿、颜色分割
Lab 亮度、a 通道、b 通道 颜色距离计算、图像增强

为什么光照补偿常用 HSV 或 Lab?因为这两个空间把「亮度」单独拎出来了。你只动亮度通道,颜色就不会偏。我在做工业质检项目时,一开始直接在 RGB 上调亮度,结果产品颜色全变了,被产线负责人骂了一顿。后来换成 HSV,只调 V 通道,问题就解决了。

小技巧: OpenCV 中默认是 BGR 顺序,不是 RGB。转 HSV 时记得用 cv2.COLOR_BGR2HSV,别搞错了。

2.2 图像直方图

直方图是什么?就是统计每个像素值出现了多少次。横轴是像素值 0~255,纵轴是像素个数。它能直观反映一张图的明暗分布。

举个例子。一张过暗的图像,直方图会集中在左边(低像素值区域)。过亮的图,直方图集中在右边。正常曝光的图,直方图分布比较均匀。

我曾经接手过一个光照不均的矫正项目。原始图像左边亮右边暗,直方图有两个峰——一个在低灰度区,一个在高灰度区。这就是典型的「双峰分布」。后来我用直方图均衡化,把两个峰拉平,效果立竿见影。

注意: 全局直方图均衡化容易放大噪声。尤其是暗区,噪声会被明显增强。我建议先做局部均衡化,或者用 CLAHE(限制对比度自适应直方图均衡化)。

直方图还有两个实用操作:

  • 直方图匹配: 把一张图的直方图形状,映射到另一张图上。常用于风格迁移或光照归一化。
  • 直方图反向投影: 用直方图做目标检测。比如肤色检测,先建肤色直方图,再反向投影到图像上找肤色区域。

2.3 图像滤波基础

滤波,说白了就是「卷积」。用一个小的窗口(核)在图像上滑动,每个位置做加权平均。不同的核,效果完全不同。

我按用途把常用滤波分成三类:

滤波类型 核特点 主要作用
均值滤波 所有系数相等 去噪,但边缘模糊严重
高斯滤波 中心权重高,边缘低 去噪,保留边缘更好
中值滤波 取邻域中值 去椒盐噪声,保边缘

你可能会问:做光照补偿为什么要懂滤波?因为光照不均本质上是一种「低频噪声」。你想提取光照分量,就得用低通滤波把它分离出来。后面章节我会详细讲这个思路。

避坑指南: 滤波核大小必须是奇数。3×3、5×5、7×7 都行。偶数核会有偏移,结果不对。我曾经因为这个 bug 查了一下午。

代码示例,用 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。

实现要点: OpenCV 的 pyrDown() 和 pyrUp() 是一对。向下采样前会先做高斯滤波,避免混叠。向上采样后图像会变模糊,需要配合拉普拉斯金字塔恢复细节。

下面这张图展示了图像金字塔的典型结构,以及它在光照补偿中的位置:

图像金字塔与光照补偿流程 原始图像 (Level 0) 高斯金字塔 L1 高斯金字塔 L2 光照分量估计 在低分辨率上 提取光照分量 减少计算量 拉普拉斯金字塔 细节恢复 用拉普拉斯金字塔 保留高频细节 避免过度平滑 光照补偿结果 流程:原始图像 → 高斯金字塔降采样 → 光照估计 → 拉普拉斯金字塔上采样 → 细节融合 → 输出

嗯,到这里图像基础就回顾完了。像素、色彩空间、直方图、滤波、金字塔——这五个东西是后面所有加速和补偿算法的基石。你先把它们吃透,后面讲 Retinex、同态滤波、多尺度融合时,就不会觉得突兀。