2 opencv-python核心库模块core

发布时间 2023-07-05 22:32:52作者: 寒水浮云

core模块定义了opencv中的基础数据结构和基础运算,是整个库的核心模块。而mat数据结构是opencv中最重要的数据结构,是opencv中图像最常用的存储格式。

1 基本数据结构

opencv的基本数据结构有mat数据结构,point数据结构,rect数据结构,size数据结构。

1)在python中,mat类型的对象构造操作可以通过numpy来实现(创建图像矩阵)

如下代码构建全0矩阵m1,然后将所有值初始化为128,还可以用copy进行矩阵拷贝,也可以对图像数据的部分原始值进行修改。

import cv2
import numpy as np        #python中,mat类型的对象通过numpy来实现

m1 = np.zeros([512,512],np.uint8)  #创建全0二维矩阵
m1[:] = 128  #初始化赋值

m2 = m1.copy()   #把m1图像拷贝到m2
m2[128:384,128:384] = 0  #将行,列为128到384的区域像素值赋值为0

cv2.imshow('m2',m2)
cv2.imshow('m1',m1)
cv2.waitKey(0)
cv2.destroyAllWindows()

可以对图像矩阵进行裁剪和缩放,裁剪直接用python的切片来完成,缩放可以用opencv的 resize() 函数来操作。resize函数介绍如下:

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst

参数说明:

src:原图像;dst:改变大小的目标图像;dsize:输出图像的大小。

fx:width方向的缩放比例;fy:height方向的缩放比例;

interpolation:指定插值的方式,图像resize之后,像素要重新计算,靠这个参数来指定重新计算像素的方式,有以下几种:
INTER_NEAREST - 最邻近插值
INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法
INTER_AREA -区域插值
INTER_CUBIC - 4x4像素邻域内的双立方插值
INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值

有两点需要注意:1 dsize和fx/fy不能同时为0。指定dsize的值,让fx和fy直接省略或置0 或者 dsize=None或置 (0,0),指定fx和fy的值,(dsize不可省略,会报错)。2 图像的size是(h,w),而
resize的操作是先w,再h。

import cv2         #图像裁剪和缩放
import numpy as np

img = cv2.imread('cat.jpg')
cv2.imshow('cat',img)

rows = img.shape[0]   #图像的行(高) [h,w,c]
cols = img.shape[1] #图像的列(宽)

img2 = img.copy()    #把img1图像拷贝到img2
img2 = cv2.resize(img2,(int(cols/2),int(rows/2)))  #图像尺寸减小为原来的一半,不是裁剪 [w,h]
cv2.imshow('img2',img2)

img3 = img[0:int(rows/2),0:int(cols/2)]   #图像裁剪为原来的1/4,用切片来裁剪,cropped_image = img[80:280, 150:330]  切片img[高,宽]

cv2.imshow('img3',img3)

cv2.waitKey(0)
cv2.destroyAllWindows()

2)在opencv中,点的定义由point类实现。python语言中,point类型可以由tuple元组表示,然后利用numpy进行点乘和叉乘计算。

import numpy as np     #tuple元组点乘叉乘(向量内积/外积)

point1 = (10,20)
point2 = (2,4)
print(type(point1))  #tuple(元组,有序且不可更改的集合)类型,
# 元组与列表相似,不同之处在于元组的元素不能修改,而列表的元素可以修改。元组使用小括号(),列表使用中括号[]。

res1 = np.dot(point1,point2) #点乘
print('res1',res1)

point3 = (1,2,3)
point4 = (4,5,6)

res2 = np.cross(point3,point4)  #叉乘,输出一个向量,方向垂直于输入两向量形成的平面
print('res2',res2)

3)opencv中定义了矩形的表示类rect,模板类rect定义了顶点坐标,宽高,面积等信息的获取操作,以及矩形是否包含点的判断操作。在python中的rect也是通过tuple类型的数据表示,即左上角坐标点(x,y)和矩形宽高4个值表示的rect为(x,y,w,h)的形式,在需要传入rect数据类型的地方,可以按照tuple类型的数据传入。

4)opencv的很多函数中都需要传入size类型的参数,比如mat类的后置函数为mat(Size size,int type),需要通过size类型对象传入构造矩阵的尺寸。size类型对象包含两个成员变量width和height。python中的size对象也是通过tuple类型的数据表示,即 (w,h) 的形式传入宽高数据的,在需要传入size数据类型的地方,可以按照tuple类型的数据传入。

2 矩阵运算

core模块中提供了图像矩阵的基本运算,opencv对这些基本运算都做了封装,比如四则运算,位运算,比较运算等。