一、引言

在图像处理中,不论是提取图像边缘特征,还是尺度空间变换,亦或者目前大火的深度学习,图像卷积都是非常重要的基础工作。卷积从整体上说是卷积,从局部上说其实就是内积。卷积不论在数学上还是信号处理中都有非常重要的应用,主要目的是用来做图像滤波、特征提取和多尺度分解等。可以这么说,不会卷积就是不会图像处理。本文给出了图像卷积的数学原理及Matlab手工实现,此外还给出Matlab内部函数imfilter的用法。

二、卷积的数学原理

对于给定的两个一元可积函数f(x)和g(x),其卷积定义为:

离散化的结果为:

此时,可以称f(x)为滤波器,或者卷积核,g(x)是已知的信号。
推广到二元函数情形,其离散形式的卷积为:

由于数字图像的像素是一个矩阵,所以可以使用上述公式(3)来实现卷积。
通过上述公式,可以发现,当固定(m,n)时,则右端就是内积的表达式了。所以我在前面说卷积的局部就是内积(当然了,这仅仅是我自己的说法,而且这里的局部其实是对固定的点而言,可不是一个局部区域啊)。下图演示了卷积。

现在想计算红色2处的卷积值,则把中间的3x3卷积核扣到以2为中心的黄色区域,做内积得到-7存放到右侧红色位置。其它位置的卷积也是如此计算。

至此,是不是发现了卷积原来如此简单,难怪其在图像处理中具有广泛的应用。
有人可能会问,卷积核都是怎么选取的,我的回答是“看实际需要”,如果是低通滤波,则选取低通滤波器,例如高斯低通滤波器,其作为卷积核可以让图像变得平滑甚至模糊。下图就是利用3x3和5x5高斯卷积核对图像做卷积的结果。

其中左侧图是带有噪声的原始图像,中间图是使用3x3高斯卷积和滤波的结果,右图是使用5x5高斯卷积和滤波的结果,从图中可以看出卷积核模板越大,则去噪效果越好。(到此你又学会了一招,图像的低通滤波可以去噪)

三、Matlab纯手工实现图像卷积

1.单通道图像卷积

function convImage = SingleConvolution( image, filter )
%功能:
%   单通道图像的卷积运算
%输入参数:
%   image:扩展后的图像
%   filter:滤波器
%输出参数:
%   imageConv:卷积后的图像
[Height, Width] = size( image );
[mF, nF] = size( filter );
for i = 1 : Height - mF + 1for j = 1 : Width - nF + 1localImage = [];localImage = image(i:i+mF-1, j:j+nF-1);convImage(i, j) = sum( sum( localImage .* filter ) );end
end
convImage = uint8( convImage );
end

2.灰度图像或彩色图像的卷积

function eIm = ImageConlutionFun( image, filter )
imSize = size( image );
dim = numel( imSize ); %图像的维数
if dim == 2eIm =  SingleConvolution( image, filter );
elseimR = image( :, :, 1 );imG = image( :, :, 2 );imB = image( :, :, 3 );eImR =  SingleConvolution( imR, filter );eImG =  SingleConvolution( imG, filter );eImB =  SingleConvolution( imB, filter );eIm = cat(3 ,eImR, eImG, eImB );%将三个颜色分量合成彩色图像
end
end

3.灰度图像卷积Demo_1

%利用sobel算子提取图像的边缘特征
clear all
clc
image = double( imread( 'lena.bmp' ) );
filterY = double( fspecial( 'sobel' ) );%sobel卷积核
filterX = filterY';
imageConvY = ImageConlutionFun( image, filterY );
imageConvX = ImageConlutionFun( image, filterX );
imageConv = max( imageConvY, imageConvX );
figure; imshow( uint8(image) )
figure; imshow( imageConv )

运行结果如下:


4.灰度图像卷积Demo_2

%图像低通滤波
clear all
clc
image = double( imread( 'lenaNoise.bmp' ) );
filter = double( fspecial( 'gaussian', [5,5], 1 ) );%gaussian卷积核
imageConv = ImageConlutionFun( image, filter );
size( image )
size( imageConv )
figure; imshow( uint8(image) )
figure; imshow( imageConv )

运行结果如下:

5.彩色图像卷积Demo_3

%图像低通滤波
clear all
clc
image = double( imread( 'cloud.jpg' ) );
filter = double( fspecial( 'gaussian', [7,7], 1 ) );%gaussian卷积核
imageConv = ImageConlutionFun( image, filter );
figure; imshow( uint8(image) )
figure; imshow( imageConv )

运行结果如下:

说明:从上述运行结果可以看出,卷积之后图像的尺寸比原图像小,这是因为没有做padding造成的,如果在做卷积之前增加一项padding工作,则可以解决此问题,例如demo_3的代码修改为:

clear all
clc
image = double( imread( 'cloud.jpg' ) );
filter = double( fspecial( 'gaussian', [7,7], 1 ) );%gaussian卷积核
[m, n] = size( filter );
im = padarray( image, [floor(m/2), floor(n/2)], 'symmetric' );%图像padding
imageConv = ImageConlutionFun( im, filter );
size( image )
size( imageConv )
figure; imshow( uint8(image) )
figure; imshow( imageConv )

则运行结果如下:

此时卷积前后图像的尺寸是相同的。

四、Matlab卷积函数imfilter

imfilter( Image, filter, boundarymode )
Image:图像像素矩阵
filter:卷积核矩阵
boundarymode:X 边界延拓为X,缺省值为0,其取值有:
Symmetric: 镜像延拓边界
Replicate: 最近邻延拓边界
Circular: 周期延拓边界
例如:

clear all
clc
im = imread( 'cloud.jpg' );
filter = fspecial( 'gaussian' ,[3,3], 1 );
imconv = imfilter( im, filter, 'symmetric' );
figure;imshow(im)
figure;imshow(imconv)

运行结果如下:

Matlab彩色图像卷积的数学原理及纯手工实现相关推荐

  1. 卷积神经网络数学原理解析

    来源:海豚数据科学实验室 作 者:Piotr Skalski 翻 译:通夜(中山大学).had_in(电子科技大学) 编 辑:Pita 原标题:Gentle Dive into Math Behind ...

  2. 图解丨卷积神经网络数学原理解析

    原标题:Gentle Dive into Math Behind Convolutional Neural Networks 作 者:Piotr Skalski 编 辑 | Pita 翻 译:通夜(中 ...

  3. 图解:卷积神经网络数学原理解析

    来源:图灵人工智能 作 者:Piotr Skalski 编 辑 | Pita 翻 译:通夜(中山大学).had_in(电子科技大学) 原标题:Gentle Dive into Math Behind ...

  4. tensor如何实现转置_PyTorch中的傅立叶卷积:通过FFT有效计算大核卷积的数学原理和代码实现...

    卷积 卷积在数据分析中无处不在.几十年来,它们已用于信号和图像处理.最近,它们已成为现代神经网络的重要组成部分. 在数学上,卷积表示为: 尽管离散卷积在计算应用程序中更为常见,但由于本文使用连续变量证 ...

  5. 高斯消元法解线性方程组数学原理及Python手工实现

    一.基本思想 先逐次消去未知数,将方程化为同解的上三角形方程组,此过程称为消元.然后按方程相反顺序求解上三角形方程组,得到原方程组的解,此过程称为回代.这种方法称为高斯消元法. 二.例子  消元过程如 ...

  6. Matlab图像水平方向错切变换的数学原理及实现

    一.引言 图像的几何变换在图像处理中被经常使用,其中图像错切变换也是常用的图像变换.图像错切错切变换包括水平方向错切变换和竖直方向错切变换,本文给出了灰度图像和彩色图像的水平方向错切变换的数学原理及m ...

  7. 深入卷积神经网络背后的数学原理 | 技术头条

    参加「CTA 核心技术及应用峰会」,请扫码报名 ↑↑↑ 作者 | Piotr Skalski 译者 | Monanfei 编辑 | 十月Rachel.Jane 出品 | AI科技大本营(id:rgzn ...

  8. 刷脸背后,卷积神经网络的数学原理原来是这样的

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|深度学习这件小事 计算机视觉技术在日常生活中有着非常普遍 ...

  9. 卷积神经网络(CNN)数学原理解析

    来源:图灵人工智能 作者:Piotr Skalski 编辑:python数据科学 原标题:Gentle Dive into Math Behind Convolutional Neural Netwo ...

最新文章

  1. VTK与Qt整合的示例
  2. 成功解决ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
  3. TypeScript里数组foreach和map操作的区别
  4. 【MyBatis框架】mapper配置文件-关于动态sql
  5. CCF信息学竞赛和教育部竞赛管理出锅重播
  6. linux .net环境变量,Linux编程 系统环境变量位置, 环境变量持久化
  7. OMEA Pro,刚刚荣获15届Jolt大奖,综合RSS阅读,邮件、任务等管理的IIM(智能信息管理)...
  8. mplayer命令行模式下的使用方法
  9. python 英语分词_python 英文分词
  10. CAD中插入外部参照字体会变繁体_什么是CAD的形文件,它与字体文件有什么区别?...
  11. quot 云计算 quot 是计算机,云计算是什么意思?
  12. Word中有些空行无法删除,我是这样解决的.............
  13. 北大 CTSC 2013
  14. ubuntu18.04安装wine+caj阅读器
  15. Codeforces Round #362 (Div. 2) E. PLEASE(数论 + 递推)
  16. 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查
  17. SIMCOM 常用AT指令
  18. 中国证券业协会会员登记注册程序
  19. 1.PhotoShop缩小图片的三种方式
  20. 用python来做一个五子棋游戏,源码分享~

热门文章

  1. C++编程第一步:输出100以内的奇数和
  2. java得到sql语句表名_使用fdb-sql-parser替换SQL语句中的表名
  3. 【NOIP2013初赛】整除
  4. 陈南峰质量讲堂6 | 数字化质量管理系统QMS
  5. JavaScript的Web api接口
  6. 996大厂“工人”们的百万年薪和中年失业(被裁)
  7. 房产测量程序lisp_房产测绘内业数据处理方法及软件应用
  8. 计算机网络安全教育培训教程,网络安全培训教材(PPT 67页)
  9. 微星b450迫机炮主板,省电
  10. 网络工程师精选习题详解(一)