图像预处理基础:灰度化、直方图均衡化、高斯滤波、中值滤波、图像增强实战

各位同学,欢迎来到第四讲。今天咱们聊聊图像预处理。

说实话,在工业视觉定位这个领域,我踩过最大的坑就是「算法调了半天,最后发现是图像质量不行」。你想想看,一张糊掉的图,再牛的算法也白搭。所以,预处理这步,千万别小看。

4.1 灰度化:扔掉颜色,保留灵魂

工业相机拍出来的图,大多是彩色的。但咱们做定位,其实不太需要颜色信息。为什么?因为灰度图计算量小,而且边缘信息更纯粹。

我习惯用加权平均法做灰度化。说白了,就是把RGB三个通道按一定比例混合。OpenCV里默认的权重是:

Gray = 0.299 * R + 0.587 * G + 0.114 * B

这个比例怎么来的?其实是对人眼视觉特性的模拟。人眼对绿色最敏感,对蓝色最不敏感。所以绿色权重最高,蓝色最低。

我的经验: 如果场景里红色物体特别多,可以适当调高R通道的权重。我在做PCB板定位时就这么干过,效果立竿见影。

4.2 直方图均衡化:让暗的地方亮起来

直方图均衡化,说白了就是「拉伸」图像的灰度分布。让原本集中在某个小区域的灰度值,均匀地铺满整个0-255范围。

为什么要做这个?举个例子。你拍一张金属零件,光照不均匀,有的地方亮得刺眼,有的地方黑得看不见。这时候直方图均衡化就派上用场了。

import cv2
import numpy as np

# 读取灰度图
img = cv2.imread('part.jpg', 0)
# 直方图均衡化
equ = cv2.equalizeHist(img)
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Equalized', equ)

不过要注意,直方图均衡化不是万能的。我曾经在一个项目中,对一张低对比度的图像做均衡化,结果噪声也被放大了。嗯,这里要记住:均衡化会增强对比度,但也会增强噪声。

避坑指南: 如果图像本身质量很差,先做去噪,再做均衡化。顺序别搞反了。

4.3 高斯滤波:温柔的模糊

高斯滤波,我愿称之为「最温柔的模糊」。它不像均值滤波那样粗暴地取平均,而是根据像素距离中心的远近,赋予不同的权重。

为什么叫「高斯」?因为权重分布符合高斯函数。离中心越近,权重越大;越远,权重越小。这样处理后的图像,边缘保留得更好。

# 高斯滤波,核大小5x5,标准差1.5
blurred = cv2.GaussianBlur(img, (5, 5), 1.5)

核大小和标准差怎么选?我一般这样试:先固定核大小,调标准差;或者固定标准差,调核大小。工业场景下,5x5的核,标准差1.0-2.0,基本够用。

核心要点: 高斯滤波适合去除高斯噪声,比如传感器热噪声。但如果是椒盐噪声(黑白点),它就不太行了。

4.4 中值滤波:专治椒盐噪声

中值滤波的思路很简单:把窗口内的像素排序,取中间值代替中心像素。你想想看,如果图像里有个白点(椒盐噪声),排序后它要么在开头要么在结尾,中间值肯定不是它。所以中值滤波去椒盐噪声特别有效。

# 中值滤波,核大小3x3
median = cv2.medianBlur(img, 3)

核大小一般取奇数:3、5、7。我建议从3开始试,效果不够再加大。核太大,图像会变得模糊,细节丢失。

我记得有一次做晶圆定位,图像上全是细小的白点。高斯滤波搞不定,换成中值滤波,一下就干净了。从那以后,我遇到黑白噪声,第一反应就是中值滤波。

4.5 图像增强实战:组合拳才是王道

好了,前面讲了几个基础操作。但实际项目中,很少只用一种方法。我给大家总结一套常用的预处理流程:

  1. 灰度化:彩色图转灰度,减少计算量
  2. 中值滤波:去除椒盐噪声
  3. 高斯滤波:平滑图像,去除高斯噪声
  4. 直方图均衡化:增强对比度

这套流程我用了好几年,在大多数工业场景下都管用。但也不是绝对的。比如有些场景需要保留边缘细节,那滤波的核就要小一点。

def preprocess_pipeline(img):
    # 1. 灰度化
    if len(img.shape) == 3:
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    else:
        gray = img
    
    # 2. 中值滤波去椒盐噪声
    denoised = cv2.medianBlur(gray, 3)
    
    # 3. 高斯滤波平滑
    smoothed = cv2.GaussianBlur(denoised, (5, 5), 1.2)
    
    # 4. 直方图均衡化增强对比度
    enhanced = cv2.equalizeHist(smoothed)
    
    return enhanced

我的建议: 别死记硬背这套流程。每个项目都要根据实际情况调整。比如光照均匀的场景,可以跳过直方图均衡化;噪声少的场景,滤波可以轻一点。

4.6 总结与思考

图像预处理,说白了就是「把烂图变好图」的过程。灰度化扔掉颜色,直方图均衡化拉伸对比度,高斯滤波温柔去噪,中值滤波专治椒盐噪声。组合起来用,效果更好。

最后留个思考题:如果图像里既有高斯噪声又有椒盐噪声,你会先做哪个滤波?为什么?

下节课咱们聊边缘检测,那是定位算法的核心。到时候见。

课后练习: 找一张工业零件图片,分别用高斯滤波和中值滤波处理,对比效果。再试试不同的核大小,看看对边缘的影响。