前言
主要学习Numpy库的相关操作和Mat的基础知识。
目录
一、Numpy基本操作
1.创建矩阵
创建数组array()
a = np.array([2,3,4])
b = np.array([[1, 2], [3, 4]])
创建全0/1数组zeros()/ones()
c = np.zeros((3, 4, 2), np.uint8)
d = np.ones((3, 4, 2), np.uint8)
(3, 4, 2):(行数,列数,通道数/层数,即2个3x4的矩阵)
np.uint8:矩阵中元素数据类型
注:print函数由于解释不同,生成3个4x2的矩阵,但OpenCV解释成2个3x4的矩阵。
创建全值数组full()
e = np.full((8, 8), 255, np.uint8)
print(e)
单位矩阵identity()/eye()
f = np.identity(4) #identity(方阵阶数)
g = np.eye((5, 7), k = 2) # eye可以生成长方形的矩阵,k表示前k列全为0
2.检索与赋值
下标法:
[y, x],y在前,x在后。
[y, x, channel],加了一个通道
程序:纯黑界面画一条蓝色的线
import numpy as np
import cv2
img = np.zeros((480, 640, 3), np.uint8)
count = 0
while count < 200:
# img[count, 100, 0] = 255
img[count, 100] = [255, 0, 0] #上下两条语句都可以赋值
count += 1
cv2.imshow('img', img)
key = cv2.waitKey(10000)
if(key & 0xFF ==ord('q') ):
cv2.destroyAllWindows()
3.获取子矩阵Region of Image(ROI)
[y1:y2,x1:x2]
从图像img取一小块到roi程序
img = np.zeros((480, 640, 3), np.uint8)
roi = img[100:400, 100:500]
roi[:, :] = [0, 0, 255]
二、Mat结构体
Mat实质上是一个矩阵,例如黑白图片是单通道的矩阵,而彩色图片就是3通道(分别表示B、G、R)的矩阵。因此Mat可以通过Numpy以矩阵方式操作。
1.Mat的实现
Mat由Header和Data两部分构成,Data就是图片的数据,Header则是一些属性信息
2.Mat拷贝
由于图像数据较大,Mat数据默认进行浅拷贝,即只拷贝Header部分,而共用Data,
Mat浅拷贝
通过"="进行的赋值操作默认都是浅拷贝。
Mat A
A = imread(file, IMREAD_COLOR)
Mat B(A); #构造函数,并用A进行列表初始化
Mat深拷贝
底层C++有两种方法实现深拷贝
cv::Mat::clone()
cv::Mat::copyTo()
Python中则通过函数copy()实现深拷贝。
程序演示
import cv2
import numpy as np
img = np.zeros((480, 640, 3), np.uint8)
img2 = img
img3 = img.copy()
img[10:100, 10:100] = [0, 0, 255]
cv2.imshow('img', img)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
key = cv2.waitKey(0)
if(key & 0xFF ==ord('q') ):
cv2.destroyAllWindows()
3.访问图像(Mat)属性
import cv2
import numpy as np
img = np.zeros((480, 640, 3), np.uint8)
#shape属性包含3个信息(高,长,通道数)
print("shape:", img.shape)
#size =高*长*通道数(占用空间)
print("size:", img.size)
# dtype是每个元素的位深
print("dtype:", img.dtype)
4.通道的分离与合并
分离 split(mat)
合并 merge((ch1, ch2, …))
示例程序
import cv2
import numpy as np
img = np.zeros((480, 640, 3), np.uint8)
b, g, r = cv2.split(img)
b[10:100, 10:100] = 255
g[10:100, 10:100] = 255
img2 = cv2.merge((b, g, r))
cv2.imshow('img', img)
cv2.imshow('b', b)
cv2.imshow('img2', img2)
cv2.waitKey(0)