【Python基础】Array对象的切片操作

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

运行结果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章