深度学习《图像卷积》

骚话一下:
今天是2020年10月1号,是祖国的71岁生日,也是传统节日中秋节,而我由于工作的安排身在海外不得回家,怀念祖国的乡土,倍加思念远方的亲人。
由于疫情,在这里哪里也去不了,只能好好学习,用学习来充实这八天假期。

本文完全是为了给CNN做铺垫。

一:图像卷积算法
至于卷积的含义,以及在连续数据的卷积和离散数据的卷积概念和公式我就不说了,不清楚的同学请自行百度,我就直接上过程,直接给出图像的卷积的计算过程。
数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积核(卷积模板)在图像上滑动,每每滑动到一个位置,就将图像点上的像素灰度值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值,并最终滑动完所有图像的过程。我截图一个微软研究院的视频的图分享出来。
在这里插入图片描述

除此之外,卷积核的选择有一些规则:
1)卷积核的大小一般是奇数,这样的话它是按照中间的像素点中心对称的,所以卷积核一般都是3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2。

2)卷积核所有的元素之和如果等于1,这是为了原始图像的能量(亮度)守恒。如果卷积核元素相加不为1的情况,那么能量就变化了。

3)如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。

4)对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0和255之间即可。对于负数,也可以取绝对值。

二:图像卷积的实例操作
对于图像用不同的kernel卷积,可以得到图像的不同特征,下面举几个例子。
以一个图片为例。我么分别用不同的卷积核进行操作,以此得到不同的图片特征。
简单起见,我就只用了3*3的不同核来演示。
在这里插入图片描述

1) 单位核:
0 0 0
0 1 0
0 0 0
这个卷积核跟原图像进行卷积后,其实并没有对图像的位置有什么变化,因此,这个核的作用就好比是数学上的1,矩阵中的单位矩阵一样。
在这里插入图片描述

可以看到,跟原图像没区别。

2) 平滑均值滤波核
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
这个核的作用就是每一个像素点周围的像素平局值来取代该像素值,这样的话就对图像有一个平滑的作用。
在这里插入图片描述

有一些模糊的样子了。

3) 高斯平滑
1/16 2/16 1/16
2/16 4/16 2/16
1/16 2/16 1/16
高斯平滑水平和垂直方向呈现高斯分布,更突出了中心点在像素平滑后的权重,相比于均值滤波而言,有着更好的平滑效果。
在这里插入图片描述

4) 图像锐化
-1 -1 -1
-1 9 -1
-1 -1 -1

这个核就是将本中心像素增强,把周围像素降低,这样更能凸显图像的边缘。
在这里插入图片描述

还可以用以下的核
0 -1 0
-1 5 -1
0 -1 0
在这里插入图片描述

5) 垂直梯度核
1 0 -1
1 0 -1
1 0 -1
在这里插入图片描述

6) 水平梯度核
1 1 1
0 0 0
-1 -1 -1
在这里插入图片描述

7) Sobel边缘检测
Soble与上述卷积核不同之处在于,Soble更强调了和边缘相邻的像素点对边缘的影响。
水平方向:
1 0 -1
2 0 -2
1 0 -1
在这里插入图片描述

垂直方向:
1 2 1
0 0 0
-1 -2 -1
在这里插入图片描述

8) Laplacian卷积核
可以在垂直和水平方向都检测出边缘,效果比较好
-1 -1 -1
-1 8 -1
-1 -1 -1
在这里插入图片描述

或者是下面的核
0 -1 0
-1 4 -1
0 -1 0
在这里插入图片描述

诶?挺有意思的啊,于是我有尝试了一些其他的核,也没有什么名字
-1 2 -1
2 0 2
-1 2 -1
哈哈,得到了蜡笔画图像:
在这里插入图片描述

再玩一个
-1 0 -1
0 4 0
-1 0 -1
在这里插入图片描述

三:代码过程

im = imread('D:/software/octave/doc/CNN/timg.jpg');
#im = double(im);
#a=[[0 -1 0]; [-1 4 -1]; [0 -1 0]];
#a=[[1/9 1/9 1/9]; [1/9 1/9 1/9]; [1/9 1/9 1/9]];
#a=[[-1 -1 -1]; [-1 9 -1]; [-1 -1 -1]];
#a=[[1 0 -1]; [1 0 -1]; [1 0 -1]];
#a=[[1 1 1]; [0 0 0]; [-1 -1 -1]];
#a=[[1 0 -1]; [2 0 -2]; [1 0 -1]];
#a=[[1 2 1]; [0 0 0]; [-1 -2 -1]];

#a=[[-1 -1 -1]; [-1 8 -1]; [-1 -1 -1]];
#a=[[0 -1 0]; [-1 4 -1]; [0 -1 0]];
#a=[[-1 2 -1]; [2 0 2]; [-1 2 -1]];

a=[[-1 2 -1]; [2 0 2]; [-1 2 -1]];

result = imfilter(im,a);

figure();
imshow(result,'InitialMagnification','fit');
hold on;

大家完全可以自己尝试协议诶新的卷积核,也可以是5*5的卷积核,自己随意写数值,发现很多有意思的特性。

本文完全是为了给下一篇的CNN做铺垫。

猜你喜欢

转载自blog.csdn.net/qq_29367075/article/details/108892816