Numpy应用案例
借用吴恩达大神夫妇图片~
注:使用numpy库来对图像进行处理。这里我们使用matplotlib.pyplot的相关方法来辅助。
import numpy as np
import matplotlib.pyplot as plt
图像读取与显示
- plt.imread:读取图像,返回图像的数组。
- plt.imshow:显示图像。
- plt.imsave:保存图像。
说明:
- imread方法默认只能处理png格式的图像,如果需要处理其他格式的图像,需要安装pillow库。
data = plt.imread("1.jpg")
# data.shape
plt.imshow(data)
# data[0][0]
显示纯色图像
- 显示白色图像
- 显示黑色图像
- 显示指定颜色图像
# 图像的数组可以采用两种类型来表示,一种是无符号的整数类型,取值范围为0 ~ 255,0为黑色,255为白色。
# 一种是使用浮点类型来表示,取值范围为0 ~ 1。0为黑色,1为白色。
# 显示纯白色图像。
# t = np.ones(shape=(100, 100, 3))
# plt.imshow(t)
# 显示纯黑色图像。
# t = np.zeros(shape=(100, 100, 3))
# plt.imshow(t)
# 显示指定颜色的图像。
# t = np.full(shape=(100, 100, 3), fill_value=125, dtype=np.uint8)
# t.dtype
# 修改ndarray数组中元素的值。
# 注意:不能这样操作,因为这样是将变量t绑定新的对象,而并没有修改数组元素的值。
# t = [248, 214, 90]
# t[:] = [248, 214, 90]
# t = np.full(shape=(100, 100, 3), fill_value=255)
# plt.imshow(t)
# np.full方法,fill_value参数也可以是一个数组。
t = np.full(shape=(100, 100, 3), fill_value=[248, 214, 90], dtype=np.uint8)
plt.imshow(t)
转换为灰度图
灰度图的数据可以看成是二维数组,元素取值为0 ~ 255,其中,0为黑色,255为白色。从0到255逐渐由暗色变为亮色。
灰度图转换(ITU-R 601-2亮度变换):
L = R * 299 / 1000 + G * 587 / 1000 + B * 114 / 1000
R,G,B为最低维的数据。
显示灰度图时,需要在imshow中使用参数:cmap="gray"
# 灰度图是一个黑白的图像,只有一个通道,因此,灰度图是二维的图像。
t = [0.299, 0.587, 0.114]
# data.shape
t2 = np.dot(data, t)
plt.imshow(t2, cmap="gray")
灰度图(2)
以上转换为标准的公式,我们也可以采用不正规的方式:
- 使用最大值代替整个最低维
- 使用最小值代替整个最低维
- 使用平均值代替整个最低维
# 使用最大值代替整个最低维
# t = np.max(data, axis=2)
# plt.imshow(t, cmap="gray")
# 使用最小值代替整个最低维
# t = np.min(data, axis=2)
# plt.imshow(t, cmap="gray")
# 使用平均值代替整个最低维
t = np.mean(data, axis=2)
plt.imshow(t, cmap="gray")
图像颜色通道
对于彩色图像,可以认为是由RGB三个通道构成的。每个最低维就是一个通道。分别提取R,G,B三个通道,并显示单通道的图像。
# 提取图像的通道,可以将提取的通道值保持不变,然后让其他所有的通道值为0。
# 提取红色通道
red = data.copy()
red[:,:,1:3] = 0
# plt.imshow(t)
# 提取绿色通道
green = data.copy()
# t[:, :, ::2] = 0
green[:, :, [0, 2]] = 0
# 提取蓝色通道
blue = data.copy()
blue[:, :, :2] = 0
# plt.imshow(t)
figure, ax = plt.subplots(2, 2)
figure.set_size_inches(10, 10)
ax[0,0].imshow(data)
ax[0,1].imshow(red)
ax[1,0].imshow(green)
ax[1,1].imshow(blue)
图像重复
- 将图像沿着水平方向重复三次。
- 将图像沿着垂直方向重复两次。
- 将图像沿着水平方向重复两次,垂直重复三次。
# 令图像进行重复,实际上就是让ndarray数组进行重复。
# 我们可以使用数组连接实现重复。
# 水平方向重复三次
t = np.concatenate((data, data, data), axis=1)
# plt.imshow(t)
# 垂直方向重复两次。
t = np.concatenate((data, data), axis=0)
# plt.imshow(t)
# 水平方向重复两次,垂直方向重复三次。
t = np.concatenate((data, data), axis=1)
t = np.concatenate((t, t, t), axis=0)
plt.imshow(t)
图像镜面对称
- 将图像水平镜面转换。
- 将图像垂直镜面转换。
plt.imshow(data)
# 图像垂直镜子,水平镜像。将数组的列进行颠倒即可。
# plt.imshow(data[:, ::-1])
# 图像水平镜子,垂直镜像。将数组的行进行颠倒即可。
plt.imshow(data[::-1])
左右旋转
- 将图像向左旋转90 / 180度。
- 将图像向右旋转90 / 180度。
# 将图像向左旋转90度,就是讲数组进行转置,然后再进行一次垂直方向的镜像。
# 注意:这里的转置是让0轴与1轴进行交换,2轴不动,因此,不能简单的使用T属性。
# t = data.T
t = data.copy()
# 交换0轴与1轴。
t = t.swapaxes(0, 1)
# 也可以使用带参数的transpose方法。
# t.transpose(1, 0, 2)
# 进行垂直方向的镜像。
t = t[::-1]
plt.imshow(t)
# # 图像向右旋转90度。需要将数组进行转置,然后,再进行一次水平方向的镜像。
t = data.copy()
# 转置
t = t.swapaxes(0, 1)
# 进行水平镜像。
t = t[:, ::-1]
plt.imshow(t)
# 旋转180度。将图像进行一次水平镜像,然后再进行一次垂直镜像。
t = data.copy()
# 垂直镜像
t = t[::-1]
# 水平镜像
t = t[:, ::-1]
plt.imshow(t)
颜色转换
在图像中,用绿色值代替以前的红色值,用蓝色值代替以前的绿色值,用红色值代替以前的蓝色值。
# t = np.array(["red", "green", "blue"]) # => ["green", "blue", "red"]
# t[[1, 2, 0]]
# 通过整数数组索引来实现元素提取。
# t = data[:, :, [1, 2, 0]]
# plt.imshow(t)
颜色遮挡 / 叠加
- 在指定的区域使用特定的纯色去遮挡图像。
- 在指定的区域使用随机生成的图像去遮挡图像。
- 使用小图像放在大图像上。
copy = data.copy()
# t = np.full((100, 100, 3), fill_value=[233, 93, 250])
# copy[100:200, 400:500] = t
# copy[100:200, 400:500] = [233, 93, 250]
# t = np.random.randint(0, 256, size=(200, 200, 3))
# plt.imshow(copy)
# copy[100:300, 400:600] = t
# plt.imshow(copy)
copy
# 小图像放在大图像上。左移
copy[50:150, 150:250] = copy[200:300, 300:400]
plt.imshow(copy)
图像分块乱序
将图像分成若干块子图像(例如10 * 10),然后打乱各子图像顺序(拼图)。
t = data.copy()
height = data.shape[0]
width = data.shape[1]
# 步骤
# 1 对数组进行切分,切分成若干部分。
# 2 对数组进行洗牌,打乱每个子数组(切分之后的每个小图像)的顺序。
# 3 对数组进行组合。
t = np.split(t, range(30, height, 30), axis=0)
np.random.shuffle(t)
t = np.concatenate(t, axis=0)
t = np.split(t, range(30, width, 30), axis=1)
np.random.shuffle(t)
t = np.concatenate(t, axis=1)
plt.imshow(t)