python 图像处理类库 PIL (二)(python图像处理模块)
off999 2024-10-29 14:57 31 浏览 0 评论
和上一篇《python 图像处理类库 PIL (一)》一样,本文依然以图片 dog.jpeg 为例,演示 PIL Image 模块的实例接口。
1. 导入 Image 模块,打开 dog.jpeg 图片
from PIL import Image
image = Image.open("dog.jpeg")
复制代码
2. 读取图片属性
2.1 宽高尺寸(像素)
width, height = image.size
print("width: {} pixels\nheight: {} pixels".format(width, height))
复制代码
width: 320 pixels
height: 320 pixels
复制代码
2.2 色彩模式
mode = image.mode
print("color mode: ", mode)
复制代码
color mode: RGB
复制代码
2.3 存储格式
format = image.format
print("image format: ", format)
复制代码
image format: JPEG
复制代码
2.4 元信息
image.info
复制代码
{'dpi': (72, 72),
'exif': b'Exif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x05\x01\x12\x00\x03\x00\x00\x00\x01\x00\x01\x00\x00\x01\x1a\x00\x05\x00\x00\x00\x01\x00\x00\x00J\x01\x1b\x00\x05\x00\x00\x00\x01\x00\x00\x00R\x01(\x00\x03\x00\x00\x00\x01\x00\x02\x00\x00\x87i\x00\x04\x00\x00\x00\x01\x00\x00\x00Z\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x01\x00\x00\x00H\x00\x00\x00\x01\x00\x03\xa0\x01\x00\x03\x00\x00\x00\x01\x00\x01\x00\x00\xa0\x02\x00\x04\x00\x00\x00\x01\x00\x00\x01@\xa0\x03\x00\x04\x00\x00\x00\x01\x00\x00\x01@\x00\x00\x00\x00',
'jfif': 257,
'jfif_density': (72, 72),
'jfif_unit': 0,
'jfif_version': (1, 1),
'parsed_exif': {274: 1,
282: (72, 1),
283: (72, 1),
296: 2,
34665: 90,
40961: 1,
40962: 320,
40963: 320},
'photoshop': {1028: b'',
1061: b'\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\t\x98\xec\xf8B~'}}
复制代码
3. 读取图片数据
3.1 load()
返回一个像素访问对象。像素访问对象的行为很像一个二维数组,可以通过下标 [x, y] 的方法,访问和修改像素值。通常情况下,我们不需要调用此方法,Image 类会在第一次访问图片数据时,自动调用此方法。
ps: Image.open() 是一个懒操作,在调用 load() 或其他数据访问方法前,并未读取图片数据,而仅仅读取图片的属性信息。
pix = image.load()
x = image.size[0] // 2
y = image.size[1] // 2
pixdata = pix[x, y]
print("pixel at ({},{}) is {}.".format(x, y, pixdata))
复制代码
pixel at (160,160) is (184, 171, 155).
复制代码
3.2 getdata()
返回一个图像数据的序列化对象。与 load() 方法不同的是,返回序列化对象行为像一个一维数组。也就说图像的第一行后紧跟着第二行数据。可以通过 list(image.getdata()) 将其转换为普通列表。
image_data = image.getdata()
if len(image_data) == image.size[0] * image.size[1]:
print("length of image.getdata() is equal to the total number of pixels.")
print("pixel data from 318 to 322 is ", list(image_data)[318:322])
复制代码
length of image.getdata() is equal to the total number of pixels.
pixel data from 318 to 322 is [(144, 90, 44), (144, 90, 44), (130, 78, 38), (130, 78, 38)]
复制代码
很多情况,我们希望得到关于图片数据是一个二维数组的形式,这就需要我们自己动手将 getdata() 返回的序列化对象,转化成二维数组或列表。
以下提供三种方法,同时,为了便于比较各方法的执行效率,分别打印输出了转化过程所花时间。
3.2.1 直接遍历序列化对象生成二维列表
from time import time
w, h = image.size
start_time = time()
image_data_2d_1 = []
row = 0
for i, pixdata in enumerate(image_data):
if i % w == 0:
image_data_2d_1.append([])
row = i // w
image_data_2d_1[row].append(pixdata)
print("cost time: {} ms".format((time()-start_time)*1000))
复制代码
cost time: 47.84393310546875 ms
复制代码
3.2.2 使用列表切片生成二维列表
getdata() 返回的序列化对象只支持整数下标,不支持切片方式访问元素,因此需要使用 list() 转换为列表。
start_time = time()
image_data_list = list(image_data)
image_data_2d_2 = [image_data_list[w*i:w*(i+1)] for i in range(h)]
print("cost time: {} ms".format((time()-start_time)*1000))
复制代码
cost time: 18.110036849975586 ms
复制代码
3.2.3 使用 numpy.array() 生成二维数组
numpy.array() 可以直接对 PIL 图片对象进行转化,无需调用 getdata() 方法。
import numpy as np
start_time = time()
image_data_2d_3 = np.array(image)
print("cost time: {} ms".format((time()-start_time)*1000))
复制代码
cost time: 0.6780624389648438 ms
复制代码
通过比较,三种转化方法所用时间 直接遍历 > 列表切片 > numpy。因此,使用 numpy 转化的效率是最高。在不导入 numpy 情况,首选使用列表切片的方式进行二维列表的转化。
3 split(): 分离颜色通道
返回一个 Image 对象元组。元组的元素为各颜色通道分离出来的单通道图片。例如,RGB 图片,返回的就是图片 R,G,B 三个颜色通过对应的灰度图。
R, G, B = image.split() R.show() G.show() B.show() 复制代码
传送门
- 上一篇 python 图像处理类库 PIL (一)
坚持写专栏不易,如果觉得本文对你有帮助,记得点个赞。感谢支持!
- 个人网站: kenblog.top
- github 站点: kenblikylee.github.io
参考文献:K码农-http://kmanong.top/kmn/qxw/form/home?top_cate=28
相关推荐
- 戴尔官网保修查询入口(戴尔售后保质期查询)
-
可以按照以下步骤查询戴尔笔记本电脑的保修期:1.打开戴尔官网:https://www.戴尔.com/zh-cn/售后服务/保修政策.html2.点击页面上方的“服务与支持”按钮,进入戴尔的服务支持...
- 手机号邮箱登录入口(手机号邮箱官网)
-
手机163邮箱登录入口如下:163邮箱官网入口:https://smart.mail.163.com/login.htm点击进入登录或者注册邮箱即可。手机浏览器访问进入官网http://www.123...
- sd卡(sd卡无法读取怎么修复)
-
SD卡是大卡,相机用的;普通的手机内存卡,是小卡,正规的名称是macrosd卡,也就是微型SD卡。可以通过卡套转为普通的SD卡的大小。 其实就是大小不同。但手机上的内存卡,人们经常也俗称为SD...
- windows7蓝牙功能在哪里打开
-
点击搜索框在windows7系统主界面点击开始菜单,点击打开搜索框。输入命令输入services.msc后回车,在列表中找到并右击BluetoothSupportS...点击属性选择进入属性菜单,...
-
- 2010激活密钥(microsoft2010激活密钥)
-
步骤/方式1officeprofessionalplus2010:(office专业版)6QFdx-pYH2G-ppYFd-C7RJM-BBKQ8Bdd3G-xM7FB-Bd2HM-YK63V-VQFdKVYBBJ-TRJpB-QFQ...
-
2025-11-19 04:03 off999
- 联想官方刷新bios工具(联想电脑刷新bios)
-
刷新BIOS需要使用联想的官方网站或授权维修中心来进行操作。以下是一些基本步骤:1.访问联想的官方网站,找到BIOS更新程序并下载。在下载过程中,请确保选择与您计算机型号匹配的版本。2.将下载的B...
-
- 苹果ios14系统下载(苹果ios14.1下载)
-
1方法一步骤/方式一打开Appstore。步骤/方式二在搜索栏点击搜索框。步骤/方式三搜索并点击需要下载的软件。步骤/方式四点击获取。步骤/方式五最后验证ID密码即可。1.在应用商店搜索你要下载的应用名称。2.点击下载按钮,如果要求登...
-
2025-11-19 03:03 off999
- office2010怎么免费永久激活密钥
-
用这个试试,一个KMS激活工具可以激活2010到2019的Office自家的目前用的就是这个microsoft6477.moe/1716.html直接使用这个Microsoftoffice2010...
-
- 类似爱加速的国内ip(类似爱加速的app)
-
推荐“V8盒子”。这一款免费无广告的模拟器,不同于其它软件盒子,而是类似于X8沙箱,满足游戏多开,画中画,悬浮球操作,熄屏后台运行等多功能的沙箱盒子.支持一键root,一键安装xposed框架,能在安卓/苹果手机上运行多个安卓/ios虚拟系...
-
2025-11-19 02:03 off999
- 阿里旺旺手机客户端(阿里旺旺手机app)
-
手机淘宝的旺旺在打开商品后,会看到左下角有个旺旺的图标,点击就可以联系了。 阿里旺旺是将原先的淘宝旺旺与阿里巴巴贸易通整合在一起的一个新品牌。它是淘宝和阿里巴巴为商人量身定做的免费网上商务沟通软件,...
- 最纯净的pe装机工具(pe工具哪个纯净)
-
U盘装系统步骤:1.制作U盘启动盘。这里推荐大白菜U盘启动盘制作工具,在网上一搜便是。2.U盘启动盘做好了,我们还需要一个GHOST文件,可以从网上下载一个ghost版的XP/WIN7/WIN8系统,...
- 装一个erp系统多少钱(wms仓库管理软件)
-
现在主流有客户端ERP和云端ERP两种客户端通常一次买断,价格在万元左右,但是还有隐性费用,你需要支付服务器、数据管理员,此外如果系统需要更新维护,你还需要支付另外一笔不菲的费用。云端ERP:优势...
- cad2014序列号和密钥永久(autocad2014序列号和密钥)
-
1在cad2014中修改标注样式后,需要将其保存2单击“样式管理器”按钮,在弹出的窗口中选择修改后的标注样式,然后单击“设置为当前”按钮,再单击“保存当前样式”按钮,将其保存为新的样式名称3为了...
- qq修改密保手机号(qq修改密保手机号是什么意思)
-
QQ更改绑定的手机号码操作步骤如下:1、打开手机主界面,找到“QQ”软件点击打开。2、输入正确的QQ账户和密码登录到qq主界面。3、点击左上角的头像“图片”,进入到个人中心界面。4、进入到个人中心界面...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
