因为在 OpenCV2 里面,所有的东西都是 numpy array 即 np.ndarray1,所以使用 opencv 剪切图像主要原理是用 ndarray 的切片。一张图片基本上都是三维数组:行,列,通道数,切片只是涉及到前两维。
选用这张图的原因是该图十分的规整。每一片的大小都是 240×375 的,这为我们探究 ndarray 切片方式提供了便利。话不多说,代码如下:
import numpy as np
import cv2
img = cv2.imread(r"C:\Users\Administrator\Desktop\players.png")
cv2.imshow("sss", img[0:375, 240:480])
最后剪切出来的图如下。
我们根据这张图分析一下 img[0:375, 240:480]
的含义1。
- 0:375 指的从竖直方向截取 0~375
- 240:480 指的是从水平方向截取 240~480
- 其中原点是图片的左上角
∣
−
−
240
,
0
−
−
−
−
−
−
−
−
−
−
−
−
>
x
|-- 240,0 ------------>x
∣−−240,0−−−−−−−−−−−−>x
∣
∣
∣
|\space \space \space \space\space \space \space \space\space \space |\space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space |
∣ ∣ ∣
∣
∣
∣
|\space \space \space \space\space \space\space \space\space \space |\space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space |
∣ ∣ ∣
∣
∣
∣
|\space \space\space \space\space \space \space \space\space \space |\space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space |
∣ ∣ ∣
∣
∣
−
−
−
−
−
−
−
−
480
,
375
|\space \space\space \space\space \space\space \space\space \space | --------480,375
∣ ∣−−−−−−−−480,375
∣
|
∣
∨
\vee
∨
y
y
y
当然我们也可以利用切片来选择我们感兴趣的区域(ROI,Region of Interest)
PS. 一开始我觉得比较令人费解的是这里 x y 是反的,但是其实这是对二维 ndarray 索引的概念没有搞清楚。二维 ndarray 索引其实和 C++/Java 里面二维数组索引是一样的,都是先找到行,再找到列。这样理解就不会感觉怪了。说的更具体一点其实是现找到第一个 axis
然后再找到第二个 axis
。axis
的概念可以参考 The Basics 的前三段。y 代表的是第一个轴,x 代表的是第二个轴,都是先找第一个轴再找第二个轴。
样例来自:https://www.cs.cmu.edu/~mrmiller/15-110/Handouts/arrays2D.pdf