Python 读取、显示、保存图像的各种方法(全!)

一、PIL:Python Imaging Library(pillow)

PIL读取图片不直接返回numpy对象,可以用numpy提供的函数np.array()进行转换,亦可用Image.fromarray()再从numpy对象转换为原来的Image对象,读取,显示,保存以及数据格式转换方法见如下代码:

from PIL import Image
import numpy as np

imagepath='cat.jpg'
image=Image.open(imagepath)
print(type(image))  #结果为<class 'PIL.JpegImagePlugin.JpegImageFile'> 
print(image.size)   #结果为(822,694),这里注意Image输出的结果先显示列数,后显示行数
image.show()

image.save('cat1.jpg')

# image to array
image1=np.array(image)#获得numpy对象,RGB
print(type(image1)) #结果为<class 'numpy.ndarray'> 
print(image1.shape) #结果为(694, 822, 3)

# array to image
image2 = Image.fromarray(image1)
print(type(image2)) #结果为<class 'PIL.Image.Image'> 

二、scikit-image

PIL只提供最基础的数字图像处理,功能有限;opencv本质上是一个c++库,只是提供了python的接口,官方更新速度非常慢,而且安装很不容易。综合来看,scikit-image是基于scipy的一款图像处理包,它功能非常齐全,同时将图片作为numpy数组进行处理,几乎集合了matlab的所有图像处理功能,在数据的处理方式,函数名字等方面对matlab的模仿姿势非常到位。推荐使用!

读取,显示,保存见如下代码:

from skimage import io

img=io.imread('cat.jpg')
io.imshow(img)

io.imsave('cat1.jpg',img)

三、imageio

科学计算库scipy中的方法,之前是scipy.misc,其下函数包括imread,imresize,imsave,新版misc被移除,改用imageio,需独立安装conda install imageio。

以下代码:

import scipy
image = scipy.misc.imread(image)
image = scipy.misc.imresize(image, size=(num_px,num_px))
scipy.misc.imsave('image.jpg', image)

应改为:

import imageio
import numpy as np
from PIL import Image

image = imageio.imread(image)
image = np.array(Image.fromarray(image).resize((num_px,num_px)))
image = imageio.imsave('image.jpg', image)

读取,保存方法见如下代码:

import imageio

imagepath='cat.jpg'
image = imageio.imread(imagepath)
print(type(image)) #结果为<class 'imageio.core.util.Array'> ,即为numpy数组

imageio.imsave("cat1.jpg", image)

无显示方法,但其读取后的类型为numpy数据,故可用之后的plt.imshow()显示。

四、matplotlib

从名字中可以看出这个模块是具有matlab风格的,故所处理的数据均为numpy数据。

读取,显示,保存方法见如下代码:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

imagepath='cat.jpg'
image = mpimg.imread(imagepath)
print(type(image)) #结果为<class 'numpy.ndarray'>
print(image.shape) #结果为(694, 822, 3)

plt.imshow(image)

mpimg.imsave("cat1.jpg", image)

五、cv2: opencv-python

使用opencv读取图像,同样返回numpy数据,与其他不同的是,通道顺序为BGR ,而不是RGB,cv2.imread的图片是BGR,cv2.imshow 时相应的换通道显示,所以仍会显示出原来的图片

读取,显示,保存方法见如下代码:

import cv2
import matplotlib.pyplot as plt

imagepath='cat.jpg'
image = cv2.imread(imagepath)
print(type(image)) #结果为<class 'numpy.ndarray'>
print(image.shape) #结果为(694, 822, 3)

cv2.imshow('bgrImage',image)
cv2.waitKey()
cv2.destroyAllWindows()
plt.subplot(121)
plt.imshow(image)

# BGR to RGB
image_rgb = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
cv2.imshow('rgbImage',image_rgb)
cv2.waitKey()
cv2.destroyAllWindows()
plt.subplot(122)
plt.imshow(image_rgb)

cv2.imwrite("cat1.jpg", image)

代码中还利用plt.imshow与cv2.imshow进行了对比,以及bgr转换rgb后plt.imshow与cv2.imshow进行了对比,显示结果为:

  

由图可得,cv2.imshow会在cv2.imread后正常显示rgb图像,此时plt.imshow()会显示gbr图像;bgr转换为rgb后,plt.imshow()会正常显示rgb图像,而cv2.imshow()会显示gbr图像。有点绕口,请结合代码对比理解。

六、keras.preprocessing

keras中处理图像的工具,其底层封装的实际为PIL,不过多讲解。

from keras.preprocessing import image

imagepath='cat.jpg'
img = image.load_img(imagepath)

img.show()

img.save("cat1.jpg")

# image to array
image1 = image.img_to_array(img)
# array to image
image2 = image.array_to_img(image1)

七、补充知识resize

以上模块中PIL、opencv-python拥有读入图片后resize的功能,代码如下:

imagepath='cat.jpg'

from PIL import Image

image = Image.open(imagepath)
image_resize = image.resize((128, 128))



import cv2

raw_image = cv2.imread(imagepath)
image_resize = cv2.resize(raw_image, (128, 128))



from keras.preprocessing import image

raw_image = image.load_img(imagepath, target_size=(128, 128))



from skimage import io, transform

img=io.imread(imagepath)
img = transform.resize(img, (128, 128))

八、plt.imshow()

需要注意的是,不论是哪种方法函数读入图片,显示图片皆可用plt.imshow()来操作。

  • 19
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值