hands-on simplified CNN
import matplotlib.pyplot as plt
import pylab
import numpy as np
def conv(img,conv_kernel):
blue=_conv(img[:,:,0],conv_kernel)
green=_conv(img[:,:,1],conv_kernel)
red=_conv(img[:,:,2],conv_kernel)
return np.dstack([blue,green,red]) #通道合并
def _conv(img,conv_kernel):
kernel_height=conv_kernel.shape[0]
kernel_width=conv_kernel.shape[1]
conv_height=img.shape[0]-conv_kernel.shape[0]+1 #卷积结果的大小
conv_width=img.shape[1]-conv_kernel.shape[1]+1
conv=np.zeros((conv_height,conv_width),dtype='uint8')
for i in range(conv_height):
for j in range(conv_width): #乘加得到每一个点
conv[i][j]=wise_element_sum(img[i:i+kernel_height,j:j+kernel_width],conv_kernel)
return conv
def wise_element_sum(img,conv_kernel):
return(img*conv_kernel).sum()
img=plt.imread("test.jpg")
plt.imshow(img)
pylab.show()
kernel=np.array([[0,1,0],
[0,1,0],
[0,1,0]])
res=conv(img,kernel)
plt.imshow(res)
pylab.show()