基本的图像操作和处理
PIL库
PIL库(python imaging library)是Python中最常用的图像处理库,它提供了很多有用的函数和类,可以帮助我们快速完成图像处理的工作。
from PIL import Image
pil_image = Image.open('test.jpg') # 打开图像,创建一个Image对象
pil_image.show() # 显示图像
pil_image.save('test.png') # 保存图像
pil_image.size # 图像的尺寸
pil_image_convert = pil_image.convert('L') # 转换图像为灰度图像
读取文件夹下所有文件并且转换文件格式为jpg
# 文件夹中所有图像文件的列表
from PIL import Image
import os
for infile in filelist:
outfile = os.path.splitext(infile)[0] + ".jpg"
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print("cannot convert", infile)
os.path.splitext(infile)[0]表示文件名,os.path.splitext(infile)[1]表示文件扩展名,filelist是文件列表。
outfile = os.path.splitext(infile)[0] + “.jpg”表示将文件扩展名改为jpg。
如何获取文件列表
import os
filelist = os.listdir('test') # test是文件夹名
其他操作:
pil_image.thumbnail((128,128)) # 缩略图
pil_image.rotate(45) # 旋转图像
pil_image.transpose(Image.FLIP_LEFT_RIGHT) # 左右翻转
pil_image.transpose(Image.FLIP_TOP_BOTTOM) # 上下翻转
# 裁剪图像
box = (100,100,400,400) # 左上角和右下角坐标
region = pil_image.crop(box) # 裁剪图像
# 调整图像大小
out = pil_image.resize((128,128)) # 128*128
OpenCV
OpenCV可以用于实时处理计算机视觉问题。
OpenCV 2.3.1 版本实际上提供了两个Python 接口。旧的cv 模块使用OpenCV 内部数据类型,并且从NumPy 使用起来可能需要一些技巧。新的cv2 模块用到了NumPy 数组,并且使用起来更加直观。
import cv2
im = cv2.imread('test.jpg') # 读取图像
h,w = im.shape[:2] # 获取图像的高和宽 :2表示前两个元素
cv2.imshow('image',im) # 显示图像
cv2.imwrite('test_output.png',im) # 保存图像
在openCV中,颜色空间不是RGB,而是BGR,所以在显示图像时,需要将BGR转换为RGB。
import cv2
im = cv2.imread('test.jpg')
b,g,r = cv2.split(im) # 分离图像的通道
im = cv2.merge((r,g,b)) # 合并图像的通道
im = cv2.imread('empire.jpg')
# 创建灰度图像
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
# BGR2RGB
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)
处理视频
OpenCV可以用于处理视频,可以从摄像头中读取视频,也可以从文件中读取视频。
import cv2
cap = cv2.VideoCapture(0) # 从摄像头中读取视频
# cap = cv2.VideoCapture('test.avi') # 从文件中读取视频
while True:
ret,frame = cap.read() # 读取一帧
cv2.imshow('frame',frame) # 显示一帧
key = cv2.waitKey(10)
if key == 27:
break
if key == ord(' '):
cv2.imwrite('vid_result.jpg',frame)
cap.release() # 释放摄像头
cv2.destroyAllWindows() # 关闭窗口
while True:表示循环读取视频帧,直到按下ESC键退出程序。 cat.read()返回两个值,第一个值ret表示是否读取成功,第二个值frame表示读取的帧。
key = cv2.waitKey(10)表示等待10ms,如果在10ms内按下了键盘,则返回按键的ASCII码,否则返回-1。
key = ord(‘ ‘)表示按下空格键,将当前帧保存为vid_result.jpg。
key = 27表示按下ESC键,退出程序。
将视频读取到NumPy数组中
import cv2
import numpy as np
cap = cv2.VideoCapture(0) # 从摄像头中读取视频
frames = []
while True:
ret,frame = cap.read() # 读取一帧
cv2.imshow('frame',frame) # 显示一帧
frames.append(frame)
if cv2.waitKey(10) == 27:
break
frame = array(frames)
print(frame.shape) # (480, 640, 3)
print(frames.shape) # (480, 640, 3, 100)
最终得到的数组会有帧数、帧高、帧宽及颜色通道数(3 个).