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

一、引言

在图像处理中,不论是提取图像边缘特征,还是尺度空间变换,亦或者目前大火的深度学习,图像卷积都是非常重要的基础工作。卷积从整体上说是卷积,从局部上说其实就是内积。卷积不论在数学上还是信号处理中都有非常重要的应用,主要目的是用来做图像滤波、特征提取和多尺度分解等。可以这么说,不会卷积就是不会图像处理。本文给出了图像卷积的数学原理及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 + 1
    for j = 1 : Width - nF + 1
        localImage = [];
        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 == 2
    eIm =  SingleConvolution( image, filter );
else
    imR = 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)

运行结果如下:

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340