在计算机眼中,每一个图像都是由若干个像素点组成的,而每个像素点就是一个值,这个值是在0~255之间进行浮动的,代表这个像素点的亮度。这个值越接近0,则代表这个像素点亮度比较低,也就是越接近黑色,而这个值越接近255,则代表这个像素点亮度越高,也就是越接近白色。
颜色通道可以简单理解为图像的色彩,彩色图像就是一个多通道的图像,而最常见的单通道图像就比如灰度图,也就是黑白图等。
在不同的颜色通道上,同一个像素点哪怕位置相同,但其所代表的值也不一定相同,比较常见的多颜色通道有RGB三通道,分别是Red(红色),Green(绿色),Blue(蓝色)。一个像素点在不同的颜色通道上有不同的取值,代表这个像素点在该颜色通道上对应位置的亮度。
既然图像在计算机眼中是由一个个值组成的,那么自然而然的,在计算机眼中,图像就是以矩阵的形式呈现的。我们在处理的过程中,则是用numpy中的ndarray这一数据类型来对其进行表示。
单通道的图像和多通道的图像在表示时当然也有所不同,我们就用灰度图和彩色图来进行对比。 灰度图在计算机眼中由于是单通道的图像,那么就是由一个二维的矩阵来进行呈现。 彩色图则是一个三维的矩阵来程序,就以RGB三通道来举例,则是Red通道一个二维矩阵,Green通道一个二维矩阵,Blue通道一个二维矩阵,而只有这三个矩阵一起组合成一个三维矩阵,才是这张彩色图在计算机眼中完整的呈现。
数据读取也分为对图像数据的读取和对视频数据的读取。
import cv2 #cv2是opencv库中的一个模块
import matplotlib.pyplot as plt # 引入这个plt主要用于对处理后的图像进行展示、
import numpy as np
img = cv2.imread('cat.jpg')
利用cv2.imread()函数就可以对图像数据进行读取了,用img这个变量来进行接收,于是img就是cat.jpg这个图像的像素矩阵了。
当然,导入的时候也可以指定导入的图像的颜色通道,就是cv2.imread()函数的第二个参数, cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道 cv2.IMREAD_GRAYSCALE:读入灰度图片 cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道 也可以写成如下: 取值0,将图像转化为灰图; 取值2,原深度图像; 取值4,原颜色图像; 取值1为彩图
注意:这里导入了matplotlib模块是用于对处理后的图像的展示,但matplotlib是以RGB的格式展示,而在cv2.read函数中是以BGR的格式读取的,因此若要用matplotlib展示,需要先对颜色通道进行一个转换。所以一般我们用cv2中的展示函数来进行展示。
接下来就是对图像的展示。
cv2.imshow('image',img) #图片的展示
cv2.waitKey(0) #展示的时间
cv2.destryAllWindows() #关闭窗口
cv2.imshow()函数中第一个参数是一个字符串,为用于展示图片的窗口命名,第二个参数就是要展示的像素矩阵。
cv2.waitKey()函数是一个窗口展示时间长短的函数,参数填写要展示窗口的时间,单位是毫秒,但填写0作为参数时,则代表展示窗口直到按下键盘的任意键。
cv2.destryAllWindows()函数是一个用于关闭窗口的函数,在前面的操作中也许会打开许多窗口,使用这个函数可以直接把前面打开的许多窗口在这个函数执行的时候全部销毁。
视频其实可以理解为多张图像的连续展示而形成的。
这里我们要先引入一个帧数的概念,所谓帧数就是一秒内所出现的图像数。举个例子,100帧就是一秒内出现了一百张图像的意思,帧数越高,所形成的视频在我们人眼看来则越自然,越连贯。人眼所看到30帧以上的视频就可以认为这个是个连贯内容了。
vc = cv2.VideoCapture('test.mp4')
以上这个代码就是用cv2.VideoCapture()函数来对视频转化成一个视频流的东西,用一个变量去接收。
if vc.isOpened(): #判断提取的视频流是否能打开
open,frame = vc.read() #检查能否读到第一帧
else:
open = Flase
while open: #循环,目的是读取视频中所有帧
ret,frame = vc.read() #依次读取视频中的每一帧
if frame is None: #当读到一个空帧时,停止循环
break
if ret == True: #当读取的不是空帧时,展示该帧的图像
gray = cv2.cvColor(frame,cv2.COLOR_BGR2GRAY) #将彩色图转化成灰度图
cv2.imshow('result',gray)
if cv2.waitKey(10) & OxFF == 27 : #展示的时间和设定按什么键退出展示
break
vc.release() #释放该线程
cv2.destroyAllWindows() #销毁所有出现的窗口
以上便是对这个视频流进行打开和展示,
isOpened()函数是用于检测这个视频流能否进行打开,会返回一个布尔类型。
read()函数是一个打开视频流的函数,会返回两个值,第一个值是代表是否读取到了一个有图像的一帧画面,是布尔类型值,第二个值是所读取到的那一帧画面的像素矩阵。如果在一个循环中多次对一个对象多次执行read()函数,read()函数则会依次读取这个视频流的每一帧。
cv2.Color()函数是一个转化颜色通道的函数,第一个参数是需要转化的对象,第二个参数是要执行的转化操作,例如上述例子中的cv2.COLOR_BGR2GRAY,就是把BRG三通道的图转化成单通道的灰度图,这样的参数还有很多,以此类推。
release()函数是一个释放函数,当前可以简单理解为释放这个线程的操作,一般用于多线程操作时的程序中。