6.1.5 [案例]三酷猫照片背后的数组
matplotlib.pyplot子库为读写PNG、JPG格式的图像,提供了imread( )和savefig( )函数,可以通过import导入使用。
1.读取PNG图片到指定的数组对象
plt.imread(fname,format=None),参数说明如下。
(1)fname,指定读取图片的文件名(含文件路径)。
(2)format,指定文件扩展名,如果没有指定,则默认值为PNG。
返回值说明:数组,返回数组形式为(M,N),则图片是灰度图片;返回数组形式为(M,N,3),则图片是RGB图片;返回数组形式为(M,N,4),则图片是RGBA图片。
2.RGBA组成
在计算机上图片的最小表示单位是像素,RGBA格式图片的像素由红(Red)、绿(Green)、蓝(Blue)、透明度(Alpha)四个通道组成,每个通道占8bit,一个像素长度为32bit,其结构如图6.2所示。前三个通道颜色的取值范围为0到255之间的整数或者0%到100%之间的百分数,这些值描述了红绿蓝三原色在预期色彩中的量。如100%红、0%绿和0%蓝,设置为纯红色。Alpha通道确定彩色的透明度,值范围为[0,1],0为全透明,1为不透明。

图6.2 RGBA结构
3.组数对象以图片格式存放
plt.imsave(fname,arr,**kwargs)的参数说明如下。
(1)fname,指定需要存储为图片的文件名(含文件路径)。
(2)arr,图片数据的数组,数组形式可以是(M,N)、(M,N,3)、(M,N,4)。
(3)**kwargs代表如下参数设置及使用。
①vmin,vmax,设置颜色范围。
②cmap,设置图片颜色,仅适用于灰度图片。
③format,指定文件的扩展名,如“.png”“.pdf”“.svg”等。
④origin,可选值“upper”“lower”,指定图片索引坐标(0,0)从左上角开始,还是从左下角开始。
⑤dpi,表示图像分辨率,指每英寸长度上的点数。
4.读写图片
先用imread( )读取指定位置的图片,然后通过imshow( )函数显示读取的图片,其代码如下:
代码文件:6_1_5_readPhoto.py(https://www.daowen.com)

注意
用imread( )读取指定路径下的图片时,在其路径字符串前必须加r字符,表示字符串里即使存在\开始的转义字符,也按照字符串本身执行,不进行字符转义操作。
上述代码执行结果如图6.3所示。

图6.3 读取的猫图片
代码打印输出如下:


上述为读取图片的数组显示数值,每一行为四个值,分别对应RGBA四个通道的值,这里所有的透明度为1。当一个像素的值为 (255,255,255,0)时,表示完全透明的白色;当一个像素的值为(0,0,0,1)时,表示完全不透明的黑色,也就是Aplha的取值范围为[0,1]。
![]()
从图6.3左边的坐标值可以看出1706对应y轴值(图片的高),1280对应x轴值(图片的宽),4为一个像素的RGBA。
5.保存截取的图片
这里通过对数组指定范围元素的读取,把猫单独截取出来,另存为一个图片。
代码文件:6_1_5_savePhoto.py


截取部分图片并保存到新文件中的执行结果如图6.4所示。

图6.4 截取的猫图片
说明
由此读者可以得到启发,可以借助数组的各种操作,实现对图像的各种处理,如图像旋转、图像大小改变、图像透明度改变、图像的切割、图像识别、图像叠加、图像特定部分移动等。