第一章 图像采集与预处理:从相机到可用图像

大家好,我是你们的老朋友。今天咱们聊聊机器视觉闭环里的第一步——图像采集与预处理。说白了,就是怎么把相机里的原始数据,变成算法能用的干净图像。这一步要是做不好,后面再牛的算法也白搭。我见过太多项目,最后排查问题,发现源头就在图像质量上。

1. 相机SDK调用与图像获取

拿到一台工业相机,第一件事不是急着拍照,而是调通它的SDK。每个厂家都有自己的SDK,比如海康、大华、Basler。我个人习惯,先把SDK里的示例程序跑一遍,确认相机能正常出图。

调用SDK的核心流程其实大同小异:

  • 枚举设备:找到连在电脑上的相机
  • 打开设备:建立连接
  • 设置参数:曝光、增益、帧率等
  • 开始采集:启动图像流
  • 获取图像:从缓冲区取一帧
  • 停止采集:关闭流

这里有个坑,我曾经踩过。有些相机SDK默认是阻塞模式,你调用取图函数时,它会一直等到下一帧到来。如果相机没触发或者帧率太低,程序就卡死了。所以我建议,一定要设置超时时间,或者用非阻塞模式。

核心要点:SDK调用不是简单的“打开-拍照-关闭”。你得考虑异常处理,比如相机掉线、缓冲区溢出。我一般会在取图循环里加个计数器,连续取不到图就报警。

2. 图像格式转换:Bayer、RGB、灰度

相机传感器拍出来的原始数据,通常是Bayer格式。说白了,每个像素只记录一种颜色(红、绿或蓝),排列成棋盘格。你得通过插值算法,把它变成完整的RGB图像。

常见的Bayer排列有四种:BGGR、GBRG、GRBG、RGGB。我刚开始做视觉时,就搞错过排列顺序,结果图像颜色全乱套了。后来我学乖了,先拍一张白纸,看看颜色对不对。

格式转换的流程:

  1. Bayer到RGB:用双线性插值或更高级的算法(如自适应插值)
  2. RGB到灰度:加权平均,公式是 Gray = 0.299R + 0.587G + 0.114B

你想想看,为什么灰度转换要用这个权重?因为人眼对绿色最敏感,对蓝色最不敏感。这个公式是ITU-R BT.601标准里定的,咱们直接拿来用就行。

小技巧:如果只是做边缘检测或二值化,直接用Bayer格式的绿色通道当灰度图,效果也不差。因为绿色通道的采样率是红色和蓝色的两倍,信息更丰富。

3. 图像滤波:高斯滤波与中值滤波

图像里总有噪声,比如传感器热噪声、环境光干扰。滤波就是把这些噪声去掉,同时尽量保留边缘细节。

高斯滤波:说白了就是加权平均。每个像素的值,由它周围像素的加权和决定,权重服从高斯分布。它适合去除高斯噪声,比如传感器噪声。

我一般用5x5的高斯核,sigma取1.0左右。sigma太小,滤波效果不明显;sigma太大,图像会变模糊,边缘也没了。

// 高斯滤波示例(C++)
cv::GaussianBlur(src, dst, cv::Size(5, 5), 1.0);

中值滤波:取邻域内所有像素的中位数,代替中心像素。它对椒盐噪声(黑白点)特别有效。我记得有一次做PCB检测,图像上全是白点,用高斯滤波怎么都去不掉,换成中值滤波,一下就干净了。

中值滤波的核大小一般是奇数,比如3x3、5x5。核越大,去噪越强,但图像细节损失也越大。

注意:中值滤波的计算量比高斯滤波大,尤其是核尺寸大的时候。实时系统里要权衡一下。我曾经在嵌入式平台上用7x7的中值滤波,帧率直接掉了一半。

4. 图像增强:直方图均衡化与伽马校正

有时候图像太暗或太亮,细节都藏在阴影或高光里。这时候就需要图像增强,把对比度拉开。

直方图均衡化:把图像的灰度直方图,从集中分布拉伸成均匀分布。说白了,就是让亮的更亮,暗的更暗,中间层次更丰富。

但要注意,全局直方图均衡化可能会放大噪声。我更喜欢用自适应直方图均衡化(CLAHE),它把图像分成小块,每块单独做均衡化,效果更自然。

// CLAHE示例(C++)
cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE(2.0, cv::Size(8, 8));
clahe->apply(src, dst);

伽马校正:通过非线性变换,调整图像的亮度。公式是 O = I^γ,其中γ是伽马值。

  • γ < 1:图像变亮,暗部细节更明显
  • γ > 1:图像变暗,亮部细节更明显
  • γ = 1:无变化

我一般用γ=0.5来提亮暗部,或者γ=2.0来压暗过曝区域。具体值得根据实际图像调试,没有万能参数。

经验之谈:图像增强不是越强越好。过度增强会让图像看起来不自然,甚至引入伪影。我通常会在增强前后对比一下,确保没有丢失关键信息。

本章知识体系

下面这张图,概括了图像采集与预处理的完整流程。从相机SDK获取原始数据,经过格式转换、滤波去噪、增强对比度,最终得到可用于算法分析的干净图像。

图像采集与预处理流程 相机SDK调用 格式转换 图像滤波 图像增强 枚举设备 设置参数 获取图像 Bayer→RGB RGB→灰度 高斯滤波 中值滤波 直方图均衡化 伽马校正 输出:干净、增强后的图像

嗯,这一章的内容就到这里。图像采集与预处理是视觉系统的基石,看似简单,但细节很多。我建议你动手试试,拿一台相机,从SDK调用开始,一步步走到增强输出。遇到问题别怕,多调试几次就熟了。

专注资料整理