2. 环境搭建:Python环境配置、OpenCV安装、NumPy基础、Matplotlib可视化工具

说实话,很多初学者一上来就急着写代码,结果卡在环境搭建上半天出不来。我见过太多人花了两天装OpenCV,最后发现是Python版本不对。这一章,咱们就把地基打牢。

2.1 Python环境配置

我个人习惯用Anaconda来管理Python环境。为什么?因为它自带了一堆科学计算库,省得你一个个去pip。而且虚拟环境隔离得好,项目之间不会打架。

我的建议: 别用系统自带的Python,也别直接装最新版。阈值检测这个课程,Python 3.8-3.10是最稳的区间。我踩过3.11的坑,有些库还没跟上。

安装步骤其实就三步:

  1. 去Anaconda官网下载对应系统的安装包(Windows/Mac/Linux)
  2. 一路默认安装,但记得勾选「Add Anaconda to my PATH environment variable」
  3. 打开终端或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 的版本号,恭喜你,成了。

避坑指南: 我曾经在Mac上用 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()
核心要点: OpenCV读图是BGR顺序,Matplotlib显示是RGB顺序。不转换的话,图像颜色会偏蓝偏黄。我刚开始学的时候,调了半天以为是代码写错了,结果就是颜色通道顺序的问题。

还有一个技巧:用 plt.hist 画直方图,这对阈值选择特别有用。

plt.hist(img_rgb.ravel(), bins=256, range=[0, 256])
plt.title('灰度直方图')
plt.xlabel('像素值')
plt.ylabel('像素数量')
plt.show()

直方图能告诉你:图像的整体亮度分布如何?阈值应该选在哪个波谷?这些在后面章节会反复用到。

2.5 本章知识体系

下面这张图,把咱们这一章的核心脉络串起来了:

环境搭建知识体系 Python 环境 OpenCV NumPy Matplotlib 图像读写 颜色空间转换 数组创建/切片 统计运算 imshow/subplot 直方图 核心逻辑 图像 → NumPy数组 → OpenCV处理 → Matplotlib可视化

说白了,环境搭建就是这三板斧:Python环境管运行,NumPy管数据,OpenCV管处理,Matplotlib管展示。后面所有阈值检测的代码,都跑在这个框架上。

个人经验: 我建议你把这三个库的版本号记下来。以后项目复现时,版本不一致是最头疼的问题。可以用 pip freeze > requirements.txt 导出依赖列表。