OpenCV_03 Numpy库和Mat

前言

主要学习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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值