Numpy应用案例
注:使用numpy库来对图像进行处理。这里我们使用matplotlib.pyplot的相关方法来辅助。
对于彩色图像,可以认为是由RGB三个通道构成的。每个最低维就是一个通道。分别提取R(红色),G(绿色),B(蓝色)三个通道,并显示单通道的图像。
对图像的操作,其实就是对三维数组[R,G,B]中的值的修改。
1、图像读取与显示
- plt.imread:读取图像,返回图像的数组。
- plt.imshow:显示图像。
- plt.imsave:保存图像。
说明:
- imread方法默认只能处理png格式的图像,如果需要处理其他格式的图像,需要安装pillow库。
import numpy as np
import matplotlib.pyplot as plt
# 读取图像数据,返回ndarray数组。
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
print(type(a))
print(a.shape)
# 显示图像。(传递表示图像的ndarray数组对象)
plt.imshow(a)
# 保存图像
plt.imsave("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/python.jpg", a)
2、显示纯色图像
- 显示白色图像(创建一个数组,值都是255)
- 显示黑色图像(创建一个数组,值都是0)
- 显示指定颜色图像(通过截图可以看到RGB像素大小)
图像可以有两种表示方式:
- 使用无符号的np.uint8,取值是0-255
- 使用float类型表示,取值是0.0-1.0。其中float类型的0.0对应整数的0,float类型的1.0对应整数类型的1.0
a = np.zeros([400,400,3])
# 显示图像。(传递表示图像的ndarray数组对象)
plt.imshow(a)
或者
a = np.full((100,100,3),0,dtype=np.uint8)
# 显示图像。(传递表示图像的ndarray数组对象)
plt.imshow(a)
# float类型
a = np.ones([100,100,3])
plt.imshow(a)
或者
# np.uint8类型
b = np.full((100,100,3),255,dtype=np.uint8)
plt.imshow(b)
# 显示指定颜色(228,238,249)
a = np.full((100,100,3),1,dtype=np.uint8)
a[:] = [228,238,249] # 广播
plt.imshow(a)
a = np.zeros([400,400,3])+ [0,255,0]
plt.imshow(a)
3、转换为灰度图(将三维变成二维)
标准算法:
灰度图的数据可以看成是二维数组,元素取值为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"
# 读取图像数据,返回ndarray数组。
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
print(a.shape) # 三维。3通道
x=np.dot(a,[0.299,0.587,0.114]) # 对位相乘再相加
print(x.shape) # 二维。单通道
plt.imshow(x,cmap="gray")
不正规算法:
以上转换为标准的公式,我们也可以采用不正规的方式:
- 使用最大值代替整个最低维(前两个不变,最后一个变)
- 使用最小值代替整个最低维
- 使用平均值代替整个最低维
# 读取图像数据,返回ndarray数组。
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
# x=np.max(a,axis=2)
# x=np.min(a,axis=2)
x=np.mean(a,axis=2)
plt.imshow(x,cmap="gray")
# 读取图像数据,返回ndarray数组。
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
# 将三种放在一起展示
fig,ax = plt.subplots(2,2)
fig.set_size_inches(5,5) # 画布大小
ax[0,0].imshow(np.dot(a,[0.299,0.587,0.114]),cmap="gray")
ax[0,1].imshow(np.max(a,axis=2) ,cmap="gray")
ax[1,0].imshow(np.min(a,axis=2) ,cmap="gray")
ax[1,1].imshow(np.mean(a,axis=2) ,cmap="gray")
plt.tight_layout() # 自动调整间距
4、图像颜色通道
对于彩色图像,可以认为是由RGB三个通道构成的。每个最低维就是一个通道。分别提取R,G,B三个通道,并显示单通道的图像。
# RGB图像近似认为是有R,G,B三种胶片叠加而成,提取单通道就是让其他为0
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
R=a.copy()
G=a.copy()
B=a.copy()
# 提取红色通道
R[:,:,[1,2]]=0
# 提取绿色通道
G[:,:,[0,2]]=0
# 提取蓝色通道
B[:,:,[0,1]]=0
fig,ax = plt.subplots(2,2)
fig.set_size_inches(5,5) # 画布大小
ax[0,0].imshow(R)
ax[0,1].imshow(G)
ax[1,0].imshow(B)
ax[1,1].imshow(a)
plt.tight_layout() # 自动调整间距
5、图像重复(利用数组拼接技术)
- 将图像沿着水平方向重复三次。
- 将图像沿着垂直方向重复两次。
- 将图像沿着水平方向重复两次,垂直重复三次。
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
# 将图像沿着水平方向重复三次。
print(a.shape)
b=np.concatenate((a,a,a),axis=1)
print(b.shape)
# 将图像沿着垂直方向重复两次
c=np.concatenate((a,a),axis=0)
print(c.shape)
# 将图像沿着水平方向重复两次,垂直重复三次。
d=np.concatenate((a,a),axis=1)
d=np.concatenate((d,d,d),axis=0)
print(d.shape)
fig,ax = plt.subplots(2,2)
fig.set_size_inches(5,5) # 画布大小
ax[0,0].imshow(a)
ax[0,1].imshow(b)
ax[1,0].imshow(c)
ax[1,1].imshow(d)
plt.tight_layout() # 自动调整间距
6、图像镜面对称
- 将图像水平镜面转换。
- 将图像垂直镜面转换。
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
# 将图像沿着水平方向重复三次。
b=a.copy()
d=a.copy()
# 将图像水平镜面转换。(只需要将列进行颠倒,行不变)
b=b[:,::-1]
# 将图像垂直镜面转换。(只需要将行进行颠倒,列不变)
d=d[::-1,:]
fig,ax = plt.subplots(2,2)
fig.set_size_inches(5,5) # 画布大小
ax[0,0].imshow(a)
ax[0,1].imshow(b)
ax[1,0].imshow(a)
ax[1,1].imshow(d)
plt.tight_layout() # 自动调整间距
7、左右旋转
- 将图像向左旋转90 / 180度。
- 将图像向右旋转90 / 180度。
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
b=a.copy()
c=a.copy()
d=a.copy()
e=a.copy()
# 将图像向左旋转90 (转置后头还在原位置,所以还得垂直颠倒)
# 注意不能直接转置,我们只转置【高,宽,像素】中的高和宽,转成【宽,高,像素】而不是【像素,宽,高】
b=b.swapaxes(0,1)
b=b[::-1,:]
# 将图像向右旋转90(转置后头还在原位置,所以还得水平颠倒)
d=d.swapaxes(0,1)
d=d[:,::-1]
# 将图像向左旋转180 ==向右旋转180(将图像分别进行水平和垂直颠倒,先哪个都行)
c=c[::-1,:]
c = c[:,::-1]
# 将图像向右旋转180
e=e[:,::-1]
e=e[::-1,:]
fig,ax = plt.subplots(2,3)
fig.set_size_inches(5,5) # 画布大小
ax[0,0].imshow(a)
ax[0,1].imshow(b)
ax[0,2].imshow(c)
ax[1,0].imshow(a)
ax[1,1].imshow(d)
ax[1,2].imshow(e)
plt.tight_layout() # 自动调整间距
8、颜色转换
在图像中,用绿色值代替以前的红色值,用蓝色值代替以前的绿色值,用红色值代替以前的蓝色值。
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
plt.imshow(a[:,:,[1,2,0]])
9、颜色遮挡 / 叠加
- 在指定的区域使用特定的纯色去遮挡图像。
- 在指定的区域使用随机生成的图像去遮挡图像。
- 使用小图像放在大图像上。
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
# 在指定的区域使用特定的纯色去遮挡图像。
b=a.copy()
b[300:500,600:800] = [0,255,0]
plt.imshow(b)
# 在指定的区域使用随机生成的图像去遮挡图像。
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
print(a.shape)
c=a.copy()
e=np.random.randint(0,256,(200,200,3),dtype=np.uint8)
c[300:500,600:800] = e
plt.imshow(c)
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
# 使用小图像放在大图像上。
d=a.copy()
k=d[200:400,1000:1200]
d[300:500,600:800] = k
plt.imshow(d)
10、图像分块乱序
将图像分成若干块子图像(例如10 * 10),然后打乱各子图像顺序(拼图)。
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
# 将图像的两部分进行组合
t=a.copy()
t=np.concatenate((t[100:300,:,:],t[600:800,:,:]),axis=0)
plt.imshow(t)
a = plt.imread("C:/Users/hubert/Desktop/数据分析就业班(上海3万培训班)/数据分析/1.jpg")
# 将图像拆分为一条一条的
t=a.copy()
height=t.shape[0]
# 1、对数据进行切分
li=np.split(t,range(30,height,30),axis=0)
# 2、洗牌
np.random.shuffle(li) # 就地修改
# 3、合并
t=np.concatenate(li,axis=0)
plt.imshow(t)