05 图像色彩空间转换

常见的色彩空间:HSV、RGB、YCrCb

​ RGB色彩空间,设备独立

​ HSV色彩空间,对计算机友好,区分各种色彩

​ YCrCb, Y分量表示信息,CrCb可以被压缩

​ RGB是计算机显示器的标准支持色彩系统

​ RGB的取值范围0~255

​ HSV取值范围H(色调):0°~360°,S(饱和度):0~255,V(明度):0~255

从一个色彩空间转换到另外一个色彩空间要考虑:

​ 信息传递与损失过程、可逆与不可逆

函数与参数

​ cv.cvtColor(src,code[,dst[,dstCn]])->dst

· src表示输入图像, 类型CV_8U、CV_32F

· code表示,

​ cv::COLOR_BGR2RGB = 4

​ cv::COLOR_BGR2GRAY = 6

​ cv::COLOR_GRAY2BGR = 8

​ cv::COLOR_BGR2HSV = 40

​ 例:img2 = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)

​ 注:当彩色图像转为灰度图像,由三通道转为单通道,其部分信息永久消失,再次转回BGR后图像变为三通道,但仍为灰色。

06 图像对象的创建与赋值

① OpenCV-Python支持的数据类型:np.uint8(默认)、np.float32(方便计算)、np.int32、np.int64

② Numpy常用函数:

​ numpy.array、numpy.zeros、numpy.zeros_like(快速产生与读入图像尺寸相同的纯黑图像)、numpy.asarray(将普通数组转为NumpyArray)、numpy.copy(复制图像)、numpy.reshape(各种转换)

函数解释:

​ (1) numpy.array(object, dtype=None, *, copy=True, order=’K’, subok=False, ndmin=0, like=None)

​ object 数组

​ dtype 数据类型

​ (2) numpy.zeros(shape, dtype=float, order=‘C’, *, like=None)

​ 数组维度

​ dtype 数据类型

​ (3) numpy.asarray(a, dtype=None, order=None, *, like=None)

​ 数组对象

​ dtype 数据类型

​ (4) numpy.reshape(a, newshape, order=’C’)

​ 数组维度

​ dtype 数据类型

③ 概念

​ opencv-python中一切图像数据皆numpy array

​ 创建图像就是创建numpy array

④ 创建图像

​ 1)导入import numpy as np

​ 2)创建np.array([[1, 2],[3, 4]], dtype=np.uint8)

​ 3)创建图像最常用函数:

​ np.zeros ->创建一个黑色背景图像

​ np.zeros_like->创建一个与输入图像大小一致的黑色背景图像

​ np.ones创建一个全部像素值是1的图像

⑤ 图像赋值

​ 图像赋值就是给numpy array数组赋值

​ m = np.zeros((3, 3, 3), dtype=uint8)

​ m[:] = 255,创建数组m,然后赋值为255(白色)

​ m[:] = (255,0,0),创建数组m,然后赋值为(255,0,0)蓝色

​ h,w,c = img.shape,h,w,c分别为高,宽,通道

07 图像像素的读写操作

理解像素:

​ 像素实际大小:dpi x inches = 像素总数

​ 术语dpi:每英寸的点数目,96dpi – 针对打印

​ 术语ppi: 每英寸的像素数目 – 针对图像分辨率

OpenCV中像素

​ 矩阵表示每个像素信息

​ 像素遍历本质就是numpy数组访问

假设变量image

​ 获取图像维度信息: image.shape

​ 图像访问像素: image[row, col]

​ 图像赋值像素: image[row, col] = (b,g,r)

​ 读写像素,彩色图像:

​ b, g, r = image[row, col]

​ image[row, col] = (255-b, 255-g, 255-r)

​ 读写像素,灰度图像:

​ pv = image[row, col]

​ image[row, col] = 255-pv

08 图像算数操作

图像读取后是一个数组,它可以进行基本的算术操作

cv.add(src1, src2[, dst[, mask[, dtype]]]) ->dst

cv.subtract(src1,src2[,dst[,mask[,dtype]]])->dst

mask参数控制操作范围,操作范围内正常加减,范围外全为0

cv.multiply(src1,src2[,dst[,scale[,dtype]]])->dst

cv.divide(src1, src2[, dst[, scale[, dtype]]])->dst

参数说明 src1 & src2表示图像

加法运算保证不越界的方法:saturate(src1 + src2)-》0~255。saturate_cast函数的作用即是:当运算完之后,结果为负,则转为0,结果超出255,则为255。

图像算术运算要求:图像大小通道数目一致

加权加法:added_wt_img = cv2.addWeighted(img1, 0.6, img2, 0.4, 0)

mask表示模板(蒙版),为矩阵形式,矩阵中0,表示不取该位置的值,1表示保留该位置的值。