Python实现读取并显示图片的两种方法:matplotlib与PIL详解
本文详细介绍在Python中利用matplotlib和PIL库读取、显示及处理图片的两种常用方法。内容涵盖图像显示、单通道查看、RGB转灰度、图像缩放、保存图像以及numpy数组与PIL对象间的转换,帮助开发者掌握基础图像处理技能。
在Python中,除了使用OpenCV外,还可以借助matplotlib和PIL这两个库来处理图片。笔者更倾向于使用matplotlib,因为其语法风格更接近MATLAB。
一、使用matplotlib库
1. 显示图片
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
import numpy as np
lena = mpimg.imread('lena.png') # 读取和代码处于同一目录下的 lena.png
# 此时 lena 就已经是一个 np.array 了,可以对它进行任意处理
lena.shape #(512, 512, 3)
plt.imshow(lena) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()
2. 显示特定通道
# 显示图片的第一个通道
lena_1 = lena[:,:,0]
plt.imshow('lena_1')
plt.show()
# 此时会发现显示的是热量图,不是我们预想的灰度图,可以添加 cmap 参数,有如下几种添加方法:
plt.imshow('lena_1', cmap='Greys_r')
plt.show()
img = plt.imshow('lena_1')
img.set_cmap('gray') # 'hot' 是热量图
plt.show()
3. 将RGB图像转换为灰度图
matplotlib库本身没有直接提供将RGB图像转换为灰度图的专用函数,但可以根据相关公式自定义实现:
def rgb2gray(rgb):
return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])
gray = rgb2gray(lena)
# 也可以用 plt.imshow(gray, cmap = plt.get_cmap('gray'))
plt.imshow(gray, cmap='Greys_r')
plt.axis('off')
plt.show()
4. 对图像进行缩放处理
此步骤需要用到scipy库。
from scipy import misc
lena_new_sz = misc.imresize(lena, 0.5) # 第二个参数如果是整数,则为百分比,如果是tuple,则为输出图像的尺寸
plt.imshow(lena_new_sz)
plt.axis('off')
plt.show()
5. 保存图像
5.1 保存matplotlib生成的图像
该方法适用于保存任何由matplotlib绘制的图像,其效果类似于屏幕截图。
plt.imshow(lena_new_sz)
plt.axis('off')
plt.savefig('lena_new_sz.png')
5.2 将数组保存为图像文件
from scipy import misc
misc.imsave('lena_new_sz.png', lena_new_sz)
5.3 直接保存数组数据
读取保存后的数据,仍可按前述显示数组的方式对图像进行展示,这种方式不会造成任何图像质量损失。
np.save('lena_new_sz', lena_new_sz) # 会在保存的名字后面自动加上.npy
img = np.load('lena_new_sz.npy') # 读取前面保存的数组
二、使用PIL库
1. 显示图片
from PIL import Image
im = Image.open('lena.png')
im.show()
2. 将PIL Image对象转换为numpy数组
im_array = np.array(im) # 也可以用 np.asarray(im) 区别是 np.array() 是深拷贝,np.asarray() 是浅拷贝
3. 保存PIL图片
直接调用Image类的save方法即可实现。
from PIL import Image
I = Image.open('lena.png')
I.save('new_lena.png')
4. 将numpy数组转换为PIL图片
此处采用matplotlib.image模块读取图片数组,需注意读入的数组类型为float32,数值范围在0到1之间;而PIL.Image数据类型为uint8,范围是0到255,因此需要进行类型和数值范围的转换:
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图像转换为灰度图
from PIL import Image
I = Image.open('lena.png')
I.show()
L = I.convert('L')
L.show()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









