首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python数据分析中的Numpy图像处理实操!

Numpy应用案例

注:使用numpy库来对图像进行处理。这里我们使用matplotlib.pyplot的相关方法来辅助。

处理图像的时候,颜色都是使用RGB三个通道进行叠加而形成的一个颜色R:红色通道G:绿色B: 蓝色

可以使用三维的数组来表示一张图片

最高维度0:图片的高度 次高维1:图片的宽度 最低维2:RGB三个元素

In [2]:

importnumpyasnp

importmatplotlib.pyplotasplt

图像读取与显示

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]:

转换为灰度图

灰度图的数据可以看成是二维数组,元素取值为0 ~ 255,其中,0为黑色,255为白色。从0到255逐渐由暗色变为亮色。

灰度图转换(ITU-R 601-2亮度变换):

L = R * 299 / 1000 + G * 587 / 1000 + B * 114 / 1000

R,G,B为最低维的数据。

显示灰度图时,需要在imshow中使用参数:

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]:

灰度图(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[:,:,[,2]]=0

t[:,:,: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[,].imshow(a)

ax[,1].imshow(red)

ax[1,].imshow(green)

ax[1,1].imshow(blue)

Out[68]:

图像重复

将图像沿着水平方向重复三次。

将图像沿着垂直方向重复两次。

将图像沿着水平方向重复两次,垂直重复三次。

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]:

图像镜面对称

将图像水平镜面转换。

将图像垂直镜面转换。

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]:

左右旋转

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

plt.imshow(r[:,::-1])

[[1 2 3]

[4 5 6]]

Out[100]:

颜色转换

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

颜色遮挡 / 叠加

在指定的区域使用特定的纯色去遮挡图像。

在指定的区域使用随机生成的图像去遮挡图像。

使用小图像放在大图像上。

图像分块乱序

将图像分成若干块子图像(例如10 * 10),然后打乱各子图像顺序(拼图)。

如果你觉得文章还不错,请大家点赞分享下。你的肯定是我最大的鼓励和支持。

更多干货分享,请关注Python爬虫与大数据分析呀!

我就知道你“在看”!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191105A0PJ7D00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券