PythonOpenCV-图像基础操作
读、写、显示图像
1. 读取图像
函数原型:cv2.imread(filename, flag)
filename:图像文件名
flag:图像读取格式标志
代码示例
import cv2 img = cv2.imread('1.jpg') #读取图像 print(type(img)) #输出数据类型 print(img) #输出图像数组 print(img.shape) #输出数组形状 print(img.dtype) #输出数组元素的数据类型 print(img.size) #输出数组元素的个数 # 输出结果 <class 'numpy.ndarray'> [[[134 136 220] [134 136 220] [134 136 224] ... [140 146 235] [133 137 225] [124 127 212]] ... [ 90 79 172] [ 86 78 173] [ 80 76 172]]] (509, 511, 3) uint8 780297
图像读取格式标志
格式 |
含义 |
cv2.IMREAD_UNCHANGED |
按原样加载图像 |
cv2.IMREAD_GRAYSCALE |
将图像转换为单通道灰度图像 |
cv2.IMREAD_COLOR |
将图像转换为3通道BGR彩色图像 |
cv2.IMREAD_ANYDEPTH |
当图像具有相应的深度时,返回16位或32位图像,否则将其深度转换为8位 |
cv2.IMREAD_ANYCOLOR |
以任何可能的颜色格式读取图像 |
cv2.IMREAD_LOAD_GDAL |
使用gdal驱动程序加载图像 |
cv2.IMREAD_REDUCED_GRAYSCALE_2 |
将图像转换为单通道灰度图像,并且图像尺寸减小为1/2 |
cv2.IMREAD_REDUCED_COLOR_2 |
将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/2 |
cv2.IMREAD_REDUCED_GRAYSCALE_4 |
将图像转换为单通道灰度图像,并且图像尺寸减小为1/4 |
cv2.IMREAD_REDUCED_COLOR_4 |
将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/4 |
cv2.IMREAD_REDUCED_GRAYSCALE_8 |
将图像转换为单通道灰度图像,并且图像尺寸减小为1/8 |
cv2.IMREAD_REDUCED_COLOR_8 |
将图像转换为3通道BGR彩色图像,并且图像尺寸减小为1/8 |
cv2.IMREAD_IGNORE_ORIENTATION |
不根据EXIF方向标志旋转图像 |
提示:
OpenCV默认的图像格式为BGR,即3通道图像数组的3个维度依次为B(蓝色)、G(绿色)、R(红色)通道的像素。
代码示例
import cv2
img = cv2.imread('1.jpg', cv2.IMREAD_REDUCED_GRAYSCALE_4) print(img.shape) print(img.size) #输出结果 (128, 128) 16384
2. 写图像
代码示例
import cv2 import numpy as np img = np.zeros((50, 50), dtype = np.uint8) #创建大小为50*50的黑色正方形图像 cv2.imwrite('mytest.jpg', img) #将图像存入文件
3. 显示图像
代码示例
import cv2 img = cv2.imread('1.jpg', cv2.IMREAD_REDUCED_COLOR_2) #读取图像并将图像尺寸减少1/2 cv2.imshow('lena', img) #显示图像
4. 显示图像窗口暂停(等待按键)
函数原型:cv2.waitKey([delay])
代码示例
import cv2 img = cv2.imread('1.jpg', cv2.IMREAD_REDUCED_COLOR_2) cv2.imshow('lena', img) # 示例1 key = 0 while key != 27: # 按Esc键时终止循环 key = cv2.waitKey() #等待按键 cv2.destoryWindow('lena') #关闭图像窗口 # 示例2 key = cv2.waitKey(0) if(key & 0xFF == ord('q')): break cv2.destroyAllWindows() #关闭图像窗口
读、写、播放视频
1. 播放视频
代码示例
import cv2 vc = cv2.VideoCapture('videotest.mp4') #创建VideoCapture对象 fps = vc.get(cv2.CAP_PROP_FPS) #读取视频帧速率 size = (vc.get(cv2.CAP_PROP_FRAME_HEIGHT), vc.get(cv2.CAP_PROP_FRAME_WIDTH)) #读取视频大小,该方法读取数值为浮点数,可以用int转换 # print('帧速率:', fps) # print('大小:', size) success, frame = vc.read() # 读第1帧 while success: #循环读取视频帧 cv2.imshow('myvideo', frame) #在窗口显示帧图像 success, frame = vc.read() #读下一帧 key = cv2.waitKey(20) #延迟时间 if key == 27: #按Esc键退出 break vc.release() #关闭视频
2. 将视频写入文件
代码示例
import cv2
vc = cv2.VideoCapture('videotest.mp4') fps = vc.get(cv2.CAP_PROP_FPS) size = (int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT)), int(vc.get(cv2.CAP_PROP_FRAME_WIDTH))) vw = cv2.VideoWriter('myvideo.avi', cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'), fps, size) #设置保存视频的文件名、视频解码器格式、帧速率和大小 success, frame = vc.read() while success: vw.write(frame) #将帧写入文件 success, frame = vc.read() vc.release()
常见解码器格式
格式 |
含义 |
cv2.VideoWriter_fourcc('P', 'I', 'M', '1') |
XVID的MPEG-1编码格式,视频文件扩展名为.avi |
cv2.VideoWriter_fourcc('M', 'P', '4', '2') |
Microsoft的MPEG-4编码格式,视频文件扩展名为.avi |
cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') |
XVID的MPEG-4编码格式,视频文件扩展名为.avi |
cv2.VideoWriter_fourcc('F', 'L', 'V', '1') |
XVID的MPEG-4编码格式,视频文件扩展名为.flv |
3. 捕获摄像头视频
代码示例
import cv2
vc = cv2.VideoCapture(0) #视频源为默认摄像头 fps = 30 # 预设视频帧速率 size = (int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT)), int(vc.get(cv2.CAP_PROP_FRAME_WIDTH))) vw = cv2.VideoWriter('myvideo.avi', cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'), fps, size) #设置保存视频的文件名、视频解码器格式、帧速率和大小 success, frame = vc.read() while success: vw.write(frame) #将帧写入文件 cv2.imshow('MyCamera', frame) #显示帧 key = cv2.waitKey() if key == 27: #按Esc键退出 break success, frame = vc.read() vc.release()
图像操作
1. 操作灰度图像
代码示例
import cv2 import numpy as np
img = np.zeros((240, 320), dtype = np.uint8)# 创建黑色图像 n = 0 while True: cv2.imshow('GrayImg', img) n += 20 img[:, :] = n #更改图像灰度值 print(img[1, 1]) key = cv2.waitKey(1000) #延迟1秒 if key == 27: break
输出结果
2. 操作彩色图像
代码示例
import cv2 import numpy as np
img = np.zeros((240, 320, 3), dtype = np.uint8) r0 = 0 r1 = 1 r2 = 2 while True: img[:80, : , r0] = 255 #通道r0,将上部1/3颜色值设置为255 img[80:160, : , r1] = 255 #通道r1,将中部1/3颜色值设置为255 img[160:, : , r2] = 255 #通道r2,将下部1/3颜色值设置为255 cv2.imshow('ColorImg', img) key = cv2.waitKey(1000) img[:, :, :] = 0 #像素全部置0 t = r0 r0 = r1 r1 = r2 r2 = t if key == 27: break
输出结果
3. 图像通道操作
3.1 通过数组索引拆分通道
代码示例
import cv2
img = cv2.imread('1.png', cv2.IMREAD_REDUCED_COLOR_2) cv2.imshow('lena', img) #显示原图 b = img[:, :, 0] #获取B通道图像 g = img[:, :, 1] #获取G通道图像 r = img[:, :, 2] #获取R通道图像 cv2.imshow('lena_B',b) #显示B通道图像 cv2.imshow('lena_G',g) #显示G通道图像 cv2.imshow('lena_R',r) #显示R通道图像 cv2.waitKey(0)
输出结果
3.2 使用cv2.split()函数拆分通道
代码示例
import cv2
img = cv2.imread('1.png', cv2.IMREAD_REDUCED_COLOR_2) cv2.imshow('lena', img) #显示原图 b, g, r = cv2.split(img) #按通道拆分图像 cv2.imshow('lena_B',b) #显示B通道图像 cv2.imshow('lena_G',g) #显示G通道图像 cv2.imshow('lena_R',r) #显示R通道图像 cv2.waitKey(0)
3.3 合并图像通道
函数原型:cv2.merge([b, g, r])
代码示例
import cv2
img = cv2.imread('1.png', cv2.IMREAD_REDUCED_COLOR_2) cv2.imshow('lena', img) #显示原图 b, g, r = cv2.split(img) #按通道拆分图像 rgb = cv2.merge([r, g, b]) #按新顺序合并 gbr = cv2.merge([g, b, r]) #按新顺序合并 cv2.imshow('lena_RGB', rgb) #显示合并图像 cv2.imshow('lena_GBR', gbr) #显示合并图像 cv2.waitKey(0)
输出结果
/*-------------------------------------------------------------------------------------------------------
笔者说明:
该笔记来源于本人学习Python + OpenCv时的资料,
分享出来只是为了供大家学习,并且为了自己以后想要用的时候方便寻找。
时间:2023年3月17日
------------------------------------------------------------------------------------------------------------*/