图像分为静态图像,如图片、照片等,和动态视频,如视频等两种。
与图像相关的操作包括图像采集、图像制作、图像分析和图像处理等。
2.1 图像的读取 cv2.imread()
原型:cv2.imread(filename, flage)
参数:
- filename 图像文件名
- flage 加载标识
- cv2.IMREAD_COLOR : 默认使用该种标识。加载一张彩色图片,忽视它的透明度。
- cv2.IMREAD_GRAYSCALE : 加载一张灰度图。
- cv2.IMREAD_UNCHANGED : 加载图像,包括它的Alpha通道
同时,上面三个参数可以分别用1,0,-1代替。
灰度图的作用很大,在很多图像检测识别中,我们都需要将彩色图转换为灰度图,再进行相应的图像处理。
简单代码如下:
import cv2
import matplotlib.pyplot as plt
import numpy as np
### imread()读取图像 Opencv读取的格式是BGR
img = cv2.imread('C:\\Users\\xxx\\Downloads\\picture1.jpeg')
print(img.shape)
img = cv2.imread('C:\\Users\\xxx\\Downloads\\picture1.jpeg',0)
print(img.shape)
img = cv2.imread('C:\\Users\\xxx\\Downloads\\picture1.jpeg',-1)
print(img.shape)
2.2 图像的显示
2.2.1 cv2.imshow() 在指定窗口显示图像
作用:该函数将图像在特定的窗口进行显示。如果该窗口是利用cv::WINDOW_AUTOSIZE标志创建的,则会使用图像的原始分辨率进行显示,然而会受限于屏幕的分辨率。也就是如果图像大于屏幕的分辨率,则无法完整的查看了。
原型:cv2.imshow(winname, mat)
参数:
- winname 窗口名。如果窗口名为winname的窗口不存在,则自动创建窗口
- mat 要显示的图像数据矩阵
2.2.2 cv2.moveWindow() 移动窗口
作用:该函数的作用是将窗口放到指定的位置去
原型:cv2.moveWindow(winname, x, y)
参数:
- winname 窗口名
- x、y 指窗口的左上角在屏幕的坐标
2.2.3 cv2.namedWindow() 命名窗口
作用:创建窗口。如果已经存在相同的窗口名称之后,该函数将会不做任何事情。
原型:cv2
.namedWindow( winname
[, flags
])
参数:
- winname 窗口名
- flags 标志位
- cv2.WINDOW_NORMAL: 使得你能够改变窗口的尺寸
- cv2.WINDOW_AUTOSIZE: 会自适应图像的尺寸(默认)。
- 上面2个参数可以分别用0,1代替。
2.2.4 cv2.waitkey() 等待函数
原型:cv2
.waitkey(delay)
参数:delay 延时的时间。单位ms。
返回值:若在给定延时内有按键触发,则返回键值。没有键盘输入,则返回-1.
作用:
- cv2.waitKey()是一个键盘绑定函数。它的时间量度是毫秒ms。函数会等待(delay)毫秒,看是否有键盘输入。若有键盘输入,则返回按键的ASCII值。没有键盘输入,则返回-1.一般设置为0,他将无线等待键盘的输入。
- 一般在 imshow() 的时候 , 如果设置 waitkey(0) , 代表按任意键继续。
- 显示视频时,延迟时间需要设置为 大于0的参数。delay > 0时 , 延迟 ”delay”ms , 在显示视频时这个函数是有用的 , 用于设置在显示完一帧图像后程序等待 ”delay”ms 再显示下一帧视频 ; 如果使用 waitkey(0) 则只会显示第一帧视频
2.2.5 cv2.destroyAllWindows() 删除窗口
原型:cv2.destroyAllWindows([winname])
参数:winname 窗口名。不指定任何参数,则删除所有窗口;指定参数,则删除特定的窗口winname。
示例:
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('C:\\Users\\xxx\\Downloads\\picture1.jpeg') # 彩色图
img1 = cv2.imread('C:\\Users\\xxx\\Downloads\\picture1.jpeg',0) #灰度图
cv2.namedWindow('picture1',0) #创建一个能改变大小的窗口
cv2.imshow('picture',img) #显示图像,窗口不存在,就自动创建
cv2.imshow('picture1',img1) #显示图像,在已存在的窗口
cv2.waitKey(0) #按任意键
cv2.moveWindow('picture',0,0) # 将窗口移动至屏幕左上方
cv2.waitKey(0) #按任意键
cv2.destroyAllWindows() #删除所有窗口
运行结果如下:
为了避免每显示一个图像敲多行代码,我们可以定义一个函数cv_show(name,img),如下:
# 定义显示图像函数
def cv_show(name,img):
'''
参数:
name 窗口名
img 图像数据的矩阵
'''
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2.6 图像深度:就是图像的数据类型。
在定义图像数据时,可以指定图像的深度(即数据类型),如下例:
import numpy as np
import cv2
# 【图像深度为CV_8U,或者numpy数据类型为uint8】
# 新建numpy数组,注意np.zero()创建的数据类型为float64,所以先转化为uint8
type = ['uint8','uint16','float32','float64']
for dType in type:
# 新建numpy数组,注意np.zero()创建的数据类型为float64,所以先转化为对应的数据类型
img = np.zeros((500,500,3)).astype(dType)
# openCV显示图像为BGR格式,通过下列方式,我们绘制两条粗红线
if dType == 'uint8':
img[150:170,150:350]=[0,0,100]
img[350:370,150:350]=[0,0,255]
if dType == 'uint16':
img[150:170,150:350]=[0,0,25600]
img[350:370,150:350]=[0,0,65525]
if dType == 'float32' or dType == 'float64':
img[150:170,150:350]=[0,0,-8000]
img[250:270,150:350]=[0,0,8000]
img[350:370,150:350]=[0,0,0.34]
winName = 'Type: ' + dType
cv2.imshow(winName,img)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果如下:
说明:
- 当cv2.imshow()处理图像深度为:CV_8U(默认范围为[0,255])时,按原数据显示;
- 当cv2.imshow()处理图像深度为CV_16U(默认范围为[0,65535])时,除以256,映射到[0,255];
- 当cv2.imshow()图像深度为CV_32F和CV_64F时(默认范围为[0,1]),乘以255映射到[0,255];当碰到负数时,首先取其绝对值,然后按照上述图像深度将超出数据范围的部分采取截断操作,最后映射到[0,255]显示图像;
2.3 图像的保存 cv2.imwrite()
原型:retval = cv2.imwrite(filename, image [, paras])
参数:
- filename:代表文件名的字符串。文件名必须包含图像格式,例如.jpg,.png等。
- image:图像数据矩阵
- paras: 不同编码格式的参数,可选项
- cv2.CV_IMWRITE_JPEG_QUALITY:设置 .jpeg/.jpg 格式的图片质量,取值为 0-100(默认值 95),数值越大则图片质量越高;
- cv2.CV_IMWRITE_WEBP_QUALITY:设置 .webp 格式的图片质量,取值为 0-100;
- cv2.CV_IMWRITE_PNG_COMPRESSION:设置 .png 格式图片的压缩比,取值为 0-9(默认值 3),数值越大则压缩比越大。
返回值:retval。返回值,保存成功返回 True,否则返回 False。
示例
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('C:\\Users\\xxx\\Downloads\\picture1.jpeg',cv2.IMREAD_GRAYSCALE) #灰度图
cv2.imwrite('picture1.png',img)