1.前言

我们知道,卷积核(也叫滤波器矩阵)在卷积神经网络中具有非常重要的作用。说白了,CNN主要作用在于提取图像的各种特征图(feature maps).

CNN主要是通过卷积运算来完成特征提取的。图像卷积运算,主要是通过设定各种特征提取滤波器矩阵(卷积核,通常设定大小为3x3,或者5x5的矩阵),然后使用该卷积核在原图像矩阵(图像实际是像素值构成的矩阵)‘滑动’,实现卷积运算。如果对卷积运算还不太明白的,可以去看吴恩达的课程,他已经介绍的很详细了。本文重点在于,使用python来实现卷积运算,让大家可以看到实际的卷积运算结果,从而对CNN提取特征有比较直观的认识,进而更好地去理解基于卷积神经网络的图像识别,目标检测等深度学习算法。

在这里插入图片描述

2.自定义卷积核,用numpy完成图像卷积运算,生成对应特征图:

"""

@Project Name: CNN featuremap

@Author: LZP

@Time: 2021-02-02, 16:09

@Python Version: python3.6

@Coding Scheme: utf-8

@Interpreter Name: JupyterNotebook

"""

import numpy as np

import cv2

from matplotlib import pyplot as plt

def conv(image, kernel, mode='same'):

if mode == 'fill':#选择是否进行边缘填充

h = kernel.shape[0] // 2#卷积核的列除以2取整

w = kernel.shape[1] // 2#卷积核的行除以2取整

#在原始图像边缘进行填充,常数填充,填数值0,假设原始图像600*600,卷积核大小5*5,则填充后图像大小604*604

image = np.pad(image, ((h, h), (w, w), (0, 0)), 'constant')

#进行卷积运算

conv_b = _convolve(image[:, :, 0], kernel)

conv_g = _convolve(image[:, :, 1], kernel)

conv_r = _convolve(image[:, :, 2], kernel)

res = np.dstack([conv_b, conv_g, conv_r])

return res

def _convolve(image, kernel):

h_kernel, w_kernel = kernel.shape#获取卷积核的长宽,也就是行数和列数

h_image, w_image = image.shape#获取欲处理图片的长宽

#计算卷积核中心点开始运动的点,因为图片边缘不能为空

res_h = h_image - h_kernel + 1

res_w = w_image - w_kernel + 1

#生成一个0矩阵,用于保存处理后的图片

res = np.zeros((res_h, res_w), np.uint8)

for i in range(res_h):

for j in range(res_w):

#image处传入的是一个与卷积核一样大小矩阵,这个矩阵取自于欲处理图片的一部分

#这个矩阵与卷核进行运算,用i与j来进行卷积核滑动

res[i, j] = normal(image[i:i + h_kernel, j:j + w_kernel], kernel)

return res

def normal(image, kernel):

#np.multiply()函数:数组和矩阵对应位置相乘,输出与相乘数组/矩阵的大小一致(点对点相乘)

res = np.multiply(image, kernel).sum()

if res > 255:

return 255

elif res<0:

return 0

else:

return res

if __name__ == '__main__':

path = './img/doramon.jpeg' # 原图像路径

image = cv2.imread(path)

#kernel 是一个3x3的边缘特征提取器,可以提取各个方向上的边缘

#kernel2 是一个5x5的浮雕特征提取器。

kernel1 = np.array([

[1, 1, 1],

[1, -7.5, 1],

[1, 1, 1]

])

kernel2 = np.array([[-1, -1, -1, -1, 0],

[-1, -1, -1, 0, 1],

[-1, -1, 0, 1, 1],

[-1, 0, 1, 1, 1],

[0, 1, 1, 1, 1]])

res = conv(image, kernel1, 'fill')

plt.imshow(res)

plt.savefig('./out/filtered_picdoramon01.jpg', dpi=600)

plt.show()

3. 实验结果

边缘特征提取

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

浮雕特征提取器

在这里插入图片描述

在这里插入图片描述

4.代码解释 :

1、image = cv2.imread(path)

imread是用来读取图片,结果一般是矩阵的形式

2、image = np.pad(image, ((h, h), (w, w), (0, 0)), 'constant')

image是指要填充的数组,((h, h), (w, w), (0, 0))是在各维度的各个方向上想要填补的长度,如((1,2),(2,2)), 表示在第一个维度上水平方向上padding=1,垂直方向上padding=2,在第二个维度上水平方向上padding=2,垂直方向上padding=2。如果直接输入一个整数,则说明各个维度和各个方向所填补的长度都一样。constant指填补类型。举个栗子:

(1)对一维数组的填充

import numpy as np

array = np.array([1, 1, 1])

# (1,2)表示在一维数组array前面填充1位,最后面填充2位

# constant_values=(0,2) 表示前面填充0,后面填充2

ndarray=np.pad(array,(1,2),'constant', constant_values=(0,2))

print("array",array)

print("ndarray=",ndarray)

result:

array [1 1 1]

ndarray= [0 1 1 1 2 2]

(2)对二维数组的填充

import numpy as np

array = np.array([[1, 1],[2,2]])

"""

((1,1),(2,2))表示在二维数组array第一维(此处便是行)前面填充1行,最后面填充1行;

在二维数组array第二维(此处便是列)前面填充2列,最后面填充2列

constant_values=(0,3) 表示第一维填充0,第二维填充3

"""

ndarray=np.pad(array,((1,1),(2,2)),'constant', constant_values=(0,3))

print("array",array)

print("ndarray=",ndarray)

result:

array [[1 1]

[2 2]]

ndarray= [[0 0 0 0 3 3]

[0 0 1 1 3 3]

[0 0 2 2 3 3]

[0 0 3 3 3 3]]

python 图像卷积_[卷积神经网络(CNN)中的卷积核到底是如何提取图像特征的(python实现图像卷积运算)]...相关推荐

  1. CNN中的卷积核及TensorFlow中卷积的各种实现

    声明: 1. 我和每一个应该看这篇博文的人一样,都是初学者,都是小菜鸟,我发布博文只是希望加深学习印象并与大家讨论. 2. 我不确定的地方用了"应该"二字 首先,通俗说一下,CNN ...

  2. 为什么CNN中的卷积核一般都是奇数?

    本博客只用于自身学习,如有错误,虚心求教!!! 为什么CNN中的卷积核一般都是奇奇数*奇数,没有偶数*偶数的? 咱们经常见到的多为 3 * 3.5*5;怎么从来没有见过 4*4,6*6 之类的卷积核? ...

  3. 为什么CNN中的卷积核一般都是奇数

    本博客只用于自身学习,如有错误,虚心求教!!! 为什么CNN中的卷积核一般都是奇奇数*奇数,没有偶数*偶数的? 咱们经常见到的多为 3 * 3.5*5;怎么从来没有见过 4*4,6*6 之类的卷积核? ...

  4. 卷积神经网络CNN中1×1卷积作用理解

    0.引言 研究 GoogLeNet 和 VGG 神经网络结构的时候,都看见了它们在某些层有采取 1x1 作为卷积核,在最开始看到的AlexNet中都是出现了卷积核是 3x3和5×5的.那么,1x1 的 ...

  5. 详细解释卷积神经网络CNN中卷积层以及BN层的参数

    问题的提出 在做关于python的卷积神经网络的项目中,发现了一个卷积层加一个BN层竟然一共有6个参数.百思不得其解. if batch_norm:layers += [nn.Conv2d(in_ch ...

  6. 卷积核_漫画:卷积神经网络中的卷积核到底是什么?

    卷积计算的直观体现 如上所示,一张汽车图片经过了多次卷积操作,一开始卷积在提取低层次的特征(检测边缘),然后逐渐提取高层次的特征(完整的物体) 不同的卷积探测器 我们可以看到同一张图片经过不同的卷积核 ...

  7. mlp 参数调优_积神经网络(CNN)的参数优化方法

    积神经网络(CNN)的参数优化方法 from:http://blog.csdn.net/u010900574/article/details/51992156 著名: 本文是从 Michael Nie ...

  8. python turtle 绘图_谈一下Pycharm中关联系统Python解释器的方法

    大家知道,PyCharm是一款著名的Python IDE开发工具,是拥有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,具备基本的调试.语法高亮.Project管理.代码跳转.智能提示 ...

  9. pycharm配置python环境变量_求教大家 pycharm 中,环境变量 path 的问题!

    问题的发现 在 pycharm 里把一个编译好的二进制文件放到/usr/local/bin/,然后在程序里调用. cmmd = "xxx ..." os.system(cmmd) ...

最新文章

  1. 进制转换 位运算(包括补码、原码、反码、~0等一些零碎东西一次说清)
  2. PHP Session中保存Object
  3. 一部手机,万物皆可复制粘贴,将AR玩出了新高度
  4. Hadoop之父Doug Cutting:Lucene到Hadoop的开源之路
  5. Windos7下VirtualBox的几项误操作恢复
  6. request_irq与request_threaded_irq
  7. LINQ to SQL创建三层/多层Web应用系统 (Part 1)
  8. WinMerge 操作界面汉语版(截图),以及简单功能介绍
  9. Windows核心编程_Visual Studio2019找不到MFC项目
  10. ae计算机内存不足,解决电脑内存不足的解决方法|电脑内存不足怎么办
  11. matlab斜抛运动不用公式,分享斜抛运动中算末速度的公式
  12. Zephyr Kernel 设备驱动和设备模型(一)
  13. Java微服务实战项目推荐
  14. html/css横向竖向导航栏的绘制
  15. CSS篇-dbMovies和dbBooks小网页
  16. EasyExcel为单个Cell设置样式
  17. Colab-免费GPU算力
  18. Swarm管理分布式docker
  19. 《火柴男人》:一切都是骗局但我要…
  20. webpack创建react项目

热门文章

  1. matlab实现logit模型/逻辑回归(详细版)
  2. Mondly怎么样,Mondly好用吗——Mondly使用评测+七折优惠购买+App Store退订
  3. 腾讯应用加固的脱壳分析和修复
  4. 纽约大学计算机研究生案例,纽约大学计算机专业硕士成功申请案例
  5. “远古帝国2”的片头图片抖动代码
  6. 使用MATLAB遍历文件
  7. stm32f103 LED灯简单程序实现
  8. 微帧ROI视频智能编码:基于人眼感兴趣区域,实现极致观感体验
  9. 互联网时代如何维护网络安全
  10. 计算机学业水平考试 高中会考,解读高中学业水平考试与高中会考区别