在进行图像领域的深度学习的时候经常需要对图片进行处理,包括图像的翻转,压缩,截取等,一般都是用Numpy来处理。处理起来也很方便。
In[3]
导入需要的包
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
读入图片
image = Image.open('./work/vehicle1.jpg')
image = np.array(image)
查看数据形状,其形状是[H, W, 3],
其中H代表高度, W是宽度,3代表RGB三个通道
image.shape
(437, 700, 3)
In[4]
原始图片
plt.imshow(image)
?
In[7]
垂直方向翻转
这里使用数组切片的方式来完成,
相当于将图片最后一行挪到第一行,
倒数第二行挪到第二行,...,
第一行挪到倒数第一行
对于行指标,使用::-1来表示切片,
负数步长表示以最后一个元素为起点,向左走寻找下一个点
对于列指标和RGB通道,仅使用:表示该维度不改变
image2 = image[::-1, :, :]
plt.imshow(image2)
?
In[8]
水平方向翻转
image3 = image[:, ::-1, :]
plt.imshow(image3)
?
In[5]
180度方向翻转
image31 = image[::-1, ::-1, :]
plt.imshow(image31)
?
In[9]
保存图片
im3 = Image.fromarray(image3)
im3.save('im3.jpg')
In[10]
高度方向裁剪
H, W = image.shape[0], image.shape[1]
注意此处用整除,H_start必须为整数
H1 = H // 2
H2 = H
image4 = image[H1:H2, :, :]
plt.imshow(image4)
?
In[11]
宽度方向裁剪
W1 = W//6
W2 = W//3 * 2
image5 = image[:, W1:W2, :]
plt.imshow(image5)
?
In[13]
两个方向同时裁剪
image5 = image[H1:H2, \
W1:W2, :]
plt.imshow(image5)
?
In[14]
调整亮度
image6 = image * 0.5
plt.imshow(image6.astype('uint8'))
?
In[15]
调整亮度
image7 = image * 2.0
由于图片的RGB像素值必须在0-255之间,
此处使用np.clip进行数值裁剪
image7 = np.clip(image7, \
a_min=None, a_max=255.)
plt.imshow(image7.astype('uint8'))
?
In[16]
高度方向每隔一行取像素点
image8 = image[::2, :, :]
plt.imshow(image8)
?
In[17]
宽度方向每隔一列取像素点
image9 = image[:, ::2, :]
plt.imshow(image9)
?
In[18]
间隔行列采样,图像尺寸会减半,清晰度变差
image10 = image[::2, ::2, :]
plt.imshow(image10)
image10.shape
(219, 350, 3)
?