什么是池化pooling:在矩阵领域内按照规则取值,常见的有均值池化、最大值池化、中值池化、
最小值池化。
池化实现的两个功能:降维和提取特征信息
池化大小:一般用大小为3*3的或者5*5的池化矩阵
池化的本质:卷积
简单解释池化:将领域内的值综合为一个值
python代码实现中值池化,调整步长,可以实现池化后图片大小是否改变
def midpooling(img1):#中值池化,池化后不改变图的大小
m, n = img1.shape
img1_ext = cv.copyMakeBorder(img1,1,1,1,1,cv.BORDER_CONSTANT,value=(np.nan,np.nan,np.nan)) / 1.0 #用的是3*3的池化,所以补一圈1 除以1.0的目的是uint8转为float型,便于后续计算
rows_ext,cols_ext = img1_ext.shape
img1_ext [np.isnan( img1_ext )]=0
midpooling= np.full((m,n),0)
for i in range(1,rows_ext-1):
for j in range(1,cols_ext-1):
pool = [img1_ext[i-1,j-1],img1_ext[i,j-1],img1_ext[i+1,j-1],
img1_ext[i-1,j],img1_ext[i,j],img1_ext[i+1,j],
img1_ext[i-1,j+1],img1_ext[i,j+1],img1_ext[i+1,j+1]]
midpooling[i-1,j-1]= np.median(pool)
return midpooling
def midpooling(img1,step):#中值池化,池化后改变图的大小
m, n = img1.shape
img1_ext = cv.copyMakeBorder(img1,1,1,1,1,cv.BORDER_CONSTANT,value=(np.nan,np.nan,np.nan)) / 1.0 #用的是3*3的池化,所以补一圈空值除以1.0的目的是uint8转为float型,便于后续计算
rows_ext,cols_ext = img1_ext.shape
img1_ext [np.isnan( img1_ext )]=0
midpooling= np.full((m,n),0)
for i in range(1,rows_ext-1,step):
for j in range(1,cols_ext-1,step):
pool = [img1_ext[i-1,j-1],img1_ext[i,j-1],img1_ext[i+1,j-1],
img1_ext[i-1,j],img1_ext[i,j],img1_ext[i+1,j],
img1_ext[i-1,j+1],img1_ext[i,j+1],img1_ext[i+1,j+1]]
midpooling[i-1,j-1]= np.median(pool)
return midpooling
如果pool的尺寸是3*3,一般step = 3;如果pool的尺寸是5*5,一般step = 5,同时补零的大小需要改变。
想要实现均值池化,只需改变一行代码即可
def meanpooling(img1):#中值池化,池化后不改变图的大小
m, n = img1.shape
img1_ext = cv.copyMakeBorder(img1,1,1,1,1,cv.BORDER_CONSTANT,value=(np.nan,np.nan,np.nan)) / 1.0 #用的是3*3的池化,所以补一圈1 除以1.0的目的是uint8转为float型,便于后续计算
rows_ext,cols_ext = img1_ext.shape
img1_ext [np.isnan( img1_ext )]=0
meanpooling= np.full((m,n),0)
for i in range(1,rows_ext-1):
for j in range(1,cols_ext-1):
pool = [img1_ext[i-1,j-1],img1_ext[i,j-1],img1_ext[i+1,j-1],
img1_ext[i-1,j],img1_ext[i,j],img1_ext[i+1,j],
img1_ext[i-1,j+1],img1_ext[i,j+1],img1_ext[i+1,j+1]]
meanpooling[i-1,j-1]= np.nanmean(pool)
return meanpooling
def meanpooling(img1,step):#中值池化,池化后改变图的大小
m, n = img1.shape
img1_ext = cv.copyMakeBorder(img1,1,1,1,1,cv.BORDER_CONSTANT,value=(np.nan,np.nan,np.nan)) / 1.0 #用的是3*3的池化,所以补一圈空值除以1.0的目的是uint8转为float型,便于后续计算
rows_ext,cols_ext = img1_ext.shape
img1_ext [np.isnan( img1_ext )]=0
meanpooling= np.full((m,n),0)
for i in range(1,rows_ext-1,step):
for j in range(1,cols_ext-1,step):
pool = [img1_ext[i-1,j-1],img1_ext[i,j-1],img1_ext[i+1,j-1],
img1_ext[i-1,j],img1_ext[i,j],img1_ext[i+1,j],
img1_ext[i-1,j+1],img1_ext[i,j+1],img1_ext[i+1,j+1]]
meanpooling[i-1,j-1]= np.nanmean(pool)
return meanpooling
想要实现最大值池化,只需改变一行代码即可
def maxpooling(img1):#中值池化,池化后不改变图的大小
m, n = img1.shape
img1_ext = cv.copyMakeBorder(img1,1,1,1,1,cv.BORDER_CONSTANT,value=(np.nan,np.nan,np.nan)) / 1.0 #用的是3*3的池化,所以补一圈1 除以1.0的目的是uint8转为float型,便于后续计算
rows_ext,cols_ext = img1_ext.shape
img1_ext [np.isnan( img1_ext )]=0
maxpooling= np.full((m,n),0)
for i in range(1,rows_ext-1):
for j in range(1,cols_ext-1):
pool = [img1_ext[i-1,j-1],img1_ext[i,j-1],img1_ext[i+1,j-1],
img1_ext[i-1,j],img1_ext[i,j],img1_ext[i+1,j],
img1_ext[i-1,j+1],img1_ext[i,j+1],img1_ext[i+1,j+1]]
maxpooling[i-1,j-1]= np.max(pool)
return maxpooling
def maxpooling(img1,step):#中值池化,池化后改变图的大小
m, n = img1.shape
img1_ext = cv.copyMakeBorder(img1,1,1,1,1,cv.BORDER_CONSTANT,value=(np.nan,np.nan,np.nan)) / 1.0 #用的是3*3的池化,所以补一圈空值除以1.0的目的是uint8转为float型,便于后续计算
rows_ext,cols_ext = img1_ext.shape
img1_ext [np.isnan( img1_ext )]=0
maxpooling= np.full((m,n),0)
for i in range(1,rows_ext-1,step):
for j in range(1,cols_ext-1,step):
pool = [img1_ext[i-1,j-1],img1_ext[i,j-1],img1_ext[i+1,j-1],
img1_ext[i-1,j],img1_ext[i,j],img1_ext[i+1,j],
img1_ext[i-1,j+1],img1_ext[i,j+1],img1_ext[i+1,j+1]]
maxpooling[i-1,j-1]= np.max(pool)
return maxpooling