图像视频处理

一、读取图像数据

1. 使用PIL读取图像

Python Imaging Library中包含很多库,常用的是其中的Image,通过使用其中的open方法来读取图像,用法如下:

import Image # 导入库file = 'cat.jpg' # 定义图片地址img = Image.open(file, mode="r") # 读取文件内容img.show() # 展示图像内容

其中关键的方法是open,其中的参数包括两个:

  • file:文件对象名称,可以是文件名,也可以是图像文件字符串。
  • mode:打开模式,默认只能是r模式,否则会报错;当file是图像字符串时,会调用系统的rb模式读取。

通过open读取之后会返回一个图像文件对象,后续所有的图像处理都基于该对象进行。上述代码执行后,通过 img.show() 会调用系统默认的图像浏览器查看打开图像进行查看。

▲调用img.show()展示图像

该对象包含了很多方法可以用来打印输出文件的属性,例如尺寸、格式、色彩模式等。

print ('img format: ', img.format) # 打印图像格式print ('img size: ', img.size) # 打印图像尺寸print ('img mode: ', img.mode) # 打印图像色彩模式

上述代码执行后返回的结果如下:

('img format: ', 'JPEG')('img size: ', (435, 361))('img mode: ', 'RGB')

其中图像的类型是图像本身的格式,例如jpg、gif、png等;图像尺寸是指图像分辨率,示例中的尺寸是435×361(单位是像素);图像的模式指的是颜色模式,示例图像是RGB模式。

二、 使用OpenCV读取图像

OpenCV读取和展示图像主要有两类方法,第一种是使用cv库,第二种是使用cv2库。

第一种:使用cv读取图像

import cv2.cv as cv # 导入库
file = 'cat.jpg' # 定义图片地址
img = cv.LoadImage(file) # 加载图像
cv.NamedWindow('a_window', cv.CV_WINDOW_AUTOSIZE) # 创建一个自适应窗口用于展示图像
cv.ShowImage('a_window', img) # 展示图像
cv.WaitKey(0) # 与显示参数配合使用
View Code

第二种:使用cv2读取图像

import cv2 # 导入库file = 'cat.jpg' # 定义图片地址img = cv2.imread(file) # 读取图像cv2.imshow('image', img) # 展示图像cv2.waitKey(0) # 与显示参数配合使用

通过PIL调用的是系统默认的图像显示工具,而在OpenCV中是通过自身创建的图像功能显示图像。

另外,两种方法中都有一个waitKey()的方法,该方法的作用是键盘绑定函数,其中的参数表示等待毫秒数。执行该方法后,程序将等待特定的毫秒数,看键盘是否有输入,然后返回值对应的ASCII值。如果其参数为0,则表示无限期的等待直到键盘有输入。

笔者通常使用第二种方法读取图像,因为方法更加简单。其中imread方法细节如下:

语法

cv2.imread(filename[, flags])

描述

读取图像内容,如果图像无法读取则返回空信息,支持图像格式几乎包括了日常所有场景下的格式,具体包括:

  • Windows bitmaps文件:*.bmp、*.dib
  • JPEG文件:*.jpeg、*.jpg、*.jpe
  • JPEG 2000文件:*.jp2
  • PNG文件:*.png
  • WebP文件:*.webp
  • 移动图像格式:*.pbm、*.pgm、*.ppm *.pxm、*.pnm
  • Sun rasters文件:*.sr、*.ras
  • TIFF 文件:*.tiff、*.tif
  • OpenEXR文件:*.exr
  • Radiance HDR文件:*.hdr、*.pic

参数

  • filename必填,字符串,图像地址。
  • flags可选,int型或对应字符串,颜色的读取模式。如果flag>0或者cv2.IMREAD_COLOR,读取具有R/G/B三通道的彩色图像;如果flag=0或cv2.IMREAD_GRAYSCALE,读取灰度图像;如果flag

返回

图像内容,如果图像无法读取则返回NULL。

提示:除了使用OpenCV自带的图像展示方法外,OpenCV还经常和matplotlib配合展示图像,这种场景更加常用。组合使用时可借用Matplotlib的强大图像展示能力进行图像的对比和参照以及不同图像模式的输出。

三、 读取视频数据

Python读取视频最常用的库也是Opencv。本文以名为Megamind.avi的视频为例进行说明,如下是一段读取视频内容的代码示例:

import cv2 # 导入库
cap = cv2.VideoCapture("tree.avi") # 获得视频对象
status = cap.isOpened() # 判断文件知否正确打开
if status: # 如果正确打开,则获得视频的属性信息 
frame_width = cap.get(3) # 获得帧宽度 
frame_height = cap.get(4) # 获得帧高度 
frame_count = cap.get(7) # 获得总帧数 
frame_fps = cap.get(5) # 获得帧速率 
print ('frame width: ', frame_width) # 打印输出
print ('frame height: ', frame_height) # 打印输出 
print ('frame count: ', frame_count) # 打印输出 
print ('frame fps: ', frame_fps) # 打印输出
success, frame = cap.read() # 读取视频第一帧
while success: # 如果读取状态为True 
cv2.imshow('vidoe frame', frame) # 展示帧图像 
success, frame = cap.read() # 获取下一帧 
k = cv2.waitKey(1000 / int(frame_fps)) # 每次帧播放延迟一定时间,同时等待输入指令
if k == 27: # 如果等待期间检测到按键ESC
break # 退出循环cv2.destroyAllWindows() # 关闭所有窗口
cap.release() # 释放视频文件对象
View Code

上述代码分为4个部分,以空行分隔。

第一部分为前3行,先导入库,然后读取视频文件并获得视频对象,再获得视频读取状态。其中的关键方法是VideoCapture,用来读取图像。

语法

cv2.VideoCapture(VideoCapture ID|filename|apiPreference)

描述

读取视频设备或文件,并创建一个视频对象实例

参数

必填,VideoCapture ID|filename

VideoCapture ID:int型,系统分配的设备对象的ID,默认的设备对象的ID为0。

Filename:

  • 视频文件的名称,字符串,例如abc.avi。目前版本下只支持avi格式。
  • 序列图像,字符串,例如img_%2d.jpg(图像序列包括img_00.jpg, img_01.jpg, img_02.jpg, ...)
  • 视频URL地址,字符串,例如protocol://host:port/script_name?script_params|auth
  • apiPreference:int型,后台使用的API

猜你喜欢

转载自www.cnblogs.com/lpapython/p/11101042.html