深度学习技术图像处理入门
上QQ阅读APP看书,第一时间看更新

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

此时,转换成黑白相片并经过缩小后的文件已经被成功存储了。