您现在的位置是:首页 > 正文

python实现读取并显示图片的方法(PIL)

2024-02-01 01:48:18阅读 2

PIL

1. 显示图片

1

2

3

from PIL import Image

im = Image.open('lena.png')

im.show()

2. 将 PIL Image 图片转换为 numpy 数组

1

2

im_array = np.array(im)

# 也可以用 np.asarray(im) 区别是 np.array() 是深拷贝,np.asarray() 是浅拷贝

3. 保存 PIL 图片

直接调用 Image 类的 save 方法

1

2

3

from PIL import Image

save_path="out/"

I = Image.open('lena.png')

I.save(save_path + 'new_lena.png') # 指定输出文件夹

import glob
from PIL import Image
# Get all png files under the input folder
input_img_path = glob.glob("input/*.png")
save_path = "low_resolution4x/"

for file in input_img_path:
  # get the file_name of image
  file_name=file.split('\\')[-1]
  im = Image.open(file)
  image_size = im.size
  image_width = image_size[0]
  image_heigth = image_size[1]

  # reduce resolution by multiple
  reduce_resolution_rate = 2
  new_image_width = image_width // reduce_resolution_rate
  new_image_height = image_heigth // reduce_resolution_rate

  # 降低图像分辨率reduce_resolution_rate倍
  im.thumbnail((new_image_width, new_image_height))
  # 恢复图像为原始大小,但是分辨率是降低后的
  im = im.transform(image_size, Image.EXTENT, (0, 0, new_image_width, new_image_height))

  # save reusult image to target folder
  im.save(save_path + file_name)

4. 将 numpy 数组转换为 PIL 图片

这里采用 matplotlib.image 读入图片数组,注意这里读入的数组是 float32 型的,范围是 0-1,而 PIL.Image 数据是 uinit8 型的,范围是0-255,所以要进行转换:

1

2

3

4

5

import matplotlib.image as mpimg

from PIL import Image

lena = mpimg.imread('lena.png') # 这里读入的数据是 float32 型的,范围是0-1

im = Image.fromarray(np.uinit8(lena*255))

im.show()

5. RGB 转换为灰度图

1

2

3

4

5

from PIL import Image

I = Image.open('lena.png')

I.show()

L = I.convert('L')

L.show()

https://www.cnblogs.com/lantingg/p/9259840.html

网站文章

  • 新手如何入门黑客技术,黑客技术入门该学什么?

    新手如何入门黑客技术,黑客技术入门该学什么?

    确立了自己的学习方向后就是怎么学的问题了,首先你要掌握常用的网络术语,以及电脑的基本操作,像肉鸡,远控,木马,后门,webshell等都要有所了解,常见的软件安装像操作系统的安装,虚拟机的安装等都要会...

    2024-02-01 01:48:11
  • redis源码分析之AOF重写

    redis源码分析之AOF重写

    redis源码分析(AOF重写相关)一、背景二、AOF重写步骤简述三、缓存区四、相关源码 一、背景 AOF是Redis增量模式的持久化方式,随着redis的持续运行,会不断有新的数据写入AOF文件中,...

    2024-02-01 01:47:41
  • HDU 4006 The kth great number(优先队列)

    由于只有插入操作,所以不很复杂的数据结构,优先队列就可以了,每次保持队列中有k个元素,这样取出的头必然是第k大代码:#include #include #include #include using namespace std;int n, k;int main() { while (~scanf("%d%d", &n, &k)) { char s[

    2024-02-01 01:47:34
  • HTML 关于登录form样式

    HTML 关于登录form样式

    关于form表单的登录的相关知识: input 和 button圆角矩形: input,button{ width: 320px; height: 45px; margin: 0px 8px; border-radius: 10px; /*圆角矩形*/ text-indent: 10px; /*里面隐形的字体首行缩进*/ margin: 10...

    2024-02-01 01:47:26
  • hive实训项目之电商数据分析

    hive实训项目---------电商数据分析 题干: 某大型电商公司从后台服务器收集到30W条的日志用户行为数据,经过数据初步清洗得到数据如下表sale_user.zip,假如你是该公司一员开发工程...

    2024-02-01 01:47:19
  • Java——输入两个数,判断两数之间有多少个素数,素数和是多少,分别是什么

    Java——输入两个数,判断两数之间有多少个素数,素数和是多少,分别是什么

    结果图 1.引入包 import java.util.*; 2.定义,获取输入 Scanner input=new Scanner(System.in); System.out.println(&qu...

    2024-02-01 01:46:52
  • TypeScript初体验(三)

    TypeScript初体验(三)

    DefinitelyTyped是一个GitHub仓库,用来提高质量TypeScript类型声明,可以通过npm/yarn来下载TS类型声明包,这些包的名称格式为:@type/*,例如:@type/re...

    2024-02-01 01:46:45
  • c语言结构体按地址赋值,C语言中结构体的直接赋值

    比如:structA{charv1[20];intv2;}a,b;a=b;这是没有任何问题的赋值.structB{char*v1;intv2;}c,d;c=d;这种结构体赋值,就需要注意(包括在C++里)。对于指针赋值,它不是数据进行了复制保存而是多了一个指针指向而已,这样一旦b对象释放,a的指向就成了非法的垃圾数据。所以在 C/C++ 中,有些需要要另外自己定义复制函数的...

    2024-02-01 01:46:37
  • 无需密码卸载亚信安全防毒墙网络版客户端

    无需密码卸载亚信安全防毒墙网络版客户端

    无需密码卸载亚信安全防毒墙网络版客户端

    2024-02-01 01:46:08
  • 包装类概述

    包装类概述

    那么通过以上分析可知,只要是通过自动装箱或者valueOf()方法去获取对象,只要数据范围在-128~127,不管获取多少次,都会从数组中去拿缓冲的对象,所以拿到的始终是同一个,所以判断的结果就是tr...

    2024-02-01 01:46:03