因爲在 OpenCV2 裏面,所有的東西都是 numpy array 即 np.ndarray,所以使用 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]
的含義。
0:375 指的從豎直方向截取 0~375
240:480 指的是從水平方向截取 240~480
其中原點是圖片的左上角
∣ − − 240 , 0 − − − − − − − − − − − − > x |-- 240,0 ------------>x ∣ − − 2 4 0 , 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 ∣ ∣ − − − − − − − − 4 8 0 , 3 7 5
∣ | ∣
∨ \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