图像入门

使用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()
其他内置参数

常用属性

  1. Image.format 源图像格式
  2. Image.mode 图像模式字符串
  3. Image.size 图像尺寸

内置函数

使用Python PIL进行图像压缩

  1. Image.gethands() 获取图像每个通道的名称列表,例如RGB图像返回[‘R’,'G,'B]

  2. Image.getextrema() 获取图像最大、最小像素的值

  3. Image.crop(int(left),int(top),int(right),int(bottom)) 图片裁剪

    region=im.crop((100,100,500,500))

  4. Image.getpixel(x,y) 获取像素点值

    im.getpixel((4,4))

  5. Image.putpixel((x,y),(r,g,b)) 写入像素点值

    img.putpixel((4,4),(255,0,0))

  6. Image.point(function) 使用函数修改图像的每个像素

    out=img.point(lambda i:i*1.5) 对每个点进行50%的加强

  7. Image.histogram(mask=None,extrema=None) 获取图像直方图,返回像素计数的列表

  8. Image.putalpha(alpha) 添加或替换图像的alpha层

  9. Image.blend(img1,img2,alpha) 两张图片相加

  10. Image.save(fp,format=None,**params) 保存图片

  11. Image.show(title=None,command=None) 显示图片

  12. Image.transform(size,method,data=None,resample=0,fill=1) 变换图像

  13. Image.verify() 检验文件是否损坏

  14. 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中文官方文档

  1. cv.imread() 读取图像

    第一个参数是路径

    第二个参数是一个标志,指定读取图像的方式,如下:

    • cv.IMREAD_COLOR :可以传递整数1,加载彩色图像。任何图像的透明度都会忽视。默认
    • cv.IMREAD_GRAYSCALE :可以传递整数0,以灰度模式加载图像
    • cv.IMREAD_UNCHANGED :可以传递整数-1,加载图像,包括alpha通道

    即使图像路径错误,它也不会引发任何错误,但是 print(img) -> None

  2. cv.imshow() 显示图像

    第一个参数是窗口名称,字符串类型

    第二个参数是我们的读取的图片

    cv.namedWindow 调整指定窗口大小

    • cv.WINDOW_NORMAL 默认
    • cv.WINDOW_NORMAL 可以调整窗口大小

    cv.waitKey() 键盘绑定函数,其参数以毫秒为单位的时间

    cv.destoryAllWindows() 破坏我们创建的所有窗口

  3. 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读取视频

  1. 要捕获视频,需要创建一个 VideoCapture 对象,它的参数可以是设备索引(哪个摄像头的名字)或视频文件的名称

    FourCC 全称 Four-Character Codes ,代表四字符代码, 它是一个32位的标示符,其实就是 typedef unsigned int FOURCC ;是一种独立标示视频数据流格式的四字符代码。 cv2.VideoWriter_fourcc() 函数的作用是输入四个字符代码即可得到对应的视频编码器

  2. cap.read() 返回布尔值(True/False),如果帧读取的是正确的,就是True。所以可以通过检查他的返回值来查看视频文件是否已经到了结尾

  3. cap.isOpened() ,来检查是否成功初始化,如果返回值是True,那就没有问题。否则就要使用函数 cap.open()。你可以使用函数 cap.get(propId) 来获得视频的一些参数信息。这里propId可以是0到18的任何整数。每一个数代表视频的一个属性

  4. 你要想设置新值,例如:可以使用 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 处理 图像和视频相关推荐

  1. 基于微软开源深度学习算法,用 Python 实现图像和视频修复

    ‍‍ 作者 | 李秋键 编辑 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 图像修复是计算机视觉领域的一个重要任务,在数字艺术品修复.公安刑侦面部修复等种种实际场景中被广泛应用.图像 ...

  2. opencv mat release thrown_【OpenCV+Python】图像与视频处理入门

    图像处理入门 之前我们已经讲过了OpenCV在各个平台上安装的方法了,从今天开始,正式进入实战部分.首先我们需要做的就是如何读取图像并显示出来,这是图像处理的最基本的部分. 首先我们来了解几个函数. ...

  3. [转载] 使用Python+OpenCV实现在视频中某对象后添加图像

    参考链接: Python Opencv 基础3 : resize 调整图像大小 概述 在运动物体后面添加图像是一个典型的计算机视觉项目了解如何使用传统的计算机视觉技术在视频中添加logo 介绍 我的一 ...

  4. Python爬虫新手进阶版:怎样读取非结构化网页、图像、视频、语音数据

    导读:常见的数据来源和获取方式,你或许已经了解很多.本文将拓展数据来源方式和格式的获取,主要集中在非结构化的网页.图像.视频和语音. 01 从网页中爬取运营数据 要从网页中爬虫数据,可使用Python ...

  5. python 图像和视频互相转换

    python 图像和视频互相转换 预备条件 视频转图像 图像转视频 完整代码 预备条件 创建两个文件夹,将视频放在video文件夹里 我拍的视频,视频链接 提取码:t1zj 视频转图像 import ...

  6. Python图像处理【1】图像与视频处理基础

    图像与视频处理基础 0. 前言 1. 在 3D 空间中显示 RGB 图像颜色通道 1.1 图像表示 1.2 在 3D 空间中绘制颜色通道 2. 使用 scikit-video 读/写视频文件 2.1 ...

  7. 使用Python+OpenCV实现在视频中某对象后添加图像

    概述 在运动物体后面添加图像是一个典型的计算机视觉项目 了解如何使用传统的计算机视觉技术在视频中添加logo 介绍 我的一位同事向我提出了一个挑战--建立一个计算机视觉模型,可以在视频中插入任何图像, ...

  8. 使用Python,Opencv检测图像,视频中的猫

    使用Python,Opencv检测图像,视频中的猫

  9. python opencv 录制视频_如何使用OpenCV、Python和深度学习在图像和视频中实现面部识别?...

    Face ID 的兴起带动了一波面部识别技术热潮.本文将介绍如何使用 OpenCV.Python 和深度学习在图像和视频中实现面部识别,以基于深度识别的面部嵌入,实时执行且达到高准确度. 以下内容由 ...

  10. Python 计算机视觉(十六)—— 图像和视频中的人脸识别

    参考的一些文章以及论文我都会给大家分享出来 -- 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了.大家一起学习,一起 ...

最新文章

  1. javascript刷新页面的集中办法
  2. 【小知识】为什么负数除二和右移一位的结果不一样?
  3. C/C++ 头文件作用
  4. 【C++ STL】vector库使用方法
  5. 展示博客(Beta阶段)
  6. 自己写的thinkphp自动生成类
  7. SAP Spartacus 因为 refresh token 刷新令牌过期后显示用户重新登录页面的逻辑
  8. 不支持对系统目录进行即席更新_「目录」让你的文档结构一目了然
  9. web通信 长连接、长轮询
  10. 【深度学习】Tensorflow的基本操作
  11. python—os模块、时间模块
  12. python 享元模式_设计模式-创建型模式,python享元模式 、python单例模式(7)
  13. 大数据的关键不是“大”,而是你真的需要它吗
  14. Anroid性能优化系列——Improving Layout Performance(三)
  15. 爪哇国新游记之二十----将数字转换成中国汉字大写形式
  16. FileInputStream实现读取文件内容并输出到屏幕上
  17. 插头插座新旧标准对比和安规测试设备
  18. doolittle分解matlab,Doolittle分解法(LU分解)详细分析以及matlab的实现
  19. c语言的vcl库函数下载,VCL手册 PDF
  20. gprs无线模块与服务器连接,GPRS 模块如何通信_GPRS 模块与服务器通信【原理解析】...

热门文章

  1. 纯css动画效果--animate的应用
  2. CUDAnumba | 使用python分别在cpu和gpu全局内存和gpu共享内存进行矩阵乘法运算
  3. java 学生学籍管理系统_JAVA测验—学生学籍管理系统
  4. 战舰 Linux服务端,战舰帝国一键端手游服务端+GM工具+视频教程
  5. feedsky 话题 营销
  6. 纪念feedsky彻底成为广告公司
  7. Java 枚举 ordinal 使用以及介绍
  8. C++17之std::apply与std::make_from_tuple
  9. python基础知识学习
  10. mysql安装ecshop_如何安装ecshop