1.5 NumPy 与图像数组
总目录:1.1 OpenCV介绍与学习路线 | 第一章:认识图像与跑通流程 | 编号:1.5
← 上一节:1.4 视频与摄像头 | 下一节:2.1 颜色空间与通道 →
1.5 NumPy 与图像数组
OpenCV 的 Python 接口把图像和点集交给 NumPy 管理。你不必先学完整本 NumPy,但要会看形状、切片和重排,否则一遇到 (N, 1, 2) 就会开始怀疑人生。
一、为什么 OpenCV 总和 NumPy 一起出现
import cv2
import numpy as np
image = cv2.imread("image.jpg")
print(type(image)) # numpy.ndarray
OpenCV 底层主要由 C++ 实现。NumPy 数组提供连续、规则的数值存储,OpenCV 可以高效读取它;大多数重活仍在优化后的底层代码中完成,不是 Python 一像素一像素慢慢循环。
二、创建图像数组
创建黑色灰度图:
gray = np.zeros((480, 640), dtype=np.uint8)
创建黑色彩色图:
canvas = np.zeros((480, 640, 3), dtype=np.uint8)
创建与现有图像同形状的空白图:
blank = np.zeros_like(image)
创建形态学核:
kernel = np.ones((5, 5), dtype=np.uint8)
三、切片:裁剪和局部赋值
切片仍然按 [y, x]:
roi = image[100:300, 200:500]
# y 范围 x 范围
给一块区域涂成蓝色:
image[100:300, 200:500] = (255, 0, 0) # BGR
只取蓝色通道:
blue = image[:, :, 0]
- 第一个
::所有行; - 第二个
::所有列; 0:第 0 个通道,也就是 B。
四、轮廓点为什么是 (N, 1, 2)
findContours 返回的单个轮廓常见形状是 (N, 1, 2):
N:一共有多少个点
1:OpenCV 保留的中间维度
2:每个点的 x、y
直观看起来是:
[
x0, y0,
x1, y1,
x2, y2,
]
做坐标计算时常改成 (N, 2):
points = contour.reshape(-1, 2)
需要恢复给某些 OpenCV 接口时:
contour_again = points.reshape(-1, 1, 2)
五、axis、reshape 和点坐标
假设四个点:
points = np.array([
[10, 20],
[80, 15],
[85, 60],
[12, 70],
], dtype=np.float32)
每一行内部求和:
sums = points.sum(axis=1) # x + y
axis=1 可以理解为“对每一行里的列动手”;axis=0 则是沿行方向汇总每一列。
取所有 x 与所有 y:
xs = points[:, 0]
ys = points[:, 1]
找最小值所在点:
leftmost = points[np.argmin(xs)]
topmost = points[np.argmin(ys)]
数组形状速查
| 形状 | 常见含义 |
|---|---|
(H, W) |
灰度或二值图 |
(H, W, 3) |
BGR 彩色图 |
(N, 2) |
普通二维点集 |
(N, 1, 2) |
OpenCV 轮廓点集 |
(1, N, 4) |
findContours 的层级数组 |
这几个形状会贯穿后面的轮廓章节。暂时不用背,遇到时先 print(array.shape),它往往比盯着报错猜半天更诚实。
← 上一节:1.4 视频与摄像头 | 下一节:2.1 颜色空间与通道 →
留言区
不收集任何个人信息;昵称只绑定浏览器里的随机 Cookie。