2. 环境搭建:Python环境配置、OpenCV安装、NumPy基础、Matplotlib可视化工具
说实话,很多初学者一上来就急着写代码,结果卡在环境搭建上半天出不来。我见过太多人花了两天装OpenCV,最后发现是Python版本不对。这一章,咱们就把地基打牢。
2.1 Python环境配置
我个人习惯用Anaconda来管理Python环境。为什么?因为它自带了一堆科学计算库,省得你一个个去pip。而且虚拟环境隔离得好,项目之间不会打架。
安装步骤其实就三步:
- 去Anaconda官网下载对应系统的安装包(Windows/Mac/Linux)
- 一路默认安装,但记得勾选「Add Anaconda to my PATH environment variable」
- 打开终端或Anaconda Prompt,输入
conda --version验证
验证成功后,创建一个专用环境:
conda create -n threshold_detection python=3.9
conda activate threshold_detection
嗯,这里要注意:每次打开新终端,都要先 conda activate threshold_detection。我曾经忘了激活环境,直接pip install,结果装到了base环境里,后来项目依赖全乱了。
2.2 OpenCV安装
OpenCV是咱们做阈值检测的核心工具。安装其实就一行命令:
pip install opencv-python
但这里有个坑——opencv-python 和 opencv-contrib-python 有什么区别?
| 包名 | 包含内容 | 适用场景 |
|---|---|---|
| opencv-python | 核心模块(图像读写、处理、特征检测等) | 大部分阈值检测任务,够用 |
| opencv-contrib-python | 核心模块 + 扩展模块(SIFT、SURF等) | 需要高级特征匹配时 |
咱们这门课用基础版就够了。装完之后,验证一下:
python -c "import cv2; print(cv2.__version__)"
如果输出了类似 4.8.0 的版本号,恭喜你,成了。
brew install opencv 装过,结果Python里死活import不了。后来发现brew装的是C++库,不是Python包。记住,咱们用pip。
2.3 NumPy基础
说白了,图像在计算机里就是NumPy数组。一张灰度图就是一个二维数组,每个像素值0-255。彩色图就是三维数组——高、宽、通道。
你不需要精通NumPy,但下面这几个操作必须会:
- 创建数组:
np.zeros((480, 640), dtype=np.uint8)生成一张全黑图 - 索引与切片:
img[100:200, 150:250]截取图像区域 - 类型转换:
img.astype(np.float32)做浮点运算前必须转 - 统计运算:
np.mean(img)、np.max(img)、np.where(img > 128)
举个例子,咱们手动生成一个渐变图像:
import numpy as np
# 生成一个从0到255渐变的灰度图
gradient = np.linspace(0, 255, 640, dtype=np.uint8)
gradient_img = np.tile(gradient, (480, 1))
print(gradient_img.shape) # (480, 640)
你想想看,这个 gradient_img 其实就是一张从左到右由黑变白的图像。阈值检测的本质,就是在这个数组上做条件判断。
2.4 Matplotlib可视化工具
做图像处理,光看数字不行,得看到图。Matplotlib就是咱们的眼睛。
安装:
pip install matplotlib
最常用的就是 imshow 和 subplot。我习惯这样写:
import matplotlib.pyplot as plt
import cv2
# 读取图像
img = cv2.imread('example.jpg')
# OpenCV默认是BGR,Matplotlib用RGB,必须转换
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(img_rgb)
plt.title('原图')
plt.subplot(1, 2, 2)
plt.imshow(img_rgb[:, :, 0], cmap='gray')
plt.title('红色通道')
plt.tight_layout()
plt.show()
还有一个技巧:用 plt.hist 画直方图,这对阈值选择特别有用。
plt.hist(img_rgb.ravel(), bins=256, range=[0, 256])
plt.title('灰度直方图')
plt.xlabel('像素值')
plt.ylabel('像素数量')
plt.show()
直方图能告诉你:图像的整体亮度分布如何?阈值应该选在哪个波谷?这些在后面章节会反复用到。
2.5 本章知识体系
下面这张图,把咱们这一章的核心脉络串起来了:
说白了,环境搭建就是这三板斧:Python环境管运行,NumPy管数据,OpenCV管处理,Matplotlib管展示。后面所有阈值检测的代码,都跑在这个框架上。
pip freeze > requirements.txt 导出依赖列表。