当前位置: 首页 > news >正文

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 绑定暂停的反馈对象。 六、反馈渲染七、局限性 一、说明 转换反馈是捕获由顶点处理步骤生成的基元的过程&#xf…...

记录一次报错提示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&#xff09;数据库名称和数据库唯一标识符&#xff08;DBID) 2&#xff09;创建数据库的时间戳 3&#xff09;有关数据文件、联机重做日志文件、归档重做日志文件的信息 4&#xff09;表空间信息 5&#xff09;检查点信息 6&#xff09;日志序列号…...

活体成像应用染料CY3.5-NHS星戈瑞

活体成像是一种生物医学研究的重要工具&#xff0c;它能够实时、无创地观察生物体内细胞和分子的动态变化。染料CY3.5-NHS&#xff0c;作为一种常用的活体成像染料&#xff0c;在许多生物医学研究中发挥着关键作用。本文将详细介绍染料CY3.5-NHS的特点、应用以及优势&#xff0…...

【优选算法】专题1 -- 双指针 -- 复写0

前言&#xff1a; 补充一下前文没有写到的双指针入门知识&#xff1a;专题1 -- 双指针 -- 移动零 目录 基础入门知识&#xff1a; 1. 复写零&#xff08;easy&#xff09; 1. 题⽬链接&#xff1a;1089.复习0 - 力扣&#xff08;LeetCode&#xff09; 2. 题⽬描述&#xff…...

GESP Python编程三级认证真题 2024年3月

Python 三级 2024 年 03 月 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 小杨的父母最近刚刚给他买了一块华为手表&#xff0c;他说手表上跑的是鸿蒙&#xff0c;这个鸿蒙是&#xff1f;&#xff08; &#xff09; A. 小程序 B. 计时器 C. 操作系统…...

前端理论总结(css3)——link/import区别 // 伪类/伪元素

伪类/伪元素 1&#xff1a; 伪类使用1个冒号&#xff0c;常见的有&#xff1a;:hover&#xff0c;:link&#xff0c;:active&#xff0c;:target&#xff0c;:not()&#xff0c;:focus等 伪元素使用 2 个冒号&#xff0c;常见的有&#xff1a;::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虚拟机&#xff08;HotSpot&#xff09;中&#xff0c;对象在 Java 内存中的 存储布局 可分为三块&#xff1a; 对象头 存储区域实例数据 存储区域对齐填充 存储区域 对象头区域&#xff1a; 存储对象自身的运行时数据&#xff0c;如&#xff1a;哈希码、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. 理解全球网络&#xff08;1&#xff09;理解公网&#xff08;2&#xff09;理解私网&#xf…...

刷题DAY38 | LeetCode 509-斐波那契数 70-爬楼梯 746-使用最小花费爬楼梯

509 斐波那契数&#xff08;easy&#xff09; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1)…...

蓝桥杯-卡片换位

solution 有一个测试点没有空格&#xff0c;要特别处理&#xff0c;否则会有一个测试点运行错误&#xff01; 还有输入数据的规模在变&#xff0c;小心顺手敲错了边界条件 #include<iostream> #include<string> #include<queue> #include<map> #incl…...

Unity 布局控制器Content Size Fitter

Content Size Fitter是Unity中的一种布局控制器组件&#xff0c;用于根据其内容的大小来调整包含它的UI元素的大小。换句话来说就是&#xff0c;Content Size Fitter可以根据UI元素内部内容的大小&#xff0c;自动调整UI元素的大小&#xff0c;以确保内容能够正确显示。 如下图…...

Python的面向对象、封装、继承、多态相关的定义,用法,意义

面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它使用对象的概念来模拟现实世界的实体&#xff0c;并通过类&#xff08;Class&#xff09;来创建这些实体的蓝图。OOP的核心概念包括封装、继承和多态。 Python中的面向对象编程 在Python中&#xff0c;一…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...