3、OpenCV基础与环境搭建:OpenCV简介、Python环境配置、图像读取/显示/保存、像素操作基础
3.1 为什么是OpenCV?
做图像处理,OpenCV几乎是绕不开的工具。我入行那会儿,最早接触的是Matlab,后来转到Python,发现OpenCV才是工业界的标配。说白了,它就是一个开源的计算机视觉库,C++写的,但给Python留了非常友好的接口。
你想想看,从摄像头读取视频流、做实时人脸检测、到图像滤波、色彩空间转换,OpenCV全包了。我个人习惯把它叫做「视觉瑞士军刀」——功能多,而且稳定。
核心优势:
- 跨平台:Windows、macOS、Linux、Android、iOS,一套代码到处跑
- 性能高:底层C++优化,处理1080p图像毫秒级响应
- 生态全:2500+算法,从基础操作到深度学习推理全覆盖
- 社区大:遇到坑,StackOverflow上基本都有答案
3.2 Python环境配置
嗯,这里要注意。很多初学者卡在环境配置上,其实没那么复杂。我建议用虚拟环境,别把包装到系统Python里,不然以后项目多了会乱。
3.2.1 安装Python
推荐Python 3.8到3.11版本。太新的版本有些旧版OpenCV可能不兼容。我曾经踩过这个坑——装了Python 3.12,结果某个旧项目死活装不上opencv-python,最后降级才解决。
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| Python | 3.8 - 3.11 | 稳定,兼容性好 |
| pip | 最新版 | 包管理工具 |
| opencv-python | 4.8.x 或 4.9.x | 核心库 |
| numpy | 1.24.x 或更新 | 图像本质是矩阵 |
3.2.2 安装OpenCV
一行命令搞定:
pip install opencv-python numpy
如果你想用OpenCV的GUI功能(比如显示图像窗口),建议再装一个:
pip install opencv-contrib-python
小提示: 国内用户如果下载慢,可以加镜像源:pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
3.2.3 验证安装
打开Python交互环境,输入:
import cv2
print(cv2.__version__)
如果输出版本号,比如 4.9.0,那就成了。
3.3 图像读取、显示与保存
这部分是基本功。我刚开始做项目时,经常在读取路径上翻车——中文路径、反斜杠、文件不存在,各种问题。后来养成习惯,一律用路径或 os.path 拼接。
3.3.1 读取图像
import cv2
# 读取图像
img = cv2.imread('photo.jpg')
# 检查是否读取成功
if img is None:
print("图片没找到,检查路径!")
else:
print(f"图像尺寸:{img.shape}")
cv2.imread() 默认以BGR格式读取,不是RGB。这个坑我当年栽过——用OpenCV读图,用matplotlib显示,结果颜色全不对。原因就是OpenCV用BGR,matplotlib用RGB。
3.3.2 显示图像
cv2.imshow('窗口标题', img)
cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows()
waitKey(0) 表示无限等待,按任意键关闭窗口。如果你想让窗口自动关闭,可以设置毫秒数,比如 waitKey(3000) 等3秒。
注意: 在Jupyter Notebook里,cv2.imshow() 可能不好使。建议用 matplotlib 或 cv2_imshow()(Google Colab专用)。
3.3.3 保存图像
cv2.imwrite('output.jpg', img)
就这么简单。你可以指定保存格式,OpenCV会根据文件后缀自动判断。比如 .png 是无损压缩,.jpg 是有损压缩。
3.4 像素操作基础
图像是什么?说白了就是一个多维数组。一张彩色图片,在OpenCV里就是 height × width × 3 的矩阵,3个通道对应B、G、R。
3.4.1 访问像素值
# 获取(100, 200)位置的像素值
(b, g, r) = img[100, 200]
print(f"B:{b}, G:{g}, R:{r}")
# 只获取蓝色通道
b_value = img[100, 200, 0]
索引顺序是 [行, 列, 通道]。通道索引:0=蓝,1=绿,2=红。
3.4.2 修改像素值
# 把(100, 200)位置的像素设为红色
img[100, 200] = (0, 0, 255)
# 批量修改:把左上角50x50区域设为绿色
img[0:50, 0:50] = (0, 255, 0)
我在做证件照背景替换时,就是通过遍历像素、判断颜色范围来抠图的。虽然现在有AI抠图,但理解像素级操作,对后面学色彩迁移很有帮助。
3.4.3 图像属性
print(f"形状: {img.shape}") # (高, 宽, 通道数)
print(f"像素数: {img.size}") # 高×宽×通道
print(f"数据类型: {img.dtype}") # 通常是uint8
3.5 本章知识体系
下面这张图,帮你理清本章的核心脉络:
3.6 避坑指南
我曾经踩过的坑:
- 路径问题:
imread()不会报错,只返回None。所以一定要加if img is None检查 - 颜色混乱:OpenCV默认BGR,用matplotlib显示前要转换:
cv2.cvtColor(img, cv2.COLOR_BGR2RGB) - 数据类型:像素值是
uint8(0-255),做加减法时注意溢出。比如img + 50会溢出,要用cv2.add() - 窗口卡死:
imshow()后必须跟waitKey(),否则窗口无响应
3.7 动手练一练
光看没用,得敲代码。我建议你完成这个小练习:
- 读取一张自己的照片
- 把照片左上角100×100区域涂成蓝色
- 在照片中央画一个红色矩形(提示:用
cv2.rectangle()) - 保存修改后的图片
这个练习涵盖了本章所有核心操作。做完它,你就迈出了人像美化的第一步。