少年子弟江湖老,红颜少女的鬓边终于也见到了白发……
在python中除了用opencv,也可以用matplotlib和PIL这两个库操作图片。本人偏爱matpoltlib,因为它的语法更像matlab。
importmatplotlib.pyplotasplt#plt用于显示图片importmatplotlib.imageasmpimg#mpimg用于读取图片importnumpyasnplena=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图转换为灰度图,可以根据公式自定义一个:
defrgb2gray(rgb):returnnp.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
fromscipyimportmisclena_new_sz=misc.imresize(lena,0.5)#第二个参数如果是整数,则为百分比,如果是tuple,则为输出图像的尺寸plt.imshow(lena_new_sz)plt.axis('off')plt.show()5.保存图像5.1保存matplotlib画出的图像
该方法适用于保存任何matplotlib画出的图像,相当于一个screencapture。
plt.imshow(lena_new_sz)plt.axis('off')plt.savefig('lena_new_sz.png')5.2将array保存为图像
fromscipyimportmiscmisc.imsave('lena_new_sz.png',lena_new_sz)5.3直接保存array
读取之后还是可以按照前面显示数组的方法对图像进行显示,这种方法完全不会对图像质量造成损失
np.save('lena_new_sz',lena_new_sz)#会在保存的名字后面自动加上.npyimg=np.load('lena_new_sz.npy')#读取前面保存的数组
fromPILimportImageim=Image.open('lena.png')im.show()2.将PILImage图片转换为numpy数组im_array=np.array(im)#也可以用np.asarray(im)区别是np.array()是深拷贝,np.asarray()是浅拷贝3.保存PIL图片直接调用Image类的save方法
fromPILimportImageI=Image.open('lena.png')I.save('new_lena.png')4.将numpy数组转换为PIL图片这里采用matplotlib.image读入图片数组,注意这里读入的数组是float32型的,范围是0-1,而PIL.Image数据是uinit8型的,范围是0-255,所以要进行转换:
importmatplotlib.imageasmpimgfromPILimportImagelena=mpimg.imread('lena.png')#这里读入的数据是float32型的,范围是0-1im=Image.fromarray(np.uinit8(lena*255))im.show()5.RGB转换为灰度图fromPILimportImageI=Image.open('lena.png')I.show()L=I.convert('L')L.show()