卷积和池化的具体操作过程

通过代码,了解卷积和池化的计算过程

import cv2 as cv
import numpy as np
from scipy import misc
import matplotlib.pyplot as plt

i =misc.ascent()# 获得一张图片


i_transformed = np.copy(i)
size_x = i_transformed.shape[0]#
size_y= i_transformed.shape[1]#


#设置一个过滤器
filter = [ [-1, -2, -1], [0, 0, 0], [1, 2, 1]]
# 如果过滤器中的所有数字加起来不是0或1,那么就应该设置权重,让过滤器的总和为0或1。
# 例如,如果过滤器是1,1,1,1,2,1,1,1,1。
# 它们加起来是10,所以可以设置0.1的权重,使它标准化。
weight  = 1
'''
接下来让我们创建一个卷积,扫描整个图像,留出1个像素的边框,并将当前像素的每个邻居乘以过滤器中定义的值。

即当前像素上方和左侧的邻域将乘以滤镜中左上方的项,等等。然后我们再将结果乘以权重,然后确保结果在0-255的范围内。

最后我们将把新的值加载到转换后的图像中'''
for x in range(1,size_x-1):
    for y in range(1,size_y-1):
        convolution =0.0

        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
                #将一个3x3的像素块经过运算转化为1x1的像素点

plt.gray()
plt.grid(False)
plt.imshow(i_transformed)
#plt.axis('off')
plt.show()
plt.imshow(i_transformed)
plt.show(i_transformed)

'''
这段代码将显示一个(2,2)池化后的效果。它的想法是用2x2尺寸的矩阵在图像上扫描,查看像素和它的右方、下方和右下方的近邻像素。取其中最大的一个,并将其加载到新图像中。这样,新的图像将是旧图像的1/4大小--通过这个过程,X和Y上的尺寸减半。你会发现,尽管进行了这样的压缩,图像特征还是得到了保留。'''

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])
        newImage[int(x / 2), int(y / 2)] = max(pixels)

# Plot the image. Note the size of the axes -- now 256 pixels instead of 512
plt.gray()
plt.grid(False)
plt.imshow(newImage)
# plt.axis('off')
plt.show()

你可能感兴趣的:(过滤器,卷积)