卷积神经网络CNN是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。
卷积神经网络在设计中,四个核心关键是1:网络局部互联2:网络核权值共享3:下采样4:使用多个卷积层
1.卷积操作
是信号处理与数字图像处理领域中常用的方法,通过对图像进行卷积处理,能够实现图像的基本模糊,锐化,降低噪声,提取边缘特征等功能,是一种常见的线性滤波方法。
原图片如下
对图像进行卷积处理并且边缘锐化后如下
对图像进行卷积处理并且暗化后如下
源码如下
import cv2 import numpy as np def conv(image,kernel): conv_b=convolve(image[:,:,0],kernel) conv_g=convolve(image[:,:,1],kernel) conv_r=convolve(image[:,:,2],kernel) output=np.dstack([conv_b,conv_g,conv_r]) return output #卷积处理 def convolve(image,kernel): h_kernel,w_kernel=kernel.shape h_image,w_image=image.shape h_output=h_image-h_kernel+1 w_output=w_image-w_kernel+1 output=np.zeros((h_output,w_output),np.uint8) for i in range(h_output): for j in range(w_output): output[i,j]=np.multiply(image[i:i+h_kernel,j:j+w_kernel],kernel).sum() return output path=r'p67.jpg' input_img=cv2.imread(path) #边缘锐化卷积核 kernel=np.array([[-1,-1,-1],[-1,9,-1],[-1,-1,-1]]) #变暗卷积核 #kernel=np.array([[0.1,0.1,0.1],[0.1,0.2,0.1],[0.1,0.1,0.1]]) output_img=conv(input_img,kernel) cv2.imwrite(path.replace('.jpg','-processed.jpg'),output_img) cv2.imshow('darked',output_img) cv2.waitKey(0)
2:池化操作
通常在卷积后进行池化操作,池化是将图像按子区域进行压缩的操作,一般有两种方法,最大池化和平均池化,经过池化图像会压缩,对于有细小差别的两幅图像,池化具有平移不变性。即使两幅图有几个像素的偏移,仍然能获得基本一致的特种图,这对图像处理和识别非常重要
左一为原图,左二为原图的绿色通道,左三为绿色通道平均池化结果,最后一个为绿色通道最大池化结果
源码如下
import numpy as np from PIL import Image import matplotlib.pyplot as plt def AVGpooling(imgData,strdW,strdH): W,H=imgData.shape newImg=[] for i in range(0,W,strdH): line=[] for j in range(0,H,strdH): x=imgData[i:i+strdW,j:j+strdH] avgValue=np.sum(x)/(strdW*strdH) line.append(avgValue) newImg.append(line) return np.array(newImg) def MAXpooling(imgData,strdW,strdH): W,H=imgData.shape newImg=[] for i in range(0, W, strdH): line = [] for j in range(0, H, strdH): x = imgData[i:i + strdW, j:j + strdH] maxValue = np.max(x) line.append(maxValue) newImg.append(line) return np.array(newImg) img=Image.open(r'大海.jpg') r,g,b=img.split() imgData=np.array(g) np.array(b).shape #原图 plt.subplot(221) plt.imshow(img) plt.axis('off') #原始绿色通道图 plt.subplot(222) plt.imshow(imgData) plt.axis('off') AVGimg=AVGpooling(imgData,2,2) #平均池化图 plt.subplot(223) plt.imshow(AVGimg) plt.axis('off') MAXimg=MAXpooling(imgData,2,2) #最大池化图 plt.subplot(224) plt.imshow(MAXimg) plt.axis('off') plt.show()