赞
踩
Python中操作图像的方法包括opencv,matplotlib,PIL
- import cv2 as cv
- # load
- img = cv.imread(imagepath)
- # shape=(height, width, channel)
- h,w,c = img.shape
- # show
- cv.imshow('window_title', img)
- # save
- cv.imwrite(savepath, img)
- import matplotlib.pyplot as plt # plt 用于显示图片
- import matplotlib.image as mpimg # mpimg 用于读取图片
- import numpy as np
-
- # load
- img = mpimg.imread('cat.jpg')
- # 此时 img 就已经是一个 np.array 了,可以对它进行任意处理
- # height, width, channel=(360, 480, 3)
- h,w,c = img.shape
-
- # show
- plt.imshow(img) # 显示图片
- plt.axis('off') # 不显示坐标轴
- plt.show()
-
- # save
- # 适用于保存任何 matplotlib 画出的图像,相当于一个 screencapture
- plt.savefig('fig_cat.png')
注意到:
* plt.imshow(image)中的图片的数据类型可以使np.array类型
* mpimg 既提供了加载图像函数imread,又提供了保存图像函数imsave
* plt.savefig函数 可以将显示在fig中图像保存下来
待补充mpimg.imsave()和plt.savefig()使用demo。
- from scipy import misc
- lena_new_sz = misc.imresize(img, 0.5) # 第二个参数如果是整数,则为百分比,如果是tuple,则为输出图像的尺寸
- plt.imshow(img_new_sz)
- plt.axis('off')
- plt.show()
- # 2.1 np.array=>image file
- from scipy import misc
- misc.imsave('img_new_sz.png', img_new_sz)
- """
- from scipy import misc
- # load image
- lena = misc.imread('lena.png')
- # <type 'numpy.ndarray'>
- type(lena)
- # lena.shape, lena.dtype
- """
-
- # 2.2 np.array=>np data file
- import numpy as np
- np.save('img_new_sz', img_new_sz) # 会在保存的名字后面自动加上.npy
- img = np.load('img_new_sz.npy') # 读取前面保存的数组
注意: np.array数据可以通过np.save
函数直接保存在磁盘上,扩展名为.npy
, 通过np.load
函数直接恢复; scipy.misc
提供了对numpy.array格式图像的处理函数,特别是misc.imsave
函数可以直接将np.array数据保存成图像文件。
加载并显示图像(*)
- from PIL import Image
- # load
- im = Image.open('cat.jpg')
-
- # show
- im.show()
-
- """
- # 返回 image's size w,h = (480, 360)
- w,h = img.size
- # PIL.JpegImagePlugin.JpegImageFile
- type(img)
- # 直接调用Image类的save方法
- img.save('new_cat.png')
- """
加载并显示图像(**)
- from PIL import Image
- import matplotlib.pyplot as plt
- img=Image.open('/home/wanghao/Pictures/001.jpg')
- plt.figure("head")
- plt.imshow(img)
- plt.show()
PIL图片和numpy数组间的转换
- """
- # PIL Image => np.array
- # 也可以用 np.asarray(im),区别是
- # np.array() 是深拷贝,np.asarray() 是浅拷贝
- """
- im_array = np.array(im)
-
- """
- 这里采用 matplotlib.image 读入图片数组
- 注意:
- 这里读入的数组是 float32 型的,范围是 0-1;
- PIL.Image 数据是 uinit8 型的,范围是0-255,所以要进行转换;
- """
- import matplotlib.image as mpimg
- from PIL import Image
- img = mpimg.imread('cat.jpg') # 这里读入的数据是 float32 型的,范围是0-1
- # 方法转换之后显示效果不好
- img = Image.fromarray(np.uint8(img*255))
- img.show()
注意: numpy转PIL Image后显示效果很差,不如 转成numpy后使用matplotlib显示好
在可以选择使用哪个图像库最终显示图像的时候,个人觉得使用 matplotlib库集成好的函数去直接加载和显示图像(来自matplotlib的image.imread 或 PIL的Image.open)效果更好;
将内存中结果整个保存成图片的时候,要优先考虑 转成 np.array后使用 scipy.misc保存成图片;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。