Numpy 应用案例
注:__使用 numpy 库来对图像进行处理。__这里我们使用 matplotlib.pyplot 的相关方法来辅助。
处理图像的时候,颜色都是使用 RGB 三个通道进行叠加而形成的一个颜色 _R:__ 红色通道 __G:__ 绿色__B: 蓝色_
可以使用三维的数组来表示一张图片
最高维度 0:__图片的高度 次高维 1:__图片的宽度 最低维 2:__RGB 三个元素
In [2]:
import numpy as np
import matplotlib.pyplot as plt
图像读取与显示
- plt.imread:读取图像,返回图像的数组(三维数组)。
- plt.imshow:显示图像。
- plt.imsave:保存图像。
说明:
- imread 方法默认只能处理 png 格式的图像,如果需要处理其他格式的图像,需要安装 pillow 库。
In [62]:
a=plt.imread(“1.jpg”) # 将图片信息读取成数组信息
# 返回的信息是一个三维的数组
# 最高维度:一共有 332 个元素
# 次高维:一共有 500 个元素
# 最低维:每个像素点的颜色信 r g b
a #已知数组信息,使用 imshow 读取成图片
plt.imshow(a)
# 将数组信息存储成图片
plt.imsave(“c:/numpy.jpg”,a)
# 利用已学过的知识显示数组 a 的形状
print(a.shape)
(332, 500, 3)
显示纯色图像
- 显示白色图像
- 显示黑色图像
- 显示指定颜色图像
In [23]:
# (1)如何在 ndarray 数组中存储一张图片。
# 三维:最高维:高
# 次高维:宽
# 最低维:颜色
# 颜色的存储:
# 在 numpy 中可以有两种形式:
# 3 rgb 颜色值越大,图片就越亮
一种是无符号 uint8 0-255
float 类型 float 0-1
# x=np.ones(shape=(100,200,3))# 白色图像,rgb[1,1,1]
# x=np.zeros(shape=(100,200,3))# 黑色色图像,rgb[0,0,0]
# x=np.full(shape=(100,200,3),fill_value=255)#rgb[255,255,255]
# plt.imshow(x)
# x=np.full(shape=(100,200,3),fill_value=148) # [148,148,148],[148,148,148],[148,148,148],[148,148,148],
# 使得 rgb 三个值都不同,但是图像上的所有点的 rgb 颜色都一致,就是纯色的其他颜色的图
# plt.imshow(x)
# 每个下像素点的值[228,251,142]
# x=[228,251,142] # 不行 直接使用 x 进行赋值,不是在对 x 中的每个元素进行赋值,而是将 x 跟其他的数据对象进行了绑定。
# x[:,:] # 获取图像中的每个 rgb 元素的值(列表)
# x[:,:]=[228,251,142]
# x[:]=[228,251,142] # 简化,因为获取的低维度全部获取。
# plt.imshow(x)
Out[23]:
<matplotlib.image.AxesImage at 0x997aa20>
转换为灰度图
灰度图的数据可以看成是二维数组,元素取值为 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”
`
In [36]:
# a# 三维的数组 最高维:高,次高维:宽 最低维[R,G,B]
# b=np.array([0.299,0.587,0.114])
# x=np.dot(a,b) # 将上面的 RGB 和 b 数组中的每个元素进行对位相乘,再相加,一定得到的是一个数字 L
# plt.imshow(x,cmap=”gray”)
第二种比较粗糙的方式,
# 目的是让每个 rgb 都变成一个数值,可以去 rgb 三个数值中的最大值,最小值,或者是平均值。
# x=np.max(a,axis=2)
# plt.imshow(x,cmap=”gray”)
# x=np.min(a,axis=2)
# plt.imshow(x,cmap=”gray”)
# x=np.mean(a,axis=2)
# plt.imshow(x,cmap=”gray”)
Out[36]:
<matplotlib.image.AxesImage at 0xa492b00>
灰度图(2)
以上转换为标准的公式,我们也可以采用不正规的方式:
- 使用最大值代替整个最低维
- 使用最小值代替整个最低维
- 使用平均值代替整个最低维
图像颜色通道
对于彩色图像,可以认为是由 RGB 三个通道构成的。每个最低维就是一个通道。分别提取 R,G,B 三个通道,并显示单通道的图像。
In [68]:
t=a.copy()
# 进行红色通道的提取:就是将每个像素点中的 g 和 b,设置成 0
#(1)获取素有的像素点。
#(2)将每个像素点中的第 1 个元素和第二个元素(g,b)设置成 0
# [r,g,b]
# t[:,:,1:3]=0
# plt.imshow(t)
# 对蓝色通道进行提取
# 将 b 不变,其余都设置成 0
[r,g,b]
# t[:,:,0:2]=0
# plt.imshow(t)
# 对绿色通道进行提取
# 将 g 不变,其余都设置成 0
[r,g,b]
# t[:,:,0:3:2]=0
# t[:,:,::2]=0
# plt.imshow(t)
# 获取绿色通道,如果不使用切片,只使用索引
# 通过提供整数索引
# a=np.array([1,2,3,4,5])
# a[1],a[3],a[4]
# index=[1,3,4] #形成索引列表
# a[index]
t
# greenindex=[0,2]
# t[:,:,greenindex]=0
# 以下三种方法都可以
t[:,:,[0,2]]=0
t[:,:,0:3:2]=0
t[:,:,::2]=0
# plt.imshow(t)
# 一起显示
red=a.copy()
green=a.copy()
blue=a.copy()
red[:,:,1:3]=0
green[:,:,::2]=0
blue[:,:,:2]=0
fig,ax=plt.subplots(2,2)
fig.set_size_inches(15,15)
ax[0,0].imshow(a)
ax[0,1].imshow(red)
ax[1,0].imshow(green)
ax[1,1].imshow(blue)
Out[68]:
<matplotlib.image.AxesImage at 0xc6ab780>
图像重复
- 将图像沿着水平方向重复三次。
- 将图像沿着垂直方向重复两次。
- 将图像沿着水平方向重复两次,垂直重复三次。
In [74]:
t=a.copy()
# r=np.concatenate((t,t,t),axis=1)
# r=np.concatenate((t,t),axis=0)
# 先水平方向两次,再垂直方向 3 次
r1=np.concatenate((t,t),axis=1)
r2=np.concatenate((r1,r1,r1),axis=0)
plt.imshow(r2)
Out[74]:
<matplotlib.image.AxesImage at 0xc52e4a8>
图像镜面对称
- 将图像水平镜面转换。
- 将图像垂直镜面转换。
In [91]:
# li=[1,2,3,4,5]
# li[::-1]
# 获得 ndarray 数组下的每一列
# x=np.array([[1,2,3,4],
# [5,6,7,8]])
# x[1]
# x[:,1]
t=a.copy()
# t[:,::-1]
plt.imshow(t[:,::-1])
# 水平镜面
# 相当于进行行交换,让原来第 0 行,显示在第 n 行
t=a.copy()
plt.imshow(t[::-1])
Out[91]:
<matplotlib.image.AxesImage at 0xf978ef0>
左右旋转
- 将图像向左旋转 90 / 180 度。
- 将图像向右旋转 90 / 180 度。
In [100]:
# 对于二维数组来说,行变列,列变行
x=np.array([[1,2,3],[4,5,6]])
print(x)
x.transpose()
# 向左旋转 90 度
#(1)先 tranpose
(2)再做水平镜面
# t=a.copy()
# r=t.transpose(1,0,2)
# plt.imshow(r[::-1])
# 右旋转 90
# (1)转置
(2)做垂直镜面
t=a.copy()
# t.transpose(1,0,2)
r=t.swapaxes(0,1)
plt.imshow(r[:,::-1])
[[1 2 3]
[4 5 6]]
Out[100]:
<matplotlib.image.AxesImage at 0xfa8dfd0>
颜色转换
在图像中,用绿色值代替以前的红色值,用蓝色值代替以前的绿色值,用红色值代替以前的蓝色值。
颜色遮挡 / 叠加
- 在指定的区域使用特定的纯色去遮挡图像。
- 在指定的区域使用随机生成的图像去遮挡图像。
- 使用小图像放在大图像上。
图像分块乱序
将图像分成若干块子图像(例如 10 * 10),然后打乱各子图像顺序(拼图)。
如果你觉得文章还不错,请大家点赞分享下。
▼
文章详情,请关注微信公众号 ”Python 爬虫与大数据分析 ”