矩陣運算是圖像處理最基礎的操作之一,Python中提供了非常方便的Array對象,也就是多維數組,可以讓我們便捷地定義矩陣。下面,是我在學習過程中整理的關於np.array對象的切片操作方法,讓我們一起看看a[:,0]、a[:,1]、a[:,:,0]、a[:,:,1]、a[:,m:n]和a[:,:,m:n]都代表着什麼,希望可以對大家有點幫助~撒花
一維數組的切片操作
一維數組的切片操作和列表基本類似,我們先看結果吧:
import numpy as np
a=np.arange(24)
print("一維數組a:",a)
print("a[:]:",a[:])
print("a[4:8]:",a[4:8])
print("a[4:]:",a[4:])
print("a[:8]:",a[:8])
總結一下,對於一維數組a:
-
a[:] a中的全部元素;
-
a[m:n] a中從m下標到n-1下標的全部元素(下標從0開始,左閉右開的區間);
-
a[m:] a中從m下標到結束的全部元素;
-
a[:m] a中從0開始到n-1下標的全部元素(不包含下標爲m的元素)。
二維數組的切片操作
代碼比較簡單就不放了,直接看結果吧:
對照着結果總結一下,對於二維數組a:
-
a[m,n] a中第m行第n列的數據,下標均從0開始;
-
a[:] a中的全部元素;
-
a[:,0] a中第0列的全部元素組成的數組;
-
a[:,1] a中第1列的全部元素組成的數組;
-
a[m,:] a中第m行的全部元素組成的數組。
三維(n維)數組的切片操作
照例,看結果找規律:
擴展到更高維,可以得到,對於n維數組a:
-
a[m,n] a中第m行第n列的數據,下標均從0開始;
-
a[:] a中的全部元素;
-
a[:,n] a中第n列的全部元素組成的數組;
-
a[d:e,n] a中第d行至第e-1行(左閉右開)的第n列的全部元素組成的數組;
-
a[m,d:e] a中第m行第d列至第e-1列(左閉右開)全部元素組成的數組。
np.array切片操作在圖像處理中的實例:利用Sobel算子計算圖片梯度
用一個非常簡陋的圖(在白底上畫一個黑色的圓)來做一下梯度處理,代碼如下:
import cv2
import numpy as np
img = cv2.imread('circle.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用Sobel計算像素點x,y方向的梯度
h, w = img.shape[:2] # 提取圖片寬、高
grad = np.zeros((h, w, 2), dtype=np.float32) # 創建梯度矩陣
grad[:, :, 0] = cv2.Sobel(img, cv2.CV_16S, 1, 0, ksize=3) # 取x方向的梯度
grad[:, :, 1] = cv2.Sobel(img, cv2.CV_16S, 0, 1, ksize=3) # 取y方向的梯度
cv2.imshow('grad_x', grad[:, :, 0])
cv2.imshow('grad_y', grad[:, :, 1])
cv2.waitKey(0)
cv2.destroyAllWindows()
運行結果: