python基础 | 核心库:PIL

news2024/9/22 4:06:06

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.coloradmin.cn/o/1552889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二十一章 Jquery ajax

文章目录 1. jquery下载2. jquery的使用3. jquery页面加载完毕执行4. jquery属性控制6. 遍历器 2. ajax1. 准备后台服务器2. ajax发送get请求3. ajax发送post请求 1. jquery下载 点击下载 稳定版本1.9 2. jquery的使用 存放到html文件的同级目录 3. jquery页面加载完毕执行…

Unity照片墙简易圆形交互效果总结

还要很多可以优化的点地方,有兴趣的可以做 比如对象的销毁和生成可以做成对象池,走到最左边后再移动到最右边循环利用 分析过程文件,采用Blender,资源已上传,可以播放动画看效果,下面截个图: …

OpenPLC_Editor 在Ubuntu 虚拟机安装记录

1. OpenPLC_Editor在虚拟机上费劲的装了一遍,有些东西已经忘了,主要还是python3 的缺失库版本对应问题,OpenPLC_Editor使用python3编译的,虚拟机的Ubuntu 18.4 有2.7和3.6两个版本,所以需要注意。 2. OpenPLC_Editor …

专题:一个自制代码生成器(嵌入式脚本语言)之应用实例

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 专题:一个自制代码…

【嵌入式机器学习开发实战】(十二)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的安装运行】

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 嵌入式机器学习开发实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 在ARM-Linux系统中,C语言程序的安装和运行可…

局域网找不到共享电脑怎么办?

局域网找不到共享电脑是一种常见的问题,给我们的共享与合作带来一定的困扰。天联组网技术可以解决这个问题。本文将介绍天联组网的原理和优势,并探讨其在解决局域网找不到共享电脑问题中的应用。 天联组网的原理和优势 天联组网是一种基于加速服务器的远…

Linux 系统 CentOS7 上搭建 Hadoop HDFS集群详细步骤

集群搭建 整体思路:先在一个节点上安装、配置,然后再克隆出多个节点,修改 IP ,免密,主机名等 提前规划: 需要三个节点,主机名分别命名:node1、node2、node3 在下面对 node1 配置时,先假设 node2 和 node3 是存在的 **注意:**整个搭建过程,除了1和2 步,其他操作都使…

浅谈C语言编译与链接

个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 翻译环境和运行环境 在ANSI C(标准 C)的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个…

XUbuntu22.04之激活Linux最新Typora版本(二百二十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

109、Recent Advances in 3D Gaussian Splatting

简介 论文 对3D Gaussian Splatting的综述 质量提升 Mip-Splatting观察到,改变采样率,例如焦距,可以通过引入高频高斯类形伪影或强膨胀效应,极大地影响渲染图像的质量,因此Mip-Splatting将3D表示的频率限制在训练图…

IP种子是什么?理解和应用

在网络世界中,IP种子是一个广泛应用于文件共享和网络下载领域的概念。它是一种特殊的标识符,用于识别和连接到基于对等网络(P2P)协议的文件共享网络中的用户或节点。本文将深入探讨IP种子的含义、作用以及其在网络中的应用。 IP地…

计算机网络:物理层 - 信道极限容量

计算机网络:物理层 - 信道极限容量 实际信道中的数字信号奈式准则香农公式练习 实际信道中的数字信号 信号在传输过程中会受到各种因素的影响,如图所示: 这是一个数字信号,当它通过实际的信道后,波形会产生失真&#…

C语言例4-36:求Fibonacci数列的前40个数

教材优化代码如下&#xff1a; //求Fibonacci数列的前40个数 #include<stdio.h> int main(void) {long int f11,f21;int i1;for(;i<20;i){printf("%15ld%15ld",f1,f2);if(i%20)printf("\n");f1f2;f2f1;}return 0; } 结果如下&#xff1a; 我的基…

php 快速入门(七)

一、操作数据库 1.1 操作MySQL的步骤 第一步&#xff1a;登录MySQL服务器 第二步&#xff1a;选择当前数据库 第三步&#xff1a;设置请求数据的字符集 第四步&#xff1a;执行SQL语句 1.2 连接MySQL 函数1&#xff1a;mysql_connect() 功能&#xff1a;连接&#xff08;登录…

Netty对Channel事件的处理以及空轮询Bug的解决

继续上一篇Netty文章&#xff0c;这篇文章主要分析Netty对Channel事件的处理以及空轮询Bug的解决 当Netty中采用循环处理事件和提交的任务时 由于此时我在客户端建立连接&#xff0c;此时服务端没有提交任何任务 此时select方法让Selector进入无休止的阻塞等待 此时selectCnt进…

【计算机网络】第 11、12 问:流量控制和可靠传输机制有哪些?

目录 正文流量控制的基本方法停止-等待流量控制基本原理滑动窗口流量控制基本原理 可靠传输机制1. 停止-等待协议2. 后退 N 帧协议&#xff08;GBN&#xff09;3. 选择重传协议&#xff08;SR&#xff09; 正文 流量控制涉及对链路上的帧的发送速率的控制&#xff0c;以使接收…

zabbix自定义监控进程、日志文件

zabbix自定义监控进程、日志文件 zabbix自定义监控进程 在客户端安装httpd服务 [rootnode1 ~]# yum -y install httpd [rootnode1 ~]# systemctl start httpd [rootnode1 ~]# ss -antl State Recv-Q Send-Q Local Address:Port Peer Address:Port Pr…

【Redis】Redis 内存管理,Redis事务,bigkey和hotkey

目录 Redis 内存管理 缓存数据设置过期时间&#xff1f; Redis 是如何判断数据是否过期的呢&#xff1f; 过期删除策略 内存淘汰机制 主从模式下对过期键的处理&#xff1f; LRU和LFU的区别 Redis事务 定义和原理 Redis 事务的注意点&#xff1f; 为什么不支持回滚&a…

shell脚本发布docker-nginx vue2 项目示例

docker、git、node.js安装略过。 使git pull或者git push不需要输入密码操作方法 nginx安装在docker容器里面&#xff0c;参见&#xff1a;https://blog.csdn.net/HSJ0170/article/details/128631155 姊妹篇&#xff08;宿主机nginx&#xff0c;非docker-nginx&#xff09;&am…

React 应用实现监控可观测性最佳实践

前言 React 是一个用于构建用户界面的 JavaScript 框架。它采用了虚拟 DOM 和 JSX&#xff0c;提供了一种声明式的、组件化的编程模型&#xff0c;以便更高效地构建用户界面。无论是简单还是复杂的界面&#xff0c;React 都可以胜任。 YApi 是使用 React 编写的高效、易用、功…