python基础 | 核心库:PIL
1、读取图像信息
查看图像信息
读取同一文件夹下的文件 可加 ./可不加
rom PIL import Image
img = Image.open('image.jpg') # 打开图像文件(注意:是去掉文件头的纯数据)
print(img.format) # 图像格式(如BMP PNG JPEG 等)
print(img.size) # 图像大小(宽,高) 注意 省略了通道 (w,h)
print(img.mode) # RGB 图像颜色模式(L:灰度图 RGB:真彩色 RGBA:添加了透明通道)
img.show() # 显示图像
运行结果
linux里面png格式比较多,网络传输里面压缩格式 JPEG格式比较多,BMP无损格式
2、修改图像颜色
PNG有透明通道,jpeg就没有,不能变成 透明半透明;变成灰度图 减少信息,只留轮廓,去掉颜色信息
RGB一个像素点的位数占24位,L一个像素点占8位
from PIL import Image
img = Image.open('image.jpg')
img = img.convert('L') #转换为灰度黑白图像 -> 只保留能识别轮廓的明暗对比,# 大幅减少了数据( 24位深 RGB 转8位 L)
img.show()
3、图像缩放
resize不会在原来的图像上修改,改完之后 需要 有变量存储
等比例放大缩小:等比例,注意需要是整数,所以 需要强制类型转换
from PIL import Image
img = Image.open('image.jpg')
print(img.size)
img = img.resize((32, 24),Image.ANTIALIAS) #修改图像的宽高尺寸
print(img.size)
img.show()# 等比例缩放
img = img.resize(int(img.size[0]/4),int(img.size[1]/4))
print(img.size)
img.show()
4、图像旋转 / 翻转
图像旋转
import numpy as np
from PIL import Image
img = Image.open('image.jpg')
img = img.rotate(90) #逆时针旋转90度
img.show();
图像翻转
import numpy as np
from PIL import Image
img = Image.open('image.jpg')
img = img.transpose(Image.FLIP_LEFT_RIGHT) #左右翻转
img.show();
5、图像转numpy(数组)
图像就是 一个矩阵,有很多像素点,每个点表示颜色,8位图 就有256种(0-255)表示颜色,色彩丰富 位数越多
一共3个维度,最后一维表示几张图叠加 RGB就是 红绿蓝 RGBA再加一个透明半透明选项(255是不透明)
灰度图就只有 高和宽,只有一个通道,是一个 二维的数组
/ 256 把值都整到0-1之间(到同一个量级,不同的信息可以做相关的运算) 归一化
import numpy as np
from PIL import Image
img = Image.open('image.jpg')
obj= np.array(img) # 转换图像为 numpy
print(obj.shape) # 形状: RGB三通道 每个通道为240行*320列矩阵 来表示本通道的灰度(明暗对比)
print(obj[0][1]) # 像素内容: 0行1列的像素点对应的R G B值img = img.convert('L') # 转换为灰度黑白图像 -> 只保留能识别轮廓的明暗对比,大幅减少了数据( 24位深 RGB 转8位 L)
obj = np.asarray(img, dtype='float64')/256 # 转换图像为numpy ( 除以256是为了归一化,# 使值都在0~1间,float64是指定数据类型保持精度)# array和asarray类似,只是array会copy该对象,而asarray 必要时才copy
print(obj.shape) # 形状: 只保留了1通道的灰度
print(obj[0][1]) # 像素内容:0行1列的像素点对应的灰度值 (因前面除以了256 归一化后为0~1间的数)
运行结果
6、查看图像数据
{0:3d} 的意思是将第一个参数(索引为 0 的参数)格式化为一个占据 3 个字符宽度的整数,如果不足 3 个字符宽度则在左侧填充空格
通过numpy可以查看图片矩阵的数字
import numpy as np
from PIL import Image
img = Image.open('8.bmp')
img = img.convert('L') # 转为灰度图像(1像素 占8位)
obj= np.array(img) # 图像转为numpy
print(obj.shape) # (28 28) 图像矩阵形状为 28行 *28列# 输出图像数据 -> 8字 的像素矩阵
for i in range(obj.shape[0]):for j in range(obj.shape[1]):print('{0:3d} '.format(obj[i][j]),end="") # i:图像行号 j:图像列号 中间间隔“ ” print('E') # 每行末尾加一个E
7、转为 指定格式的图像存储
把图片改完之后不能直接存,先换成数组(去掉图片信息),再变成图像存储(再加上图片信息,就变成不同的格式)
第二种方式 pip install scipy
安装对应库
# 方法一:
import numpy as np
from PIL import Imageimg = Image.open('1.png')
print(img.format,img.size,img.mode)img = img.convert('RGB')
img = img.resize((320, 240),Image.ANTIALIAS)obj= np.array(img)
img = Image.fromarray(obj)
img.save('1.jpg') # 把n维数组存为图像(可根据后缀,自动转换为bmp png jpg等存储)img = Image.open('1.jpg')
print(img.format,img.size,img.mode)# 方法二:
import numpy as np
from PIL import Image
from scipy import misc
img = Image.open('8.bmp')
img = img.convert('L')
obj= np.array(img)
misc.imsave('8_8bit.png', obj) # 把n维数组存为图像(可根据后缀,自动转换为bmp png jpg等存储)
8、图像拼接
import os
from PIL import Image
import numpy as npdef mergePic(files):baseimg=Image.open(files[0])basemat=np.atleast_2d(baseimg) # 转换图像为 至少两维的numpyfor file in files[1:]: # 遍历除第一个外的numpyim=Image.open(file)mat=np.atleast_2d(im)basemat=np.append(basemat,mat,axis=1) # 横向追加图像(axis=0时为纵向)img=Image.fromarray(basemat)img.save('merge.png')path = "./pic/" # 注:该路径下的图像,必须是相同格式,尺寸的图像
images = [] # 先存储所有的图像的名称
for root, dirs, files in os.walk(path):for f in files :images.append(path+f)
print(images,len(images))mergePic(images)
basemat=np.append(basemat,mat,axis=1)
使用 NumPy 的 np.append() 函数将当前遍历到的图片数组沿着横轴(axis=1)方向追加到基础图像数组 basemat 后面,生成新的基础图像数组,并将其赋值给 basemat 变量。
img=Image.fromarray(basemat)
使用 PIL 库的 Image.fromarray() 方法将 NumPy 数组 basemat 转换为图像对象,并将其赋值给 img 变量
images.append(path+f)
将每个文件的完整路径添加到 images 列表中
相关文章:
python基础 | 核心库:PIL
1、读取图像信息 查看图像信息 读取同一文件夹下的文件 可加 ./可不加 rom PIL import Image img Image.open(image.jpg) # 打开图像文件(注意:是去掉文件头的纯数据) print(img.format) # 图像格式(如BMP PNG JPEG 等) print(img.size) # 图像大小(…...
#Linux系统编程(共享内存)
(一)发行版:Ubuntu16.04.7 (二)记录: (1)什么是共享内存 共享内存是System V版本的最后一个进程间通信方式。共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑…...
蓝桥杯备考随手记: practise01
问题描述: 小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。 请问,在 1 到 2019 中,所有这样的数的和是多少? 思路分析…...
【openGL4.x手册09】转换反馈
目录 一、说明二、着色器设置2.2 捕获的数据格式2.2 高级交错2.3 双精度和对齐2.4 In-shader规范 三、缓冲区绑定四、反馈过程五、反馈对象5.1 反馈暂停和恢复5.2 绑定暂停的反馈对象。 六、反馈渲染七、局限性 一、说明 转换反馈是捕获由顶点处理步骤生成的基元的过程…...
记录一次报错提示npx update-browserslist-db@latest
1,定位文件夹位置 找到HBuilderX的安装目录, cmd切换到HBuilderX/plugins/uniapp-cli下 删除node_modules以及package-lock.json 在当前目录执行npm install 重新打开HBuilderX运行 2, 删除后,再次通过hbuilderX启动微信小程序,会…...
【Go】二、Go的基本数据类型
文章目录 0、进制1、变量的声明2、数据类型3、整型4、浮点型5、字符类型6、布尔类型7、字符串类型8、基本数据类型的默认值9、类型转换10、基本类型转String11、String转其他类型 0、进制 N进制,逢N进一 1、变量的声明 //声明 赋值 var age int 18//声明、赋值、…...
十一、Spring源码学习之registerListeners方法
registerListeners()方法 protected void registerListeners() {// Register statically specified listeners first.//获取容器中事件监听并存放到多播器中 applicationListenersfor (ApplicationListener<?> listener : getApplicationListeners()) {getApplicationE…...
Oracle 控制文件详解
1、控制文件存储的数据信息 1)数据库名称和数据库唯一标识符(DBID) 2)创建数据库的时间戳 3)有关数据文件、联机重做日志文件、归档重做日志文件的信息 4)表空间信息 5)检查点信息 6)日志序列号…...
活体成像应用染料CY3.5-NHS星戈瑞
活体成像是一种生物医学研究的重要工具,它能够实时、无创地观察生物体内细胞和分子的动态变化。染料CY3.5-NHS,作为一种常用的活体成像染料,在许多生物医学研究中发挥着关键作用。本文将详细介绍染料CY3.5-NHS的特点、应用以及优势࿰…...
【优选算法】专题1 -- 双指针 -- 复写0
前言: 补充一下前文没有写到的双指针入门知识:专题1 -- 双指针 -- 移动零 目录 基础入门知识: 1. 复写零(easy) 1. 题⽬链接:1089.复习0 - 力扣(LeetCode) 2. 题⽬描述ÿ…...
GESP Python编程三级认证真题 2024年3月
Python 三级 2024 年 03 月 1 单选题(每题 2 分,共 30 分) 第 1 题 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( ) A. 小程序 B. 计时器 C. 操作系统…...
前端理论总结(css3)——link/import区别 // 伪类/伪元素
伪类/伪元素 1: 伪类使用1个冒号,常见的有::hover,:link,:active,:target,:not(),:focus等 伪元素使用 2 个冒号,常见的有:::before&…...
ntp服务器搭建
1、手动修改时区 CST可以为如下4个不同的时区的缩写: 美国中部时间:Central Standard Time (USA) UT-6:00 澳大利亚中部时间:Central Standard Time (Australia) UT+9:30 中国标准时间:China Standard Time UT+8:00 古巴标准时间:Cuba Standard Time UT-4:00小结: UTC:…...
对象的内存布局
在Java虚拟机(HotSpot)中,对象在 Java 内存中的 存储布局 可分为三块: 对象头 存储区域实例数据 存储区域对齐填充 存储区域 对象头区域: 存储对象自身的运行时数据,如:哈希码、GC分代年龄、锁状…...
docker centos7离线安装ElasticSearch单机版
目录 1.下载ES并解压2.新建elasticsearch用户3.修改ES配置文件4.启动ES服务5.设置开机启动 本文以 elasticsearch-7.8.1为例。 1.下载ES并解压 cd /root/install wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.1-linux-x86_64.tar.gz tar -z…...
【计算机网络】IP 协议
网络层IP协议 一、认识 IP 地址二、IP 协议报头格式三、网段划分1. 初识子网划分2. 理解子网划分3. 子网掩码4. 特殊的 IP 地址5. IP 地址的数量限制6. 私有 IP 地址和公网 IP 地址7. 理解全球网络(1)理解公网(2)理解私网…...
刷题DAY38 | LeetCode 509-斐波那契数 70-爬楼梯 746-使用最小花费爬楼梯
509 斐波那契数(easy) 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1)…...
蓝桥杯-卡片换位
solution 有一个测试点没有空格,要特别处理,否则会有一个测试点运行错误! 还有输入数据的规模在变,小心顺手敲错了边界条件 #include<iostream> #include<string> #include<queue> #include<map> #incl…...
Unity 布局控制器Content Size Fitter
Content Size Fitter是Unity中的一种布局控制器组件,用于根据其内容的大小来调整包含它的UI元素的大小。换句话来说就是,Content Size Fitter可以根据UI元素内部内容的大小,自动调整UI元素的大小,以确保内容能够正确显示。 如下图…...
Python的面向对象、封装、继承、多态相关的定义,用法,意义
面向对象编程(OOP)是一种编程范式,它使用对象的概念来模拟现实世界的实体,并通过类(Class)来创建这些实体的蓝图。OOP的核心概念包括封装、继承和多态。 Python中的面向对象编程 在Python中,一…...
Elasticsearch 向量搜索
目标记录 ["你好,我的爱人","你好,我的爱妻","你好,我的病人","世界真美丽"] 搜索词 爱人 预期返回 ["你好,我的爱人","你好,我的爱妻"] 示例代码…...
2024蓝桥杯每日一题(背包)
备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:货币系统 试题二:01背包问题 试题三:完全背包问题 试题一:货币系统 【题目描述】 给定 V 种货币(单位:元),每…...
Redis桌面客户端
3.4.Redis桌面客户端 安装完成Redis,我们就可以操作Redis,实现数据的CRUD了。这需要用到Redis客户端,包括: 命令行客户端图形化桌面客户端编程客户端 3.4.1.Redis命令行客户端 Redis安装完成后就自带了命令行客户端࿱…...
让Unity的协程变得简单
作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 (谢谢…...
2.9 Python缩进规则(包含快捷键)
Python缩进规则(包含快捷键) 和其它程序设计语言(如 Java、C 语言)采用大括号“{}”分隔代码块不同,Python采用代码缩进和冒号( : )来区分代码块之间的层次。 在 Python 中,对于类…...
任务记录.
播放器端的解码同步问题 miracast的投屏问题,进行修改的问题。 播放器ffplay命令没有声音的修改问题。 任务:如何将断开连接后在连接发送的数据,两秒后再去显示。 猜测: 一直在监听。断开后要求2秒后的数据再显示。那么也就是认为…...
andv vue 实现多张图片上传
1、提示 注意::: 便利出来的数组 点击保存需要 把 双引号去掉 this.formData.image this.imageUrlList.filter((image) > image ! ) 注意::: 回显的时候需要 再把 双引号加上 …...
使用JMeter+Grafana+Influxdb搭建可视化性能测试监控平台
【背景说明】 使用jmeter进行性能测试时,工具自带的查看结果方式往往不够直观和明了,所以我们需要搭建一个可视化监控平台来完成结果监控,这里我们采用三种JMeterGrafanaInfluxdb的方法来完成平台搭建 【实现原理】 通过influxdb数据库存储…...
django模板下,vue的使用(前后端不分离)
目录 关于djangovue的结合使用一、在你的templates中引入vue.js二、关于vue与django模板变量的冲突问题三、示例结语 关于djangovue的结合使用 网上的相关教程基本上都是部署node.js,npm安装vue,生成vue项目,然后将vue项目部署至django,这些…...
python笔记(7)List(列表)
目录 创建列表 取列表中的值 更新列表 删除元素 脚本操作符 嵌套列表 Python列表函数&方法 创建列表 创建一个列表(List)用方括号[]括起来就可以,数据项之间用逗号作为分隔符,数据项可以是字符串,数字,甚至…...
做电影网站怎么降低内存/域名注册优惠
要导入下面这个包就可以了 import android.view.View.OnClickListener;转载于:https://blog.51cto.com/binuu/776045...
容桂免费网站建设公司/广州seo排名外包
基本上,我需要使我的程序能够为我创建多个(无限的)变量,我仍然能够通过代码使用操纵,而不需要定义它们。在我想用一个字母和一个数字作为变量名,比如a1,然后让程序创建新的变量,只需在数字上加1。因此&…...
wordpress科技企业主题/semantic ui
一:连接池的定义本质上就是个容器(集合) 存放数据库连接的容器,当系统初始化后,容器被创建,容器中就会申请一些连接对象,当用户来访问数据库的时候,从容器中取连接对象,用户用完之后,…...
自己可以给公司做网站吗/千锋教育的官网
2019独角兽企业重金招聘Python工程师标准>>> 场景:生产环境下,多个普通用户登录,登录后自动记录history操作到某个统一目录保存。 具体要求: 1) 每个用户登录后自动创建子目录及history记录文件ÿ…...
社区门户网站建设招标公告/优化游戏卡顿的软件
实验要求:1.R6为ISP只能配置IP地址 2.R1/4/5为全连MGRE结构,R1/2/3为星型结构,R1为中心站点 3.所有私有网段可以互相通讯,私有网段使用OSPF协议 首先我们先进行IP地址的规划 和进行IP地址的配置 对R1: interface GigabitEthernet…...
做电商网站需要多少钱/网页广告调词平台多少钱
学习目标: Python学习九、 学习内容: 1、返回函数 2、匿名函数 3、装饰器 4、偏函数 1、返回函数 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回,当我们调用某一返回函数时,调用的不是结果而是函…...