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章 知识体系 OpenCV基础 Python环境配置 图像读取/显示/保存 像素操作基础 BGR与RGB转换 💡 学习路径建议 1. 先装好环境,跑通第一个读取/显示程序 2. 理解图像本质是三维数组(H×W×C) 3. 动手修改像素值,感受「像素即数据」

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 动手练一练

光看没用,得敲代码。我建议你完成这个小练习:

  1. 读取一张自己的照片
  2. 把照片左上角100×100区域涂成蓝色
  3. 在照片中央画一个红色矩形(提示:用 cv2.rectangle())
  4. 保存修改后的图片

这个练习涵盖了本章所有核心操作。做完它,你就迈出了人像美化的第一步。