一、先想清楚:要解决什么类型的问题
在选库之前,有一个简单的问题很重要:
当前的任务,更像是"图像处理",还是"用深度学习做识别"?
-
如果主要是:读图、灰度化、滤波、边缘检测、找轮廓、做几何变换、简单目标检测等,
比如生产线缺陷检测、二维码识别、车牌定位,这一类通常会以 OpenCV / scikit-image 为主。
-
如果核心是:训练模型、做图像分类、目标检测、语义分割等,
那重点就在 TensorFlow / Keras / PyTorch 这些深度学习框架上。
-
如果刚入门,只想先试试看"摄像头抓图、识别某个简单特征",
SimpleCV 这类库会更省力一些。
下面按库来拆开说明。
二、OpenCV:图像处理的"基础设施"
OpenCV 是最常用的计算机视觉库之一,最早由 Intel 发起,现在已经支持多平台、多语言。
它更偏"传统视觉":
- 读写图片、视频
- 各种滤波、边缘检测、形态学运算
- 几何变换(旋转、缩放、透视变换)、相机标定
- 一些经典的目标检测(Haar、HOG + SVM 等)
一个非常常见的用法,是做"预处理"。比如生产线相机拍到一张产品图,先用 OpenCV:
- 去噪、增强对比度
- 做透视矫正
- 把产品裁出来,再送进深度学习模型
一个最简的例子:
python
import cv2
# 读图(灰度)
img = cv2.imread("product.jpg", cv2.IMREAD_GRAYSCALE)
# 高斯模糊 + Canny 边缘
blur = cv2.GaussianBlur(img, (5, 5), 0)
edges = cv2.Canny(blur, 50, 150)
cv2.imwrite("edges.jpg", edges)
在很多工业项目、安防摄像头项目里,OpenCV 都是默认工具。
OpenCV 官网: https://opencv.org/
三、TensorFlow 与 Keras:从训练到部署的一条链
TensorFlow 是 Google 推出的深度学习框架,支持大规模训练、分布式、移动端推理等。([freecodecamp.org][2])
Keras 原本是独立项目,现在已经整合成 tf.keras,定位是"高层 API",把深度学习开发变得简单很多。
在计算机视觉里,常见的用法大致有几类:
- 用 Keras 快速搭一个 CNN 做分类或检测原型
- 用 TensorFlow 的低层 API 做性能优化、分布式训练
- 用 TensorFlow Lite 在手机、嵌入式设备上跑模型
下边是一个非常标准的 Keras 卷积网络骨架:
python
import tensorflow as tf
from tensorflow.keras import layers, models
model = models.Sequential([
layers.Input(shape=(224, 224, 3)),
layers.Conv2D(32, (3, 3), activation="relu"),
layers.MaxPooling2D(2),
layers.Conv2D(64, (3, 3), activation="relu"),
layers.MaxPooling2D(2),
layers.Flatten(),
layers.Dense(128, activation="relu"),
layers.Dense(10, activation="softmax")
])
model.compile(
optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"]
)
在很多团队里,常见做法是:
先用 Keras 把原型跑通,再根据需要下沉到 TensorFlow 的底层接口。
TensorFlow 官网: https://www.tensorflow.org/
Keras 官网: https://keras.io/
四、PyTorch:适合频繁试验和改模型
PyTorch 由 Meta(原 Facebook)开源,特点是动态图、语法靠近普通 Python,研究圈接受度很高。([DEV Community][3])
很多最新的视觉论文和开源实现(检测、分割、生成模型),都会优先提供 PyTorch 版本。
常见特点:
- 动态计算图,方便写分支逻辑、递归结构
- 容易调试,报错堆栈比较直观
- 和 Python 科学计算生态(NumPy 等)结合紧密
一个简化的卷积网络例子:
python
import torch
import torch.nn as nn
import torch.nn.functional as F
class SmallCNN(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.conv1 = nn.Conv2d(3, 32, 3, padding=1)
self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
self.pool = nn.MaxPool2d(2)
self.fc = nn.Linear(64 * 56 * 56, num_classes)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x))) # 224 -> 112
x = self.pool(F.relu(self.conv2(x))) # 112 -> 56
x = x.view(x.size(0), -1)
return self.fc(x)
在医学影像分割、新架构探索、生成模型实验等场景里,模型经常要改来改去,PyTorch 的灵活性会比较顺手。
PyTorch 官网: https://pytorch.org/
五、scikit-image:科研和教学常用的"图像工具箱"
scikit-image 属于 SciPy 生态的一部分,更偏学术和科学计算场景。([Pixabay][1])
它的特点是:
- 接口风格统一,和 NumPy 数组配合得很好
- 文档对算法原理解释比较细,适合做实验和教学
- 功能集中在:过滤、阈值分割、边缘检测、特征提取、几何变换等
一个简单的阈值分割例子(伪代码风格):
python
from skimage import io, filters
image = io.imread("cell.png", as_gray=True)
# Otsu 自动阈值
thresh = filters.threshold_otsu(image)
binary = image > thresh
io.imsave("cell_mask.png", binary.astype("uint8") * 255)
在天文、材料科学、遥感等领域,经常可以看到
"NumPy + SciPy + scikit-image" 这种组合,用来做图像分析实验。
六、SimpleCV:适合做入门 Demo
SimpleCV 的目标比较直接:
让刚接触计算机视觉的人,可以用简单的 API 完成一些基础任务,例如:
- 打开摄像头,抓取画面
- 检测图像中的颜色、形状
- 做一些基础的特征检测、轮廓分析
优势是:
- 上手快,代码量少
- 适合课程实验、周末小玩具项目
局限也比较明显:
- 功能深度和广度都有限
- 生态和更新都不如几大主流库
- 不适合作为长期维护、复杂项目的主框架
所以在较大的项目里,SimpleCV 更适合作为"入门阶段"的工具,后面仍然要切换到 OpenCV + 深度学习框架。
七、一张图

八、真实项目里,一般不会只用一个库
很多工程实践里,更常见的是"组合拳",而不是只用一个库:
-
用 OpenCV / scikit-image 做预处理
- 读图、裁剪、去噪、矫正
- 把图像变成适合模型输入的尺寸和格式
-
用 TensorFlow / Keras / PyTorch 做推理
- 分类、检测、分割等
- 训练阶段再用一些数据增强库
-
再用 OpenCV 做结果可视化、后处理
- 在原图上画框、画 mask、写标签
- 把结果拼接成视频或叠加到 UI 中
简单说:
OpenCV 像是"与现实世界打交道的外壳",
TensorFlow / PyTorch 则是"中间的大脑",
scikit-image 负责补充一些细粒度的图像算法,
SimpleCV 更适合教学和入门练习。
九、不同阶段可以怎么选
从学习和工作路径来看,可以按阶段简单划分:
1. 入门阶段
- 用 OpenCV 学基本图像处理(灰度化、滤波、边缘、轮廓)。
- 用 Keras 做第一、第二个卷积网络项目(比如手写数字、猫狗分类)。
- 如果是教学或工作坊场景,可以用 SimpleCV 做一些快速演示。
2. 进阶阶段
- 把 OpenCV 学得更细一些,熟悉相机标定、透视变换、连通域分析等。
- 深度学习方向,选 TensorFlow + Keras 或 PyTorch 其一做主力。
- 对科研、论文复现实验有需求时,把 scikit-image 加进工具箱。
3. 实战 / 生产阶段
-
具体选哪一个深度学习框架,更多受团队技术栈影响:
- 已经有 TensorFlow / TFX 部署链路的团队,继续基于该生态更省事;
- 研究型团队或实验室,通常更偏向 PyTorch。
-
传统图像处理部分,OpenCV 仍然是主力。
-
scikit-image 可继续作为某些科研子任务的工具;SimpleCV 在这一阶段就比较少见了。
十、小结:如何快速做出一个"靠谱的选择"
选库时,可以先按这三个问题简单筛一遍:
-
任务类型:
- 传统图像处理 + 实时视频 → 重点考虑 OpenCV
- 深度学习视觉任务 → 重点考虑 TensorFlow / Keras / PyTorch
-
人员与经验:
- 团队多是数据科学背景、偏工程 → TensorFlow / Keras 容易融入现有流水线
- 团队偏研究、偏论文复现 → PyTorch 更常见
-
未来维护:
- 是否方便接入现有的部署平台、监控、日志系统
- 库本身社区是否活跃、文档是否完整([Stack Overflow][5])
整体来看,一个相对稳妥的路线是:
- 先用 OpenCV + scikit-image 把图像处理基础打牢;
- 再在 Keras / TensorFlow 或 PyTorch 上做几个完整的视觉项目;
- 最后在真实的小项目中,把这些库组合起来用一次,从采集到推理再到展示跑通一条链。
做到这一步,几大主流计算机视觉 Python 库之间的关系,大致就会变得清晰而自然。