python深度学习之卷积神经网络(CNN)的使用,包括卷积与池化(附源码,超详细)

数据集和图片请点赞关注收藏后私信博主要

卷积神经网络CNN是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。

卷积神经网络在设计中,四个核心关键是1:网络局部互联2:网络核权值共享3:下采样4:使用多个卷积层

卷积操作,是信号处理与数字图像处理领域中常用的方法,通过对图像进行卷积处理,能够实现图像的基本模糊,锐化,降低噪声,提取边缘特征等功能,是一种常见的线性滤波方法。

原图片如下

 

对图像进行卷积处理并且边缘锐化后如下 

 对图像进行卷积处理并且暗化后如下

 源码如下

扫描二维码关注公众号,回复: 14520226 查看本文章
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()




数据集和图片请点赞关注收藏后私信博主要

猜你喜欢

转载自blog.csdn.net/jiebaoshayebuhui/article/details/127022125