import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
def cov2(img,kernel,strde):
inw,inh = img.shape
w,h=kernel.shape
outw = int((inw -w )/strde + 1)
outh = int((inh -h )/strde + 1)
arr = np.zeros((outw, outh))
for g in range(outw):
for t in range(outh):
s= 0
for i in range(w):
for j in range(h):
s+=img[i+g*strde][j+t*strde]*kernel[i][j]
# s = img[i][j] * f[i][j]
arr[g][t]=s
return arr
img = []
for i in range(7):
temp = [0,0,0,255,255,255]
img.append(temp)
img = np.array(img)
print("原图",img)
kernel = np.array([[1,-1]])
test_pic = cov2(img,kernel,1)
print("图1使用[1,-1]的卷积核\n",test_pic)
kernel = np.array([[1],[-1]])
test_pic = cov2(img,kernel,1)
print("图1使用[1,-1]转置的卷积核\n",test_pic)
print("------------------------------------")
img = []
for i in range(7):
temp = [0,0,0,255,255,255]
img.append(temp)
for i in range(7):
temp = [255,255,255,0,0,0]
img.append(temp)
img = np.array(img)
print("原图\n",img)
kernel = np.array([[1,-1]])
test_pic = cov2(img,kernel,1)
print("图2使用[1,-1]的卷积核\n",test_pic)
kernel = np.array([[1],[-1]])
test_pic = cov2(img,kernel,1)
print("图2使用[1,-1]转置的卷积核\n",test_pic)
img = np.array([[0,0,0,0,0,0,0,0,0],
[0,255,0,0,0,0,0,255,0],
[0,0,255,0,0,0,255,0,0],
[0,0,0,255,0,255,0,0,0],
[0,0,0,0,255,0,0,0,0],
[0,0,0,255,0,255,0,0,0],
[0,0,255,0,0,0,255,0,0],
[0,255,0,0,0,0,0,255,0],
[0,0,0,0,0,0,0,0,0]])
print("原图\n",img)
kernel = np.array([[1,-1]])
test_pic = cov2(img,kernel,1)
print("图3使用[1,-1]的卷积核\n",test_pic)
kernel = np.array([[1],[-1]])
test_pic = cov2(img,kernel,1)
print("图3使用[1,-1]转置的卷积核\n",test_pic)
kernel = np.array([[1,-1],[-1,1]])
test_pic = cov2(img,kernel,1)
print("图3使用[1,-1]转置的卷积核\n",test_pic)
# test_im = Image.fromarray(test_pic)
# test_im.show()
运行结果:
卷积:首先看一下一维卷积在数学上的定义:
一维卷积没什么好说的,通俗来讲即先反转再平移再相乘再累加。
二维卷积其实就是两个矩阵之间的卷积操作,其中一个可以看作“卷积核”,然后对应位置相乘再相加得到一个1*1的矩阵,其实二维卷积可以看作是对特征的提取,当某个矩阵在另一个矩阵中能找到相似的位置时,卷积后的矩阵出现的值就更加明显,因此感觉二维卷积就是一个矩阵在找与自己相像的“好朋友”。
二维卷积特征提取示意,这里是他的博客:https://blog.csdn.net/kingroc/article/details/88192878
三维卷积我找到了一张图,这是他的博客:三维卷积,很形象:
3D 卷积中,3D 卷积核可以在所有三个方向(图像的高度、宽度、通道)上移动。在每个位置,逐元素的乘法和加法都会提供一个数值。因为过滤器是滑过一个 3D 空间,所以输出数值也按 3D 空间排布。也就是说输出是一个 3D 数据。
卷积核:在我的理解中,卷积中体现用于一个矩阵在另一个矩阵中提取特征的矩阵叫做卷积核。仍然拿二维卷积举例子:
多通道多卷积核的卷积其实就是对于每一个通道分别用一个卷积核进行卷积,然后再将结果按照通道拼接成一幅彩色图,博客地址:机器学习28:多卷积核处理多通道特征图机制
特征图:一张彩色图片,通常我们认为有R,G,B三个通道,每个通道通过卷积核进行运算就会产生一个个的特征图,也就是说当图像像素值经过卷积核后的到的东西就是特征图。通常,经过多少个卷积核过滤就会产生多少个特征图,也就是下图中的“豆腐皮儿”层数,同时也是该层的深度。网络越深意味着这一层的特征图数目就越多,随着网络的加深,特征图的长宽尺寸缩小,本卷积层的每个特征图提取的特征就越具代表性,所以通常后一层卷积层需要增加特征图的数量,也就是说用更多的卷积核进行卷积操作,才能充分地提取前一层的特征。
特征选择:从已有的M个特征中选取N个特征,从原始特征中选择出一些最有效特征,有点类似于数据预处理。
步长:即卷积核进行一次卷积后,横向移动的步长和纵向移动的步长。
填充:我认为是为了满足边缘特征不被丢失,对边缘进行填充,从而将边缘特征进行提取,对边缘特征更加重视。
感受野:即最后特征图的某个点对应原图的范围,即为感受野。两个堆叠的conv3x3感受野可以等于一个conv5x5,可以大幅度提高计算效率。
①不同数值的卷积核对于图像卷积的影响,试着用下边网站试一下:https://setosa.io/ev/image-kernels/
大卷积核
小卷积核
③不同形状的卷积核的影响:
如果我们将一个3*3的卷积核变成一个1*3的卷积核和一个3*1的卷积核,那么会有:
3*3卷积计算量:9×9 = 81次乘法
1*3卷积和3*1卷积的累加计算量:3×15+3×9 = 72次乘法
可以看出的是,1*3的卷积核和3*1的卷积核的运算是比3*3的运算速度快的。
1. 实现灰度图的边缘检测、锐化、模糊。(必做)
边缘检测:
锐化:
模糊:
①均值模糊:
②高斯模糊:
③运动模糊:
2. 调整卷积核参数,测试并总结。(必做)
图像锐化和模糊已给出不同算子下的模糊效果,下面我们修改边缘检测卷积核的参数,看一下边缘检测修改参数后的效果:
使用peer.jpeg进行测试:
修改算子:
修改卷积核步长:
3. 使用不同尺寸图片,测试并总结。(必做)
锐化:
模糊(均值模糊):
4. 探索更多类型卷积核。(选做)
上述已经实现不同的卷积核算子下的图形显示。
本次作业的心得体会,重点谈谈卷积能够提取特征的原理。
心得体会:本次实验感觉深入体会到了卷积的结构,包括一维卷积、二维卷积和多维卷积,然后了解到了卷积核的作用,如何实现图像的边缘检测和锐化和模糊,还有填充的作用,步长的限制......,总之感觉卷积对于特征的提取的功能是很强大的,至于为啥卷积能够提取特征,之前在课上看的就是一个提取眼睛特征的信息,其实卷积核就相当于是一个眼睛,如果他能匹配到该眼睛,他对应的特征图上该点的值就会很大,所以能够进行特征提取,用下边这个老鼠的例子来分析就是,卷积核就像是老鼠的耳朵,然后当卷积核的矩阵滑动到老鼠的耳朵的时候,即特征图的值就会很大,意为匹配度很高,这就浅显的解释了为啥卷积能够提取特征。
NNDL 作业5:卷积
Python中的图像处理(第十一章)Python图像锐化及边缘检测(1)
pytorch之卷积模块、池化、激活函数(可视化)
理解CNN中的特征图feature map
卷积核的类型及其作用
实验四 图像频域平滑与锐化(Python实现)
几种图像锐化算子的比较
python 图像模糊处理实现
卷积神经网络(4)卷积核参数分析
为什么卷积能够提取图像的特征?看完此文应该能够给你一个答案;
图像卷积