python实现读取并显示图片的两种方法
在python中除了用opencv,也可以用matplotlib和PIL这两个库操作图片。本人偏爱matpoltlib,因为它的语法更像matlab。
一、matplotlib
1.显示图片
importmatplotlib.pyplotasplt#plt用于显示图片 importmatplotlib.imageasmpimg#mpimg用于读取图片 importnumpyasnp 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图转换为灰度图,可以根据公式自定义一个:
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
fromscipyimportmisc lena_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保存为图像
fromscipyimportmisc misc.imsave('lena_new_sz.png',lena_new_sz)
5.3直接保存array
读取之后还是可以按照前面显示数组的方法对图像进行显示,这种方法完全不会对图像质量造成损失
np.save('lena_new_sz',lena_new_sz)#会在保存的名字后面自动加上.npy img=np.load('lena_new_sz.npy')#读取前面保存的数组
二、PIL
1.显示图片
fromPILimportImage im=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方法
fromPILimportImage I=Image.open('lena.png') I.save('new_lena.png')
4.将numpy数组转换为PIL图片
这里采用matplotlib.image读入图片数组,注意这里读入的数组是float32型的,范围是0-1,而PIL.Image数据是uinit8型的,范围是0-255,所以要进行转换:
importmatplotlib.imageasmpimg fromPILimportImage lena=mpimg.imread('lena.png')#这里读入的数据是float32型的,范围是0-1 im=Image.fromarray(np.uinit8(lena*255)) im.show()
5.RGB转换为灰度图
fromPILimportImage I=Image.open('lena.png') I.show() L=I.convert('L') L.show()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。