在图片降采样的过程中,常采用pooling(池化)方法来降采样。
计算图像一个区域上的某个特定特征的平均值或最大值,这种聚合操作叫做池化。
池化后的这些统计特征不仅具有低得多的维度,同时训练结果不容易过拟合。
常用的池化方法:
1.均值池化:对池化区域内的像素点取均值,这种方法得到的特征数据对背景信息更敏感
2.最大池化:对池化区域的所有像素值取最大值,这种方法得到的特征数据对纹理信息更加敏感
一:导入需要使用到的库
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
二:读取图片,并可视化
img = Image.open('小镇.jpg')
plt.imshow(img)
plt.axis('off')
三:RGB三通道数据分离
r, g, b = img.split()
plt.imshow(r)
plt.axis('off')
四:定义池化函数
#均值池化
def pooling(data, m, n):
a,b = data.shape
img_new = []
for i in range(0,a,m):
line = []#记录每一行
for j in range(0,b,n):
x = data[i:i+m,j:j+n]#选取池化区域
line.append(np.sum(x)/(n*m))
img_new.append(line)
return np.array(img_new)
原图片的分辨率为:
np.array(r).shape
(576, 1024)
是一张576*1024的图片,我们使用2*2的池化区域,对图片进行池化:
img_new = pooling(np.array(r), 2, 2)
plt.imshow(img_new)
plt.axis('off')
它的分辨率降到了:288*512
使用5*5的池化区域,其分辨率的降低可以更显著:
这是均值池化的效果,我们试一下最大值池化:
#最大池化
def pooling(data, m, n):
a,b = data.shape
img_new = []
for i in range(0,a,m):
line = []
for j in range(0,b,n):
x = data[i:i+m,j:j+n]
line.append(np.max(x))
img_new.append(line)
return np.array(img_new)
分别使用2*2,和5*5的池化来看一下效果:
可以明显看出,均值池化和最大池化的区别。