与图像相关的知识。
文章目录
前言
要对一张图片进行处理,首先需要获取这张图片。可以使用相机和手机等工具获取一张彩色图片,并且以一种特定的格式保存在自己的磁盘中。所以在处理图像时,需要通过某种方式获取图像,同时以某种类型把它存放在一个容器里,并且展示给用户。
提示:以下是本篇文章正文内容,下面案例可供参考
一、图像表示
数字图像在计算机中是以矩阵形式进行存储的,矩阵中的每一个元素都描述一定的图像信息,如亮度、颜色等信息。数字图像处理就是通过一系列矩阵运算过程从而提取重要信息。在python中,图像被读取进来后,被保存在一个N维数组对象ndarray中,此后的图像处理操作都是依赖于这个多维数组。
二、Numpy相关介绍
1.ndarray对象及常用的属性
ndarray在numpy中可以进行快速数学运算、具有广播能力且节约空间的N维数组对象,可在数组处理中灵活使用。
(1)ndarray.shape属性
这个函数表示数组的维数,返回一个元组,元组的长度即ndim(维度)。此属性可以获取图像的尺寸,对于灰度图像img,img.shape返回的数据(n,m)n表示n行,m表示m列;而对于三通道的彩色图像img0,img0.shape返回的数据(n,m,3),表示3个n行和m列的BGR图像。
(2)ndarray.dtype属性
这个函数的作用是表示数组中元素的数据类型。图像在计算机存储主要由像素矩阵构成,每个像素值的大小决定了图像的质量。如果用8位无符号整数存储16位图像,会造成图像颜色的改变,从而显示错误的图像。
(3)numpy的数据类型
数据类型 | 取值范围 | C++ |
---|---|---|
uint8 (8位无符号整数) | 0-255 | cv-8u |
int8 (8位符号整数) | -128-127 | cv-8s |
uint16(16位无符号整数) | 0-65535 | cv-16u |
int16(16位符号整数) | -32768-32767 | cv-16s |
int32 (32位符号整数) | -2147483648-2147483647 | cv-32s |
float32(32位单精度浮点数) | -FLT_MAX-FLT_MAX,INF,NAN | cv-32F |
float64(64位双精度浮点数) | -DBL_MAX-DBL_MAX,INF,NAN | cv-64F |
(4)ndarray.ndim属性
函数表示数组的维度。在图像中可以用来表示图像的通道数(channel)。需要注意的是在C++中灰度图的通道数img.channel=1,而在numpy中灰度图像img.channel=2.
在opencv中,通常使用C1、C2、C3、C4分别表示单通道、双通道、三通道以及四通道
(5)ndarray.size属性
函数表示数组元素的总个数,在图像中常用它来计算数组中的像素个数。
在我们使用opencv-python读取一张图片成功后,会分别输出图像的四个属性。
提示 | 结果 |
---|---|
图像的形状 | (480,320,3) |
元素类型 | uint8 |
图像通道数 | 3 |
像素总数 | 460800 |
ndarray.size的作用就是将图像的像素总数进行计算表示,计算的过程,例如BGR色彩图像,图像的尺寸(480,320,3),利用ndarray.size计算得到的结果应该4803203,最终结果为460800.
2.Numpy常用的函数
1.创建ndarray对象
由于在python中导入numpy库时,常常import numpy as np导入,所以程序中np就是表示numpy库,np.array()函数属于numpy库中的一个函数,用于创建一个多维度的array数组。同时还可以利用np.ones()建立一个全为1的矩阵’利用np.zeros()可以建立一个全0矩阵。
2.ndarray对象的索引以及切片
在对图像处理时,常常需要对图像的某一个通道进行操作,此时就需要对ndarray对象进行切片以及索引。例如,img[0,0]可以选择灰度图像img中位于(0,0)位置上的像素;img[x1:x2,y1:y2],可以对图像进行裁剪,其中x1和y1表示图像左上角的坐标,x2和y2表示图像右下角的坐标。使用img[:,:,0]可以获取彩色图像img的蓝色通道,这个方式比opencv中的通道拆分cv.split()函数的效率要高得多。
3.ndarray对象生成随机数
np.random模块中提供了很多种可以生成多种随机数的函数,可以根据需求定义样本区间以及概率分布等。例如,在np.random.randint()函数可以从给定的范围内随机选取整数;np.random.randn()函数可以产生服从均值为0,标准差为1的正态分布的数据。
代码如下(示例):
import numpy as np
import cv2 as cv
if__name__ == "__mian__"
#创建array数组对象,
#使用np.array ()创建一个5x5、数据类型为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')
总结
numpy的使用极大的方便了,开发人员,如果对numpy有较深的理解,可以使得具有数组编程思维的开发人员写出更加高效的代码,在这里也只是简单地介绍一下numpy的相关知识,numpy中还有很多与矩阵有关的函数以及方式还需要我们自己去了解,这个对我们编程具有很大的帮助。其次个人能力有限,文章中有不对的地方,恳请原谅。