python 处理 图像和视频
图像入门
使用PLT读取图像
Pillow -> Python Imaging Library
Image模块
打开和新建
Image.open(fp,mode)
打开图像,执行返回Image类的实例。如果文件不存在,会引发IOError错误
- fp:打开文件的路径
- mode:打开文件的方式,通常使用默认值r
Image.new(mode,size,color=0)
新建图像
- mode:图像模式
- size:图片尺寸,是使用宽和高两个元素构成的元祖
- color:默认颜色(黑色)
mode(模式) | bands(通道) | 说明 |
---|---|---|
“1” | 1 | 黑白二值图像,每个像素用0或者1共1位二进制代码表示 |
“RGB” | 3 | 24位真彩图,每个像素用3个字符的二进制代码表示 |
“RGBA” | 4 | “RGB”+透明通道表示,每个像素用4字符的二进制代码表示 |
“CMYK” | 4 | 印刷模式图像,每个像素用4字符的二进制代码表示 |
“LAB” | 3 | lab颜色空间,每个像素用3字符的二进制代码表示 |
“HSV” | 3 | 每个像素用3字符的二进制代码表示 |
from PIL import Image
#打开图片
img=Image.open('bjsxt.png')
#显示图片
# img.show()
print('图片的格式:',img.format) # PNG
print('图片的大小:',img.size) # (437, 196)
print('图片的高度:',img.height,'图片的宽度:',img.width) # 图片的高度: 196 图片的宽度: 437
print('获取(100,100)处像素值:',img.getpixel((100,100))) # 获取(100,100)处像素值: (188, 193, 133)
混合
Image.blend(im,im2,alpha)
透明度混合处理
Image.composite(im1,im2,mask)
遮罩混合处理
from PIL import Image
img1=Image.open('bjsxt.png').convert(mode='RGB')
img2=Image.new('RGB',img1.size,'red')
Image.blend(img1,img2,alpha=0.5).show()img1=Image.open('blend1.jpg')
img2=Image.open('blend2.jpg')
img2=img2.resize(img1.size)
r,g,b=img2.split()
Image.composite(img2,img1,b).show()
复制和缩放
copy()
复制指定的图片
Image.eval(img,fun)
像素值缩放处理
Image.thmbnail(size,resample=3)
原生地缩放指定的图像
Image.resize(size, Image.ANTIALIAS)
antialias抗锯齿
from PIL import Image
#按像素缩放图片
img1= Image.open('bjsxt.png')
#.将每个像素值都扩大2倍
Image.eval(img1,lambda x:x*2).show()
img2=img1.copy()
#按尺寸进行缩放图片
img2.thumbnail((200,160)).show()
粘贴和裁剪
Image.paste(im,box=None,mask=None)
粘贴
- im 是源图像或像素值
- box 粘贴区域
- (x1,y1):将源图像左上角对齐(x1,y1)点,其余超出被粘贴图像的区域被抛弃
- (x1,y1,x2,y2):源图像与次区域必须一致
- None:源图像与粘贴的图像大小必须一致
- mask 遮罩
Image.crop(box)
box=(int(left),int(top),int(right),int(bottom))
裁剪图像
这个元组参数包含四个值,分别代表矩形四条边的距离X轴或者Y轴的距离。顺序是(左,顶,右,底)
from PIL import Image
img=Image.open('bjsxt.png')
#复制
imgb=img.copy()
imgc=img.copy()
#剪切
img_crop=imgb.crop((10,10,120,120))
#粘贴
imgc.paste(img_crop,(30,30))
imgc.show()
图像旋转和转换位置
Image.rotate(angle,resample=0,expand=0,center=None,translate=None,fillcoloor=None)
旋转图像
Image.covert(mode=None,matrix=None,dither=None,palette=0,colors=256)
图像转换
Image.transpose(method)
转换位置
- PIL.Image.FLIP_LEFT_RIGHT:左右镜像
- PIL.Image.FLIP_TOP_BOTTOM :上下镜像
- PIL.Image.ROTATE_90:旋转 90
- PIL.Image.ROTATE_180:旋转 180
- PIL.Image.TRANSPOSE :颠倒顺序
from PIL import Image
img=Image.open('bjsxt.png')
#图像的旋转
# img.rotate(180).show()#格式转换
# img.transpose(Image.FLIP_TOP_BOTTOM).show() # 上下滤镜
# img.transpose(Image.FLIP_LEFT_RIGHT).show() # 左右滤镜
# img.transpose(Image.ROTATE_90).show() # 90滤镜
# img.transpose(Image.ROTATE_180).show() # 180滤镜
img.transpose(Image.TRANSPOSE).show() # 颠倒滤镜
分离和合并
Iamage.split()
分割多个通道列表
Image.merge(mode,bands)
合并到更多通道图像中
from PIL import Image
img1=Image.open('blend1.jpg')
img2=Image.open('blend2.jpg')
img2=img2.resize(img1.size)
#分隔
r1,g1,b1=img1.split()
r2,g2,b2=img2.split()
temp=[r1,g2,b1]
img=Image.merge('RGB',temp)
img.show()
其他内置参数
常用属性
Image.format
源图像格式Image.mode
图像模式字符串Image.size
图像尺寸
内置函数
使用Python PIL进行图像压缩
Image.gethands()
获取图像每个通道的名称列表,例如RGB图像返回[‘R’,'G,'B]Image.getextrema()
获取图像最大、最小像素的值Image.crop(int(left),int(top),int(right),int(bottom))
图片裁剪region=im.crop((100,100,500,500))
Image.getpixel(x,y)
获取像素点值im.getpixel((4,4))
Image.putpixel((x,y),(r,g,b))
写入像素点值img.putpixel((4,4),(255,0,0))
Image.point(function)
使用函数修改图像的每个像素out=img.point(lambda i:i*1.5)
对每个点进行50%的加强Image.histogram(mask=None,extrema=None)
获取图像直方图,返回像素计数的列表Image.putalpha(alpha)
添加或替换图像的alpha层Image.blend(img1,img2,alpha)
两张图片相加Image.save(fp,format=None,**params)
保存图片Image.show(title=None,command=None)
显示图片Image.transform(size,method,data=None,resample=0,fill=1)
变换图像Image.verify()
检验文件是否损坏Image.close()
关闭文件
其它模块
ImageFilter模块
image.filter(滤镜效果)
- ImageFilter.EMBOSS 浮雕效果
- ImageFilter.CONTOUR 铅画笔
- ImageFilter.BLUR 模糊效果
- ImageFilter.EDGE_ENHANCE 边界增强
ImageDraw模块
draw.point(坐标, 颜色)
- 坐标:两个元组的序列
[(x, y), (x, y), ...]
或类似的数值[x, y, x, y, ...]
draw.line(起始坐标+终点坐标, 颜色, 宽度)
- 坐标:两个元组的序列
[(x, y), (x, y), ...]
或类似的数值[x, y, x, y, ...]
draw.rectangle(坐标,填充颜色,轮廓颜色,宽度)
- 坐标: 任何一个的序列
[(x0, y0), (x1, y1)]
或[x0, y0, x1, y1]
draw.textsize(要测量的文本,font)
- 坐标:两个元组的序列
ImageFont模块
ImageFont.truetype(字体文件, 字号)
draw.text(坐标, 文字内容, fill=文字颜色, font=字体对象 )
随机验证码
from PIL import Image, ImageDraw, ImageFont, ImageFilter
from random import randintclass L_BLUR(ImageFilter.BuiltinFilter):name = "l_blur"filterargs = (5, 5), 16, 0, (1, 1, 1, 1, 1,1, 0, 0, 0, 1,1, 0, 0, 0, 1,1, 0, 0, 0, 1,1, 1, 1, 1, 1,)# random.randint(M, N) 产生一个M到N的随机整数
def rand_img_color():return randint(0,255), randint(0,255), randint(0,255)
def rand_num_color():return randint(0,127), randint(0,127), randint(0,127)
def rand_zh():return chr(randint(0x4E00,0x9FBF))
def rand_char():# 小写字母return chr(randint(97,122))# 大写字母# return chr(randint(65,90))
def rand_num():return str(randint(0,9))# 1.创建空图片
image = Image.new('RGB',(120,60),(255,255,255))
draw = ImageDraw.Draw(image)# 2.渲染背景
for x in range(0,120):for y in range(0,60):draw.point((x, y), rand_img_color())
w, h = (image.size)
draw.line((w/4,0) + (w/4,h), fill=rand_img_color(), width=3)
draw.line((w/2,0) + (w/2,h), fill=rand_img_color(), width=3)
draw.line((w/4*3,0) + (w/4*3,h), fill=rand_img_color(), width=3)
draw.line((0,h/2) + (w,h/2), fill=rand_img_color(), width=3)
image = image.filter(L_BLUR)# 3.渲染文字
font = ImageFont.truetype('simhei.ttf', 30)
draw = ImageDraw.Draw(image)
for x in range(4):y = randint(10,30)draw.text((30*x,y), rand_num(), rand_num_color(), font)image.show()
使用OpenCV读取图像
OpenCV中文官方文档
cv.imread()
读取图像第一个参数是路径
第二个参数是一个标志,指定读取图像的方式,如下:
cv.IMREAD_COLOR
:可以传递整数1,加载彩色图像。任何图像的透明度都会忽视。默认cv.IMREAD_GRAYSCALE
:可以传递整数0,以灰度模式加载图像cv.IMREAD_UNCHANGED
:可以传递整数-1,加载图像,包括alpha通道
即使图像路径错误,它也不会引发任何错误,但是
print(img) -> None
cv.imshow()
显示图像第一个参数是窗口名称,字符串类型
第二个参数是我们的读取的图片
cv.namedWindow
调整指定窗口大小cv.WINDOW_NORMAL
默认cv.WINDOW_NORMAL
可以调整窗口大小
cv.waitKey()
键盘绑定函数,其参数以毫秒为单位的时间cv.destoryAllWindows()
破坏我们创建的所有窗口cv.imwrite()
保存图像第一个参数是文件名
第二个参数是要保存的图像
import cv2 as cv
import numpy as np
#加载灰度图像
img = cv.imread('messi5.jpg',0)#cv.namedWindow('image', cv.WINDOW_NORMAL)
cv.imshow('image', img)
k = cv.waitKey(0)
if k == 27; # 等待ESC退出 KeyCodecv.destoryAllWindows()
elif k == ord('s'): # 等待关键字,保存和退出cv.imwrite('messigray.png', img)cv.destoryAllWindows()
切割图片
先用np.fromfile()
读取为np.uint8
格式,再使用cv2.imdecode()
解码
import cv2
import numpy as np
# cv2.imread路径为中文时返回None
# 读取图像,解决imread不能读取中文路径的问题
img = cv2.imdecode(np.fromfile(image_path,dtype=np.uint8),-1)
cropped = img[coor_y1:coor_y2,coor_x1:coor_x2]
cv2.imencode('.jpg', cropped)[1].tofile(save_path)
各种图像转换
OpenCv使用BGR格式,PIL使用的是RGB格式
img.reshape(2,-1)
转换成两行
img.reshape(-1,2)
转换成两列
img.resize((width, height),Image.ANTIALIAS)
- Image.NEAREST :低质量
- Image.BILINEAR:双线性
- Image.BICUBIC :三次样条插值
- Image.ANTIALIAS:高质量
img = cv2.imdecode(np.fromfile(image_path,dtype=np.uint8),-1)
# 输出图像每个BGR像素值,转换成列表可一一遍历出来
img.reshape(-1,3)
# 更改图片大小
img_small = cv2.resize(img (320,180), interpolation=cv2.INTER_NEAREST)
img_height, img_width = img.shape
# 转RGB图
img_rgb = np.zeros((img_height, img_width), dtype=np.uint8)
图片信息
img.shape
它返回一组行、列和通道的元组 (如果图像是彩色的)
img.dtype
获得图像数据类型
# img.shape: (480, 640, 3)
img.shape[0] = height: 480
img.shape[1] = width: 640
img.shape[2] = channel: 3print(img.dtype) # uint8# 由于图片格式是BGR格式,需要把RGB转换成BGR
file = codecs.open(file_path, 'r', 'utf-8')
color_dict = {}
for line in file:label_id, scene, color = line.strip().split('\t')color_dict[(int(color.split(',')[2]), int(color.split(',')[1]), int(color.split(',')[0]))] = int(label_id)# 读取每一个像素点色值
color_set = {}
for img_color in list(img.reshape(-1,3)):if tuple(list(img_color)) not in color_set:color_set[tuple(list(img_color))] = 1# print(img_color)# 获取颜色近似值
def get_similar_color(color, color_list):dist_min = 3for c in color_list:sim_color = colordistance = (c[0]-color[0])**2 + (c[1]-color[1])**2 + (c[2]-color[2])**2if distance <= dist_min:sim_color = cprint(sim_color)return sim_colorget_similar_color((1, 1, 1), color_dict)
使用Matplotlib 读取图像
Matplotlib绘图样式和功能
import numpy as np
import cv2 as cv
from matplotlib import pyplot as pltimg = cv.imread('messo5.jpg', 0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
# 隐藏 x 轴和 y 轴的刻度值
plt.xticks([]),plt.yticks([])
plt.show()
使用OpenCV读取视频
要捕获视频,需要创建一个 VideoCapture 对象,它的参数可以是设备索引(哪个摄像头的名字)或视频文件的名称
FourCC
全称Four-Character Codes
,代表四字符代码, 它是一个32位的标示符,其实就是typedef unsigned int FOURCC
;是一种独立标示视频数据流格式的四字符代码。cv2.VideoWriter_fourcc()
函数的作用是输入四个字符代码即可得到对应的视频编码器cap.read()
返回布尔值(True/False),如果帧读取的是正确的,就是True。所以可以通过检查他的返回值来查看视频文件是否已经到了结尾cap.isOpened()
,来检查是否成功初始化,如果返回值是True,那就没有问题。否则就要使用函数cap.open()
。你可以使用函数cap.get(propId)
来获得视频的一些参数信息。这里propId可以是0到18的任何整数。每一个数代表视频的一个属性你要想设置新值,例如:可以使用
cap.get(3)
和cap.get(4)
来查看每一帧的宽和高。默认情况下得到的值是 640×480。但是我们可以使用ret=cap.set(3,320)
和ret=cap.set(4,240)
来把宽和高改成 320×240
import numpy as np
import cv2 as cvcap = cv.VideoCapture('vtest.avi')
# 使用XVID编码器
fourcc = cv.VideoWriter_fourcc(*'XVID')
# 保存文件名 编码器 帧率 视频宽高
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640,480))
while cap.isOpened():# 逐帧捕获ret, frame = cap.read()# 如果正确读取帧, ret为Trueif not ret:print("Can't receive frame (stream end?). Exiting ...")breakframe = cv.flip(frame, 0)out.imshow('frame', frame)# gray = cv.cvtColor(frame, cv_COLOR_BGR2GRAY)# 显示结果帧cv.imshow('frame', gray)if cv.waitKey(1) == ord('q'):break
# 完成所有操作后,释放捕获器
cap.release()
out.release()
cv.destroyAllWindows()
获取视频、帧率、分辨率等属性
参数 | propld | 功能 |
---|---|---|
cv2.CAP_PROP_POS_MSEC | 0 | 视频文件的当前位置(以毫秒为单位)或视频捕获时间戳 |
cv2.CAP_PROP_POS_FRAMES | 1 | 基于0的索引将被解码/捕获下一帧 |
cv2.CAP_PROP_POS_AVI_RATIO | 2 | 视频文件的相对位置:0 - 视频的开始,1 - 视频的结束 |
cv2.CAP_PROP_FRAME_WIDTH | 3 | 帧的宽度 |
cv2.CAP_PROP_FRAME_HEIGHT | 4 | 帧的高度 |
cv2.CAP_PROP_FPS | 5 | 帧速 |
cv2.CAP_PROP_FOURCC | 6 | 4个字符表示的视频编码器格式 |
cv2.CAP_PROP_FRAME_COUNT | 7 | 帧数 |
cv2.CAP_PROP_FORMAT | 8 | byretrieve()返回的Mat对象的格式 |
cv2.CAP_PROP_MODE | 9 | 指示当前捕获模式的后端特定值 |
cv2.CAP_PROP_BRIGHTNESS | 10 | 图像的亮度(仅适用于相机) |
cv2.CAP_PROP_CONTRAST | 11 | 图像对比度(仅适用于相机) |
cv2.CAP_PROP_SATURATION | 12 | 图像的饱和度(仅适用于相机) |
cv2.CAP_PROP_HUE | 13 | 图像的色相(仅适用于相机) |
cv2.CAP_PROP_GAIN | 14 | 图像的增益(仅适用于相机) |
cv2.CAP_PROP_EXPOSURE | 15 | 曝光(仅适用于相机) |
cv2.CAP_PROP_CONVERT_RGB | 16 | 表示图像是否应转换为RGB的布尔标志 |
cv2.CAP_PROP_WHITE_BALANCE | 17 | 目前不支持 |
cv2.CAP_PROP_RECTIFICATION | 18 | 立体摄像机的整流标志 |
cap = cv2.VideoCapture(video_path)
fps = int(cap.get(cv2.CAP_PROP_FPS))
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
frame_all = cap.get(cv2.CAP_PROP_FRAME_COUNT)
python 处理 图像和视频相关推荐
- 基于微软开源深度学习算法,用 Python 实现图像和视频修复
作者 | 李秋键 编辑 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 图像修复是计算机视觉领域的一个重要任务,在数字艺术品修复.公安刑侦面部修复等种种实际场景中被广泛应用.图像 ...
- opencv mat release thrown_【OpenCV+Python】图像与视频处理入门
图像处理入门 之前我们已经讲过了OpenCV在各个平台上安装的方法了,从今天开始,正式进入实战部分.首先我们需要做的就是如何读取图像并显示出来,这是图像处理的最基本的部分. 首先我们来了解几个函数. ...
- [转载] 使用Python+OpenCV实现在视频中某对象后添加图像
参考链接: Python Opencv 基础3 : resize 调整图像大小 概述 在运动物体后面添加图像是一个典型的计算机视觉项目了解如何使用传统的计算机视觉技术在视频中添加logo 介绍 我的一 ...
- Python爬虫新手进阶版:怎样读取非结构化网页、图像、视频、语音数据
导读:常见的数据来源和获取方式,你或许已经了解很多.本文将拓展数据来源方式和格式的获取,主要集中在非结构化的网页.图像.视频和语音. 01 从网页中爬取运营数据 要从网页中爬虫数据,可使用Python ...
- python 图像和视频互相转换
python 图像和视频互相转换 预备条件 视频转图像 图像转视频 完整代码 预备条件 创建两个文件夹,将视频放在video文件夹里 我拍的视频,视频链接 提取码:t1zj 视频转图像 import ...
- Python图像处理【1】图像与视频处理基础
图像与视频处理基础 0. 前言 1. 在 3D 空间中显示 RGB 图像颜色通道 1.1 图像表示 1.2 在 3D 空间中绘制颜色通道 2. 使用 scikit-video 读/写视频文件 2.1 ...
- 使用Python+OpenCV实现在视频中某对象后添加图像
概述 在运动物体后面添加图像是一个典型的计算机视觉项目 了解如何使用传统的计算机视觉技术在视频中添加logo 介绍 我的一位同事向我提出了一个挑战--建立一个计算机视觉模型,可以在视频中插入任何图像, ...
- 使用Python,Opencv检测图像,视频中的猫
使用Python,Opencv检测图像,视频中的猫
- python opencv 录制视频_如何使用OpenCV、Python和深度学习在图像和视频中实现面部识别?...
Face ID 的兴起带动了一波面部识别技术热潮.本文将介绍如何使用 OpenCV.Python 和深度学习在图像和视频中实现面部识别,以基于深度识别的面部嵌入,实时执行且达到高准确度. 以下内容由 ...
- Python 计算机视觉(十六)—— 图像和视频中的人脸识别
参考的一些文章以及论文我都会给大家分享出来 -- 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了.大家一起学习,一起 ...
最新文章
- javascript刷新页面的集中办法
- 【小知识】为什么负数除二和右移一位的结果不一样?
- C/C++ 头文件作用
- 【C++ STL】vector库使用方法
- 展示博客(Beta阶段)
- 自己写的thinkphp自动生成类
- SAP Spartacus 因为 refresh token 刷新令牌过期后显示用户重新登录页面的逻辑
- 不支持对系统目录进行即席更新_「目录」让你的文档结构一目了然
- web通信 长连接、长轮询
- 【深度学习】Tensorflow的基本操作
- python—os模块、时间模块
- python 享元模式_设计模式-创建型模式,python享元模式 、python单例模式(7)
- 大数据的关键不是“大”,而是你真的需要它吗
- Anroid性能优化系列——Improving Layout Performance(三)
- 爪哇国新游记之二十----将数字转换成中国汉字大写形式
- FileInputStream实现读取文件内容并输出到屏幕上
- 插头插座新旧标准对比和安规测试设备
- doolittle分解matlab,Doolittle分解法(LU分解)详细分析以及matlab的实现
- c语言的vcl库函数下载,VCL手册 PDF
- gprs无线模块与服务器连接,GPRS 模块如何通信_GPRS 模块与服务器通信【原理解析】...
热门文章
- 纯css动画效果--animate的应用
- CUDAnumba | 使用python分别在cpu和gpu全局内存和gpu共享内存进行矩阵乘法运算
- java 学生学籍管理系统_JAVA测验—学生学籍管理系统
- 战舰 Linux服务端,战舰帝国一键端手游服务端+GM工具+视频教程
- feedsky 话题 营销
- 纪念feedsky彻底成为广告公司
- Java 枚举 ordinal 使用以及介绍
- C++17之std::apply与std::make_from_tuple
- python基础知识学习
- mysql安装ecshop_如何安装ecshop