第一课:课程导论与开发环境
各位同学好,我是这门课的主讲。今天咱们聊聊图像预处理这件事。
说实话,我刚开始做计算机视觉那会儿,也跟很多人一样——拿到一张图就急着往上跑模型。结果呢?要么效果差得离谱,要么程序直接崩掉。后来我才明白,图像预处理不是可有可无的步骤,而是整个视觉系统的地基。
为什么图像预处理这么重要?
你想想看,相机拍出来的原始图像,说白了就是一堆像素值。但这堆数字里藏着各种问题:光照不均匀、噪声干扰、对比度太低、尺寸不统一……
我曾在某个工业检测项目里吃过亏。当时客户给了一批产品图片,我直接拿YOLO去训练,结果检测精度只有60%。后来仔细一看,每张图的亮度和角度都不一样。做了直方图均衡化和归一化之后,精度直接跳到92%。这就是预处理的威力。
核心观点:预处理做得好,后续算法事半功倍;预处理偷懒,后面全是坑。
具体来说,图像预处理能帮我们解决这几类问题:
- 消除噪声:传感器热噪声、环境光干扰、传输丢包
- 增强特征:让边缘更清晰、对比度更明显
- 统一规格:所有图像尺寸、色彩空间、像素范围保持一致
- 减少计算量:降采样、ROI提取,让模型跑得更快
OpenCV是什么?为什么选它?
OpenCV,全称Open Source Computer Vision Library。说白了,它就是计算机视觉界的"瑞士军刀"。
我个人习惯用OpenCV做预处理,原因有三:
- 成熟稳定:2000年就开源了,社区庞大,踩过的坑别人都踩过了
- 接口统一:C++、Python、Java都能用,学一次到处写
- 性能强悍:底层用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。再试着保存成不同格式,对比一下文件大小。有什么问题,咱们下节课见。
一句话记住这节课:预处理不是锦上添花,而是雪中送炭。环境搭好,代码跑通,你就已经迈出了第一步。