第一课:课程导论与开发环境

各位同学好,我是这门课的主讲。今天咱们聊聊图像预处理这件事。

说实话,我刚开始做计算机视觉那会儿,也跟很多人一样——拿到一张图就急着往上跑模型。结果呢?要么效果差得离谱,要么程序直接崩掉。后来我才明白,图像预处理不是可有可无的步骤,而是整个视觉系统的地基

为什么图像预处理这么重要?

你想想看,相机拍出来的原始图像,说白了就是一堆像素值。但这堆数字里藏着各种问题:光照不均匀、噪声干扰、对比度太低、尺寸不统一……

我曾在某个工业检测项目里吃过亏。当时客户给了一批产品图片,我直接拿YOLO去训练,结果检测精度只有60%。后来仔细一看,每张图的亮度和角度都不一样。做了直方图均衡化和归一化之后,精度直接跳到92%。这就是预处理的威力

核心观点:预处理做得好,后续算法事半功倍;预处理偷懒,后面全是坑。

具体来说,图像预处理能帮我们解决这几类问题:

  • 消除噪声:传感器热噪声、环境光干扰、传输丢包
  • 增强特征:让边缘更清晰、对比度更明显
  • 统一规格:所有图像尺寸、色彩空间、像素范围保持一致
  • 减少计算量:降采样、ROI提取,让模型跑得更快

OpenCV是什么?为什么选它?

OpenCV,全称Open Source Computer Vision Library。说白了,它就是计算机视觉界的"瑞士军刀"。

我个人习惯用OpenCV做预处理,原因有三:

  1. 成熟稳定:2000年就开源了,社区庞大,踩过的坑别人都踩过了
  2. 接口统一:C++、Python、Java都能用,学一次到处写
  3. 性能强悍:底层用C++优化,处理视频流也不卡

我记得刚入行时,有个师兄跟我说:"别自己造轮子,OpenCV里什么都有。"当时不信,后来自己写了个高斯滤波,跑起来慢得跟蜗牛似的。换成OpenCV的GaussianBlur,速度提升了几十倍。嗯,从那以后我就老实了。

环境搭建:Python + OpenCV

搭建环境其实很简单。我建议你用Python 3.8以上版本,配合pip安装。

小提示:如果你用的是Anaconda,建议新建一个虚拟环境,避免包冲突。

安装命令就一行:

pip install opencv-python opencv-contrib-python

这里解释一下:opencv-python是核心库,opencv-contrib-python包含扩展模块(比如SIFT、SURF这些专利算法)。如果你只是做基础预处理,装第一个就够了。

验证安装是否成功,可以跑这段代码:

import cv2
print(cv2.__version__)

如果输出版本号(比如4.8.0),说明环境没问题。

注意:我曾经遇到过pip安装后import报错的情况。多半是Python版本不兼容,或者系统缺少VC++运行库。Windows用户建议装Visual Studio Build Tools,Linux用户检查一下libgl1-mesa-glx。

第一个程序:读取并显示图像

好了,环境搭好了,咱们写第一个程序。别紧张,就几行代码。

import cv2

# 读取图像
img = cv2.imread('test.jpg')

# 检查是否读取成功
if img is None:
    print("图片没找到,检查路径!")
else:
    # 显示图像
    cv2.imshow('My First Image', img)
    # 等待按键
    cv2.waitKey(0)
    # 关闭窗口
    cv2.destroyAllWindows()

这段代码做了三件事:

  • imread:从硬盘加载图像到内存,返回一个NumPy数组
  • imshow:创建一个窗口,把图像显示出来
  • waitKey(0):等待用户按键,0表示无限等待

这里有个坑,我当年踩过——OpenCV读取图像默认是BGR格式,不是RGB。如果你用matplotlib显示,颜色会偏蓝。解决办法很简单:

img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

关于路径问题,我再多说一句。我曾经在项目里把图片放在子文件夹里,结果imread一直返回None。排查了半天,发现是相对路径写错了。建议初学者用绝对路径,或者把图片放在和.py文件同一个目录下。

图像的基本属性

图像读进来之后,咱们可以看看它长什么样:

import cv2

img = cv2.imread('test.jpg')

# 获取图像属性
height, width, channels = img.shape
print(f"图像尺寸:{width} x {height}")
print(f"通道数:{channels}")
print(f"数据类型:{img.dtype}")
print(f"像素总数:{img.size}")

输出大概是这样的:

属性 说明 示例值
shape 高度、宽度、通道数 (480, 640, 3)
dtype 像素数据类型 uint8
size 像素总数 921600

你想想看,一张640x480的彩色图,就有92万个像素点。每个像素点又包含B、G、R三个值。这就是为什么图像处理这么吃计算资源。

保存处理后的图像

处理完了,总得保存下来吧?用imwrite就行:

cv2.imwrite('output.jpg', img)

你可以指定保存格式,OpenCV会根据文件后缀自动判断。比如.jpg.png.bmp都支持。

小技巧:保存JPEG时可以控制质量,比如cv2.imwrite('output.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 95])。数值范围0-100,越大质量越好,文件也越大。

本章小结

这一课咱们聊了:

  • 图像预处理为什么重要——它是视觉系统的地基
  • OpenCV是什么——计算机视觉的瑞士军刀
  • 环境怎么搭——pip install一行搞定
  • 第一个程序怎么写——读取、显示、保存

说实话,这些内容看起来简单,但基础打牢了,后面学起来才顺手。下一课咱们会深入聊聊图像的色彩空间和通道操作,到时候你会发现,原来一张图里藏着这么多秘密。

课后你可以试试:找一张自己的照片,用OpenCV读进来,看看它的shape和dtype。再试着保存成不同格式,对比一下文件大小。有什么问题,咱们下节课见。

一句话记住这节课:预处理不是锦上添花,而是雪中送炭。环境搭好,代码跑通,你就已经迈出了第一步。