contribute上次修改:2026-09-29

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。