open cv2学习(二):Numpy模块介绍以及图像的创建
程序员文章站
2022-05-30 10:15:58
...
一、Numpy(Numerical Python)
是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。使用前需导入numpy模块
二、相关方法
(1)创建矩阵
import numpy as np # 导入模块
a1 = np.array([1, 3, 2]) # 创建一维array对象
# 创建一个2 x 3 矩阵 , 输入参数实际为列表或元组,列表或元组内部元素又是列表或元组数值
a2 = np.array([1, 3, 2], [4, 3, 6]) # 创建二维array对象
(2)矩阵元素获取
A、获取矩阵的行数和列数
size = a1.shape() # 返回元组(1, 0)
B、获取一维矩阵的第三个元素
b1 = a1[2]
C、获取二维矩阵的第二行
b2 = a2[1] 或 b2 = a2[1, ] 或 b2 = a2[1, :]
D、获取二维矩阵的第二列
b3 = a2[:, 1] # 注:返回值为行向量形式
E、获取二维矩阵的第1,2行的第3,4两列
b4 = a2[0:2, 2:4]
F、获取二维矩阵的第二行第三个元素
b3 = a2[1, 2]
(3)按条件截取 ------按条件截取其实是在[](方括号)中传入自身的布尔语句
import numpy as np
a3 = np.array([[1, 3, 2], [4, 3, 6], [7,5,3]])
c1 = a3 > 2
print(c1)
# 返回布尔值矩阵
[[False True False]
[ True True True]
[ True True True]]
c2 = a3[a3 > 2]
print(c2)
# 返回满足条件的一维列表
[3 4 3 6 7 5 3]
(4)矩阵的合并
按行合并-----np.hstack([矩阵1, 矩阵2]) 或 np.hstack((矩阵1, 矩阵2))
按列合并-----np.vstack([矩阵1, 矩阵2]) 或 np.vstack((矩阵1, 矩阵2))
矩阵合并也可用concatenate方法
np.concatenate( (矩阵1, 矩阵2), axis=0 ) 等价于 np.vstack( (矩阵1, 矩阵2) )
np.concatenate( (矩阵1, 矩阵2), axis=1 ) 等价于 np.hstack( (矩阵1, 矩阵2) )
import numpy as np
a1 = np.array([[7, 5, 2], [4, 2, 5]])
a2 = np.array([[1, 3, 2], [4, 3, 6]])
h = np.hstack([a1, a2]) 或 h = np.hstack((a1, a2))# 按行合并
print(h)
#返回
[[7 5 2 1 3 2]
[4 2 5 4 3 6]]
v = np.vstack([a1, a2]) 或 h = np.vstack((a1, a2))# 按列合并
print(v)
#返回
[[7 5 2]
[4 2 5]
[1 3 2]
[4 3 6]]
(5)通过函数常见矩阵
A、通过linspace(a,b,c)方法创建等差数列,首位为a,末位为b,包含c个元素的等差数列
a1 = np.linspace(2, 10, 5) # 返回[ 2. 4. 6. 8. 10.]
B、通过logspace(a,b,c)方法创建等比数列,首位为a^2, 末位为b^5, 包含c个元素的等比数列
a2 = np.logspace(2, 5, 4) # 返回[ 100. 1000. 10000. 100000.]
C、通过ones方法创建全1矩阵
a3 = np.ones(3,4) # 创建3*4的全 1 矩阵
D、通过zeros方法创建全0矩阵
zeros(shape, dtype=float, order='C')
shape:为 H * W *3,即 高度 * 宽度 * 3通道 或者 行数 * 列数 *3通道
返回:返回来一个给定形状和类型的用0填充的数组;
a3 = np.zeros(3,4) # 创建3*4的全 0 矩阵
E、通过eye方法创建单位矩阵
a3 = np.eye(3,4) # 创建3*4的单位矩阵
F、通过fromstring方法将字符串转换成array对象,可以将字符批量转换成ASCII码
a = "abcdef"
b = np.fromstring(a,dtype=np.int8) # 因为一个字符为8为,所以指定dtype为np.int8
print(b) # 返回 [ 97 98 99 100 101 102]
G、通过fromfunction方法根据行号和列号生成矩阵
def f1(i,j):
return i+j
a = np.fromfunction(func,(5,6)) # 第一个参数为指定函数,第二个参数为列表list或元组tuple,说明矩阵的大小
print(a)
# 返回
[[ 0. 1. 2. 3. 4. 5.]
[ 1. 2. 3. 4. 5. 6.]
[ 2. 3. 4. 5. 6. 7.]
[ 3. 4. 5. 6. 7. 8.]
[ 4. 5. 6. 7. 8. 9.]]
三、矩阵运算 (对每个元素的运算)
-
np.sin(a)-----对矩阵a中的每个元素取正弦, sin(x)
-
np.cos(a)-----对矩阵a中的每个元素取余弦, cos(x)
-
np.tan(a)-----对矩阵a中的每个元素取正切, tan(x)
-
np.arcsin(a)----对矩阵a中的每个元素取反正弦, arsin(x)
-
np.arccos(a)-----对矩阵a中的每个元素取反余弦, arcos(x)
-
np.arctan(a)-----对矩阵a中的每个元素取反正切, artan(x)
-
np.sqrt(a)-------对矩阵a中的每个元素开方, sqrt(x)
四、矩阵元素的填充与矩阵转换
1.fill(n):对矩阵中的每个元素都填写为n
import numpy as np
m1 = np.ones([3,3],np.uint8)
m1.fill(122.388)print(m1)
'''输出结果
[[ 122.38800049 122.38800049 122.38800049]
[ 122.38800049 122.38800049 122.38800049]
[ 122.38800049 122.38800049 122.38800049]]
若np.float32 改成 np.uint8,则输出结果为
[[122 122 122] [122 122 122] [122 122 122]]
'''
2.reshape([n,m]):将原矩阵变成 n 行 m列的矩阵
import numpy as np
m1 = np.ones([3,3],np.uint8)
m1.fill(122.388)
m2 = m1.reshape([1,9]) #将矩阵变成1行9列的新矩阵
print(m2)
#输出结果为:
[[122 122 122 122 122 122 122 122 122]]
五、利用zeros()方法以及ones()方法创建图像
np.zeros([H,W,N],dtype) :创建一个 H*W 的N通道全0矩阵,dtype为数据类型
np.ones([H,W]):创建一个 H*W 的全1矩阵
1.创建一个单通道图像
import cv2
import numpy as np
def create_image():
'''方法一:利用zero()及ones()函数
img = np.zeros([400,400,1],np.uint8)
img[:,:,0] = np.ones([400,400]) * 127
'''
#方法二:直接利用ones()函数
img = np.ones([400,400,1],np.uint8)
img = img * 127 #乘127得到灰色图像,*0得到黑色图像,*255得到白色图像
cv2.imshow("New image",img)
print(img)create_image()
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
2.创建一个三通道图像
import cv2
import numpy as np
def create_image():
img = np.zeros([400,400,3],np.uint8)
img[:,:,0] = np.ones([400,400])*255 #0修改第一个通道值使第一个通道值全为255,出现一个蓝色的图片
#img[:,:,1] = np.ones([400,400])*255 #1修改第二个通道值,出现一个绿色的图片
#img[:,:,2] = np.ones([400,400])*255 #2修改第三个通道值,出现一个红色的图片
cv2.imshow("New image",img)
print(img)create_image()
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
上一篇: 第一个Docker容器
下一篇: 动画图解高内聚与低耦合