学习笔记
前言
要求opencv版本4.1.2.30(4.x >=版本),我的版本4.5.3
Numpy并非opencv重点,这里仅介绍相关函数的简单使用方法
1.1 Numpy_Attributes.py中ndarray对象常用属性的使用示例
ndarrary.shape
ndarray.dtype
ndarray.ndim
ndarray.size
1.2 Numpy_Attributes.py
代码如下:
import cv2 as cv
import sys
if __name__ =='__main__':
img = cv.imread('./chapter_2/flower.jpg')
if img is None:
print('Failed to read flower.jpg')
sys.exit()
else:
print('图像形状:{}\n 元素数据类型:{}\n 图像通道数:{}\n 像素总数:{}'.format(img.shape,img.dtype,img.ndim,img.size))
1.3 结果
2.1 Numpy_Operations.py中Numpy相关函数的操作示例
np.arrary() 创建数据
np.zeros() 创建全0矩阵
np.ones() 创建全1矩阵
img[x1:x2,y1:y2] 图片裁剪操作左上角坐标(x1,y1)右下角坐标(x2,y2)
np.random.randint() 给定范围内的随机整数
np.random.randn() 服从均值为0,标准差为1的正态分布数据
有关操作见下代码
2.2 Numpy_Operations.py
代码如下:
import cv2 as cv
import numpy as np
import datetime
import sys
if __name__ == '__main__':
#创建ndarray对象
#使用np.array()创建一个5*5,数据类型为float32的对象(矩阵)
a = np.array([[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25]],dtype='float32')
#使用np.ones()创建一个5*5,数据类型为uint8的全1对象
b = np.ones((5,5),dtype='uint8')
#使用np.zeros()创建一个5*5,数据类型为float32的全0对象
c = np.zeros((5,5),dtype='float32')
print(f'a:\n{a}')
print(f'b:\n{b}')
print(f'c:\n{c}')
#ndarray对象切片和索引
image = cv.imread('./chapter_2/flower.jpg')
if image is None:
print('Failed to read flower.jpg')
sys.exit()
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
#读取图像位于(45,45)的像素值
print('位于(45,45)的像素值为{}'.format(gray[45,45]))
#裁剪部分图像(灰度图像和rgb图像)
res_gray = gray[40:280,60:340]
res_color1=image[40:280,60:360,:]
res_color2=image[100:220,80:220,:]
#通道分离
b = image[:,:,0]
g = image[:,:,1]
r = image[:,:,2]
#展示裁剪和分离结果
cv.imshow('Result crop gray',res_gray)
cv.imshow('Result crop color1',res_color1)
cv.imshow('Result crop color2',res_color2)
cv.imshow('Ressult split b',b)
cv.imshow('Result split g',g)
cv.imshow('Result split r',r)
#生成随机数
#生成一个5*5,取值范围为0~100的数组
values1 = np.random.randint(0,100,(5,5),dtype='uint8')
#生成一个2*3,元素服从均值为0,标准差为1,的正态分布的数组
values2 = np.random.randn(2,3)
print(f'生成随机数(np.random.randint):\n{values1}')
print(f'生成随机数(np.random.randn):\n{values2}')
cv.waitKey(0)
cv.destroyAllWindows()
2.3 结果
3.1 numpy的部分函数快于Opencv(使用numpy函数原因吧。)
3.2 Compare_opencv_numpy.py中的Opencv/Numpy对比示例
import cv2 as cv
import numpy as np
import datetime
import sys
from numpy.lib.type_check import _imag_dispatcher
if __name__ =='__main__':
image = cv.imread('./chapter_2/flower.jpg')
if image is None:
print('Failed to read flower.jpg')
sys.exit()
#对比通道的分离
#使用Opencv中的cv.split()函数
begin1=datetime.datetime.now()
for i in range(100000):
b1,g1,r1= cv.split(image)
end1 = datetime.datetime.now()
print('通道分离(Opencv):{}s'.format((end1-begin1).total_seconds()))
#使用numpy中的切片和索引
begin2 = datetime.datetime.now()
for i in range(100000):
b2 = image[:,:,0]
g2 = image[:,:,1]
r2 = image[:,:,2]
end2 = datetime.datetime.now()
print('通道分离(Numpy):{}s'.format((end2-begin2).total_seconds()))
#将BGR图像转化为RGB图像
#使用Opencv中的cv.cvtColor()函数
begin3 = datetime.datetime.now()
for i in range(100000):
image_rgb = cv.cvtColor(image,cv.COLOR_BGR2RGB)
end3 = datetime.datetime.now()
print('BGR转RGB(Opencv):{}s'.format((end3-begin3).total_seconds()))
#使用Numpy中的切片和索引
begin4 = datetime.datetime.now()
for i in range(100000):
image = rgb = image[:,:,::-1]
end4 = datetime.datetime.now()
print('BGR转RGB(Numpy):{}s'.format((end4-begin4).total_seconds()))