3.1 读取图像文件进行基本操作
首先需要介绍图像文件的存储格式。计算机图像可以分为矢量图和位图。矢量图以代码的形式存储,常见的包括学术论文的统计图、公司图标等。这里主要讨论如何处理位图,其存储格式包括png、jpg、tiff等,常见的包括各种手机、数码相机拍摄的相片。而我们通常看见的gif动画、mp4影片,也是由多个位图按照时间排列、以固定的帧数进行播放的。
这里png、jpg、tiff格式的彩色照片,本质上都是一个三维的矩阵,即长度、宽度以及颜色(RGB,红绿蓝)。格式的文件结构都是十六进制数,分别使用了不同的图像压缩方法。当然解析这部分内容并不需要大家过多关注,我们可以在Python中使用现成的工具,将十六进制数格式的文件转换成三维矩阵。我们重点讲一下opencv的用法,这里使用opencv-python官网的例子。
3.1.1 使用python-opencv读取图片
运算结果:
#output: (342, 548, 3)
完成图像读取以后,可以用Python的matplotlib基本绘图库进行图像的展示,如图3-2所示。
import matplotlib.pyplot as plt %matplotlib inline
plt.imshow(img)
图3-2 展示图片
读取图片成功,这里的三维矩阵高度为342像素,宽度为548像素,使用RGB编码。如果读者是球迷的话,很容易会发现问题,首先这个球应该是黄色的,怎么是浅蓝色?巴萨球迷更能一眼看出球袜的颜色反了,不是红色是蓝色——红蓝色反了。
出现这个问题的原因是,opencv-python默认使用BGR编码,相对于RGB而言,色彩这个维度正好是反的。之所以这里看起来不太对劲的原因,主要还是归功于巴萨球衣是红蓝相间的,反过来仍然是红蓝。如果是米兰两队(红黑与蓝黑)这样转换,球队就会弄错了。
3.1.2 借助python-opencv进行不同编码格式的转换
我们可以用简单的矩阵操作,或者直接用opencv的函数,将BGR颜色编码转换成RGB,如图3-3所示。
# 方法1. 直接操作数组 fig = plt.figure(figsize=(10, 6)) ax1 = fig.add_subplot(121) ax2 = fig.add_subplot(122) ax1.imshow(img[:,:,np.array([2,1,0])]) # 方法2. 调用opencv函数 ax2.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
图3-3 转换后的图片
3.1.3 借助python-opencv改变图片尺寸
如果此时想转换成一个小一点的黑白相片,将高度×宽度变成240×360,可以进行如下设置:
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img_gray_small = cv2.resize(img_gray, (360, 240))
存储图片:
cv2.imwrite("gray_out.png",img_gray_small)
运算结果:
# out: True
此时,转换成黑白相片并经过缩小后的文件已经被成功存储了。