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]

python numpy图片插值resize numpy处理图片_实战型母

显示纯色图像

  • 显示白色图像
  • 显示黑色图像
  • 显示指定颜色图像
# 图像的数组可以采用两种类型来表示,一种是无符号的整数类型,取值范围为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)

python numpy图片插值resize numpy处理图片_图像案例_02

转换为灰度图

灰度图的数据可以看成是二维数组,元素取值为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")

python numpy图片插值resize numpy处理图片_图像处理_03

灰度图(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")

python numpy图片插值resize numpy处理图片_Numpy_04

图像颜色通道

对于彩色图像,可以认为是由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)

python numpy图片插值resize numpy处理图片_数据科学与计算_05


python numpy图片插值resize numpy处理图片_图像案例_06

图像重复

  • 将图像沿着水平方向重复三次。
  • 将图像沿着垂直方向重复两次。
  • 将图像沿着水平方向重复两次,垂直重复三次。
# 令图像进行重复,实际上就是让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)

python numpy图片插值resize numpy处理图片_Numpy_07

图像镜面对称

  • 将图像水平镜面转换。
  • 将图像垂直镜面转换。
plt.imshow(data)

python numpy图片插值resize numpy处理图片_图像案例_08

# 图像垂直镜子,水平镜像。将数组的列进行颠倒即可。
# plt.imshow(data[:, ::-1])
# 图像水平镜子,垂直镜像。将数组的行进行颠倒即可。
plt.imshow(data[::-1])

python numpy图片插值resize numpy处理图片_Numpy_09

左右旋转

  • 将图像向左旋转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)

python numpy图片插值resize numpy处理图片_图像处理_10

# # 图像向右旋转90度。需要将数组进行转置,然后,再进行一次水平方向的镜像。
t = data.copy()
# 转置
t = t.swapaxes(0, 1)
# 进行水平镜像。
t = t[:, ::-1]
plt.imshow(t)

python numpy图片插值resize numpy处理图片_图像处理_11

# 旋转180度。将图像进行一次水平镜像,然后再进行一次垂直镜像。
t = data.copy()
# 垂直镜像
t = t[::-1]
# 水平镜像
t = t[:, ::-1]
plt.imshow(t)

python numpy图片插值resize numpy处理图片_数据科学与计算_12

颜色转换

在图像中,用绿色值代替以前的红色值,用蓝色值代替以前的绿色值,用红色值代替以前的蓝色值。

# 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)

python numpy图片插值resize numpy处理图片_图像处理_13

图像分块乱序

将图像分成若干块子图像(例如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)

python numpy图片插值resize numpy处理图片_图像处理_14