python 图像卷积_[卷积神经网络(CNN)中的卷积核到底是如何提取图像特征的(python实现图像卷积运算)]...
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实现图像卷积运算)]...相关推荐
- CNN中的卷积核及TensorFlow中卷积的各种实现
声明: 1. 我和每一个应该看这篇博文的人一样,都是初学者,都是小菜鸟,我发布博文只是希望加深学习印象并与大家讨论. 2. 我不确定的地方用了"应该"二字 首先,通俗说一下,CNN ...
- 为什么CNN中的卷积核一般都是奇数?
本博客只用于自身学习,如有错误,虚心求教!!! 为什么CNN中的卷积核一般都是奇奇数*奇数,没有偶数*偶数的? 咱们经常见到的多为 3 * 3.5*5;怎么从来没有见过 4*4,6*6 之类的卷积核? ...
- 为什么CNN中的卷积核一般都是奇数
本博客只用于自身学习,如有错误,虚心求教!!! 为什么CNN中的卷积核一般都是奇奇数*奇数,没有偶数*偶数的? 咱们经常见到的多为 3 * 3.5*5;怎么从来没有见过 4*4,6*6 之类的卷积核? ...
- 卷积神经网络CNN中1×1卷积作用理解
0.引言 研究 GoogLeNet 和 VGG 神经网络结构的时候,都看见了它们在某些层有采取 1x1 作为卷积核,在最开始看到的AlexNet中都是出现了卷积核是 3x3和5×5的.那么,1x1 的 ...
- 详细解释卷积神经网络CNN中卷积层以及BN层的参数
问题的提出 在做关于python的卷积神经网络的项目中,发现了一个卷积层加一个BN层竟然一共有6个参数.百思不得其解. if batch_norm:layers += [nn.Conv2d(in_ch ...
- 卷积核_漫画:卷积神经网络中的卷积核到底是什么?
卷积计算的直观体现 如上所示,一张汽车图片经过了多次卷积操作,一开始卷积在提取低层次的特征(检测边缘),然后逐渐提取高层次的特征(完整的物体) 不同的卷积探测器 我们可以看到同一张图片经过不同的卷积核 ...
- mlp 参数调优_积神经网络(CNN)的参数优化方法
积神经网络(CNN)的参数优化方法 from:http://blog.csdn.net/u010900574/article/details/51992156 著名: 本文是从 Michael Nie ...
- python turtle 绘图_谈一下Pycharm中关联系统Python解释器的方法
大家知道,PyCharm是一款著名的Python IDE开发工具,是拥有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,具备基本的调试.语法高亮.Project管理.代码跳转.智能提示 ...
- pycharm配置python环境变量_求教大家 pycharm 中,环境变量 path 的问题!
问题的发现 在 pycharm 里把一个编译好的二进制文件放到/usr/local/bin/,然后在程序里调用. cmmd = "xxx ..." os.system(cmmd) ...
最新文章
- 进制转换 位运算(包括补码、原码、反码、~0等一些零碎东西一次说清)
- PHP Session中保存Object
- 一部手机,万物皆可复制粘贴,将AR玩出了新高度
- Hadoop之父Doug Cutting:Lucene到Hadoop的开源之路
- Windos7下VirtualBox的几项误操作恢复
- request_irq与request_threaded_irq
- LINQ to SQL创建三层/多层Web应用系统 (Part 1)
- WinMerge 操作界面汉语版(截图),以及简单功能介绍
- Windows核心编程_Visual Studio2019找不到MFC项目
- ae计算机内存不足,解决电脑内存不足的解决方法|电脑内存不足怎么办
- matlab斜抛运动不用公式,分享斜抛运动中算末速度的公式
- Zephyr Kernel 设备驱动和设备模型(一)
- Java微服务实战项目推荐
- html/css横向竖向导航栏的绘制
- CSS篇-dbMovies和dbBooks小网页
- EasyExcel为单个Cell设置样式
- Colab-免费GPU算力
- Swarm管理分布式docker
- 《火柴男人》:一切都是骗局但我要…
- webpack创建react项目
热门文章
- matlab实现logit模型/逻辑回归(详细版)
- Mondly怎么样,Mondly好用吗——Mondly使用评测+七折优惠购买+App Store退订
- 腾讯应用加固的脱壳分析和修复
- 纽约大学计算机研究生案例,纽约大学计算机专业硕士成功申请案例
- “远古帝国2”的片头图片抖动代码
- 使用MATLAB遍历文件
- stm32f103 LED灯简单程序实现
- 微帧ROI视频智能编码:基于人眼感兴趣区域,实现极致观感体验
- 互联网时代如何维护网络安全
- 计算机学业水平考试 高中会考,解读高中学业水平考试与高中会考区别