一.机器学习的卷积与池化
先通过 滤波器来使图片的特征更加明显
在池化,压缩图片信息但不丢失特征,使得计算更加迅速
import numpy as np
import matplotlib.pyplot as plt
from scipy import misc,datasets
# 一张图形
# DeprecationWarning: scipy.misc.ascent has been deprecated in SciPy v1.10.0; and will be completely removed in SciPy v1.12.0. Dataset methods have moved into the scipy.datasets module. Use scipy.datasets.ascent instead.
i = misc.ascent()
# 显示图形
# plt.grid(False)
# plt.gray()
# plt.axis('off')
# plt.imshow(i)
# plt.show()
# 图形转换到数组
i_transformed= np.copy(i)
size_x = i_transformed.shape[0]
size_y = i_transformed.shape[1]
# 定义滤波器
# filter = [[0,1,0],[1,-4,1],[0,1,0]]
# 突出竖线
filter = [[-1,-2,-1],[0,0,0],[1,2,1]]
# 突出横线
# filter = [[-1,0,1],[-2,0,2],[-1,0,1]]
# 权重为1,所有数值相加如果大于1,如果所有数值相加为10,则应该为0.1
# 比如 1,1,1 1,2,1 1,1,1 相加为10
weight = 1
# 图形的像素 以及邻值像素乘以 滤波器对应权重
for x in range(1,size_x-1):
for y in range(1,size_y-1):
convolution = 0.0
convolution = convolution + (i[x-1,y-1] * filter[0][0])
convolution = convolution + (i[x,y-1] * filter[0][1])
convolution = convolution + (i[x+1,y-1] * filter[0][2])
convolution = convolution + (i[x-1,y] * filter[1][0])
convolution = convolution + (i[x,y] * filter[1][1])
convolution = convolution + (i[x+1,y] * filter[1][2])
convolution = convolution + (i[x-1,y+1] * filter[2][0])
convolution = convolution + (i[x,y+1] * filter[2][1])
convolution = convolution + (i[x+1,y+1] * filter[2][2])
convolution = convolution * weight
if convolution<0:
convolution = 0
if convolution>255:
convolution = 255
i_transformed[x,y] = convolution
plt.grid(False)
plt.gray()
plt.imshow(i_transformed)
plt.show()
# 池化
# 压缩信息,使得图片像素变一半,2*2中获取最大像素值,4*4变成2*2
new_x = int(size_x/2)
new_y = int(size_y/2)
newImage = np.zeros((new_x,new_y))
for x in range(0,size_x,2):
for y in range(0,size_y,2):
pixels = []
pixels.append(i_transformed[x,y])
pixels.append(i_transformed[x+1,y])
pixels.append(i_transformed[x,y+1])
pixels.append(i_transformed[x+1,y+1])
pixels.sort(reverse=True)
newImage[int(x/2),int(y/2)] = pixels[0]
plt.gray()
plt.grid(False)
plt.imshow(newImage)
plt.show()