矩阵运算是图像处理最基础的操作之一,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()
运行结果: