day3 Numpy应用案例(1)

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像素大小)

图像可以有两种表示方式:

  1. 使用无符号的np.uint8,取值是0-255
  2. 使用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)

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值