当前位置:   article > 正文

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

imageio.imsave

一、PIL:Python Imaging Library(pillow)

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

  1. from PIL import Image
  2. import numpy as np
  3. imagepath='cat.jpg'
  4. image=Image.open(imagepath)
  5. print(type(image)) #结果为<class 'PIL.JpegImagePlugin.JpegImageFile'>
  6. print(image.size) #结果为(822,694),这里注意Image输出的结果先显示列数,后显示行数
  7. image.show()
  8. image.save('cat1.jpg')
  9. # image to array
  10. image1=np.array(image)#获得numpy对象,RGB
  11. print(type(image1)) #结果为<class 'numpy.ndarray'>
  12. print(image1.shape) #结果为(694, 822, 3)
  13. # array to image
  14. image2 = Image.fromarray(image1)
  15. print(type(image2)) #结果为<class 'PIL.Image.Image'>

二、scikit-image

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

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

  1. from skimage import io
  2. img=io.imread('cat.jpg')
  3. io.imshow(img)
  4. io.imsave('cat1.jpg',img)

三、imageio

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

以下代码:

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

应改为:

  1. import imageio
  2. import numpy as np
  3. from PIL import Image
  4. image = imageio.imread(image)
  5. image = np.array(Image.fromarray(image).resize((num_px,num_px)))
  6. image = imageio.imsave('image.jpg', image)

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

  1. import imageio
  2. imagepath='cat.jpg'
  3. image = imageio.imread(imagepath)
  4. print(type(image)) #结果为<class 'imageio.core.util.Array'> ,即为numpy数组
  5. imageio.imsave("cat1.jpg", image)

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

四、matplotlib

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

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

  1. import matplotlib.pyplot as plt
  2. import matplotlib.image as mpimg
  3. imagepath='cat.jpg'
  4. image = mpimg.imread(imagepath)
  5. print(type(image)) #结果为<class 'numpy.ndarray'>
  6. print(image.shape) #结果为(694, 822, 3)
  7. plt.imshow(image)
  8. mpimg.imsave("cat1.jpg", image)

五、cv2: opencv-python

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

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

  1. import cv2
  2. import matplotlib.pyplot as plt
  3. imagepath='cat.jpg'
  4. image = cv2.imread(imagepath)
  5. print(type(image)) #结果为<class 'numpy.ndarray'>
  6. print(image.shape) #结果为(694, 822, 3)
  7. cv2.imshow('bgrImage',image)
  8. cv2.waitKey()
  9. cv2.destroyAllWindows()
  10. plt.subplot(121)
  11. plt.imshow(image)
  12. # BGR to RGB
  13. image_rgb = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
  14. cv2.imshow('rgbImage',image_rgb)
  15. cv2.waitKey()
  16. cv2.destroyAllWindows()
  17. plt.subplot(122)
  18. plt.imshow(image_rgb)
  19. 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,不过多讲解。

  1. from keras.preprocessing import image
  2. imagepath='cat.jpg'
  3. img = image.load_img(imagepath)
  4. img.show()
  5. img.save("cat1.jpg")
  6. # image to array
  7. image1 = image.img_to_array(img)
  8. # array to image
  9. image2 = image.array_to_img(image1)

七、补充知识resize

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

  1. imagepath='cat.jpg'
  2. from PIL import Image
  3. image = Image.open(imagepath)
  4. image_resize = image.resize((128, 128))
  5. import cv2
  6. raw_image = cv2.imread(imagepath)
  7. image_resize = cv2.resize(raw_image, (128, 128))
  8. from keras.preprocessing import image
  9. raw_image = image.load_img(imagepath, target_size=(128, 128))
  10. from skimage import io, transform
  11. img=io.imread(imagepath)
  12. img = transform.resize(img, (128, 128))

八、plt.imshow()

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/950093
推荐阅读
相关标签
  

闽ICP备14008679号