作业1
编程实现
1. 图1使用卷积核,输出特征图
2. 图1使用卷积核,输出特征图
3. 图2使用卷积核,输出特征图
4. 图2使用卷积核,输出特征图
5. 图3使用卷积核,
,
,输出特征图
import numpy as np
import torch
from torch import nn
from torch.autograd import Variable
from PIL import Image
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 #有中文出现的情况,需要u'内容
# https://blog.csdn.net/weixin_40123108/article/details/83510592
file_path = 'deer.jpg'
im = np.array([[0,0,0,255,255,255],
[0,0,0,255,255,255],
[0,0,0,255,255,255],
[0,0,0,255,255,255],
[0,0,0,255,255,255],
[0,0,0,255,255,255],
[0,0,0,255,255,255]], dtype='float32') # 将其转换为一个矩阵
print(im.shape[0], im.shape[1])
plt.imshow(im.astype('uint8'), cmap='gray') # 可视化图片
plt.title('原图')
plt.show()
im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
conv1 = nn.Conv2d(1, 1, (1,2), bias=False) # 定义卷积
sobel_kernel = np.array([[-1,1]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 1, 2)) # 适配卷积的输入输出
conv1.weight.data = torch.from_numpy(sobel_kernel) # 给卷积的 kernel 赋值
edge1 = conv1(Variable(im)) # 作用在图片上
x = edge1.data.squeeze().numpy()
print(x.shape) # 输出大小
plt.imshow(x, cmap='gray')
plt.show()
输出结果:
1.
2.实现代码:
import numpy as np
import torch
from torch import nn
from torch.autograd import Variable
from PIL import Image
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 #有中文出现的情况,需要u'内容
# https://blog.csdn.net/weixin_40123108/article/details/83510592
im = np.array([[0,0,0,255,255,255],
[0,0,0,255,255,255],
[0,0,0,255,255,255],
[0,0,0,255,255,255],
[0,0,0,255,255,255],
[0,0,0,255,255,255],
[0,0,0,255,255,255]], dtype='float32') # 将其转换为一个矩阵
print(im.shape[0], im.shape[1])
plt.imshow(im.astype('uint8'), cmap='gray') # 可视化图片
plt.title('原图')
plt.show()
im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
conv1 = nn.Conv2d(1, 1, (1,2), bias=False) # 定义卷积
sobel_kernel = np.array([[-1,1]], dtype='float32') # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 2, 1)) # 适配卷积的输入输出
conv1.weight.data = torch.from_numpy(sobel_kernel) # 给卷积的 kernel 赋值
edge1 = conv1(Variable(im)) # 作用在图片上
x = edge1.data.squeeze().numpy()
print(x.shape) # 输出大小
plt.imshow(x, cmap='gray')
plt.show()
输出结果:
3.
4.
5.矩阵:
[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],
输出结果:
(-1 +1):
(-1 +1)T:
:
作业2
一、概念
卷积:
是通过两个函数f和g生成第三个函数的一种数学运算,其本质是一种特殊的积分变换,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。
卷积核:
卷积运算中使用的矩阵。
特征图:
当图像像素值经过过滤器后得到的东西就是特征图。
特征选择:
特征选择( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ),或属性选择( Attribute Selection )。是指从已有的M个特征(Feature)中选择N个特征使得系统的特定指标最优化,是从原始特征中选择出一些最有效特征以降低数据集维度的过程,是提高学习算法性能的一个重要手段,也是模式识别中关键的数据预处理步骤。对于一个学习算法来说,好的学习样本是训练模型的关键。(来源百度,我不太懂)
步长:
步长顾名思义,就是说过滤器一次移动多少格子。
填充:
卷积之后,把缺失的部分补全。
感受野:
在卷积神经网络中,感受野的定义是卷积神经网络每一层输出的特征图上的像素点在输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点对应输入图上的区域。(来源csdn)
二、探究不同卷积核的作用
这虚化内核不强调相邻像素值的差异。
索贝尔内核用来显示特定方向上相邻像素值的差异。
这装饰内核(类似于索贝尔内核,有时也指相同的意思)通过强调给定方向上像素的差异来产生深度错觉。在这种情况下,沿着从左上到右下的直线方向。
无意义,图像不变。
一个概述内核(也称为“边缘”内核)用于突出像素值的巨大差异。在新图像中,与具有接近相同强度的相邻像素相邻的像素将显示为黑色,而与相差很大的相邻像素相邻的像素将显示为白色。
这尖锐内核强调相邻像素值的差异。这使得图像看起来更生动。
索贝尔核用于仅显示特定方向上相邻像素值的差异。
三、编程实现
1.实现灰度图的边缘检测、锐化、模糊。(必做)
边缘检测:
模糊(虚化):
锐化:
2.调整卷积核参数,测试并总结。(必做)
测试锐化:
步长3
步长5
效果比较显著。
步长越大,锐化的效果越明显,但是图片会有细节丢失。
3.使用不同尺寸图片,测试并总结。
将图像尺寸缩小
经过对比可以发现,图片越小,锐化的效果越明显。
总结
这次的作业和另一门课——数字图像处理有异曲同工之妙,让我理解了卷积、特征图等一众的概念,受益匪浅,同时还学习了很多的图像处理的卷积矩阵,在今后使用photoshop等软件的时候可能都会有用,收获很大!