别人没那么重要,我也没那么重要,好好活着,把能做的小事做好,够不到的东西就放弃,承认就好。做一个心情好能睡着的人,你所有事情都会在正轨上。

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日

------------------------------------------------------------------------------------------------------------*/

posted @ 2023-03-17 13:07  一路狂奔的乌龟  阅读(179)  评论(0)    收藏  举报
返回顶部