我们这周四的python拓展课讲述了图像的增广,老师给我们讲了一个小案例。用到的库有:Numpy

opencv matplotlib

Numpy库

我们使用Numpy库,这个库是python用来做矩阵运算和高维向量的库,本质就是高等数学的线性代数。我们老师简单的讲了用numpy库生成三维数组(或者叫列表)和简单的说了三维数组。


Python

开发工具:Windows10 spyder4 numpy库。如果你是安装anaconda库那么这个库就自动安装好了。如果你是安装了python核需要自己安装numpy库。cmd环境里敲入下面代码,在安装的时候记得加上清华镜像参数,这个清华镜像参数自己度娘去吧

pip install numpy

三维数组,我们老师讲的很浅显,说你们就去数逗号,就是数分隔符和看中括号。

我们生成一个简单的三维数组。首先导入numpy库

import numpy as np

后面的as np就是给numpy设置别名,这样好调用。然后使用np.array()方法生成三维数组。

b = np.array([[[1,2,3,4],[1,2,3,4]],[[6,7,8,9],[11,12,13,14]]])

老师说这个三维数组按照她的办法很好理解。先写一对儿[ ],这个代表一维,如果再包一层就是二维;再来一层就是三维。三维其实就是最外面的一对儿[ ]包起来的两个二维数组(这是按照我上面给出的代码例句)。

我们该怎么判断它是几维数组呢?我们使用numpy的ndim方法来判断它是几维数组。

print(b.ndim)
n.dim方法的结果:3

我们再使用shape方法分割数组

print(b.shape)
shape方法的结果:(2, 2, 4)

分割出来的意思是:两个二维数组,里面有两个一维数组,再里面是4个元素。

np.float32()方法和np.float64()就是数位的区别,在内存中分别占32位和64位。也就是4Bytes和8Bytes。

我们为了方便对numpy数据读写操作,可以写成.npy格式的文件。

使用save()方法保存,使用load()方法读取。

print(np.save('b.npy', b))print(np.load('b.npy'))

它的格式不是普通的文本文件,使用notepad无法打开,编码格式不对的。必须使用load方法才能正确的解码阅读。


matplotlib

下面介绍一下matplotlib是python的一个开源2D/3D可视化库,用于统计学的。很多统计数学的散点或者正态分布之类的都是使用它来生成图像。




python



还是那句话,可以自行安装该库。

引用该库

import matplotlib.pyplot as plt

它的窗口是不支持汉字和数学负号的(不是符号,是正负的负),会出现乱码我们使用下面两行参数使其兼容。

plt.rcParams['font.sans-serif']=['SimHei'] # 正常显示汉字
plt.rcParams['axes.unicode_minus'] = False # 显示数学负号

展示图片使用imshow方法

plt.imshow()

给窗口起名字和划分子图还有保存图像的方法

plt.title() # 给窗口命名 最好是英语plt.subplot() # 划分子图plt.savefig() # 保存图像

就将读取的数据以图像的方式展现了。它在读取彩色图像的时候它的颜色顺序和我们人类习惯是一样的就是RGB的顺序,但是它和openc的彩色读取顺序是不一样的,这个一会儿分析。


还有用到opencv库。前面说到它读取彩色图片的顺序是不一样的它是BGR顺序。这就会造成我们读取彩色图片是红色和蓝色顺序反了。这个我们使用opencv的logo这张jpg图片不认真看是看不出来的。感兴趣可以试试。但是,这个顺序很反人类怎么办,有一个方法可以兼容。

img_BGR = cv2.cvtColor(img_BGR,cv2.COLOR_BGR2RGB)

使用cv2.cvtCOLOR方法,第二个参数是cv2.COLOR_BGR2RGB意思是将BGR读取模式转换成RGB模式。感兴趣可以试一试。


图像的放大和缩小

有cv2.resize(src,dsize[,fx[,fy[,interpolation]]])方法,它有几个参数:

  1. src:源文件,就是原图像
  2. dsize:输出图像大小
  3. fx:水平轴上的缩放比例
  4. fy:垂直轴上的缩放比例

interpolation:插值方法。这个插值方法我也不是很明白,我自己去菜鸟教程上找找参考资料。

图像平移的方法:cv2.warpAffine()。将图像沿着x,y轴移动指定的像素,需要构建平移矩阵:tx是x的偏移量,ty是y轴的偏移量。

cv2.warpAffine(src,M,dsize)

  1. src:就是源文件
  2. M:图像的变换矩阵
  3. dsize:输出后的图像大小

例如:对图像进行平移,把图像分别沿x轴移动100个像素,和沿y轴移动50个像素。实例代码如下:

import cv2import numpy as npimg = cv2.imread(./testImage/opencv.jpg)rows,cols,channel = img.shapeprint(img.shape)M = np.float32([[1,0,100],[0,1,50]])dst = cv2.warpAffine(img,M,(cols,rows))cv2.imshow('original',img)cv2.imshow('shift',dst)cv2.waitKey()cv2.destoryAllWindows()

图像的旋转

是以图像中心为原点,旋转一定的角度。

opencv库提供了一个方法:cv2.getRotationMatrix2D(center,angle,scale)

  1. center图像旋转的中心点
  2. 旋转角度
  3. 图像缩放比例

图像翻转

对图像进行水平或垂直翻转。cv2.flip(src,flipCode,[,dst])方法

  1. src原始图像
  2. flipCode:旋转方式 1水平翻转 0垂直翻转 -1水平垂直翻转

图像的增广就先说到这里,有不足之处还望多指教一二。本文代码和定义参考老师上课时的课件,代码是我上课时参考课件写的,有兴趣的可以试试。

Python的强大不止于此。