Matlab图像特征提取的数学原理及实现

一、引言

图像特征不论是对传统的图像处理,还是机器学习,都具有不可替代的地位和作用。图像特征其实就是可以用来刻画图像的像素集,这些像素和周围像素的变化幅度比较大。例如当你 走在路上遇到了一个熟人,你是如何判断对方是你的熟人呢?其实在很多情况下你是看脸的,对,就是看脸,看脸的轮廓、鼻子、眼睛等,而这些信息就是图像的特征,也称为图像的边缘特征。这些所谓的变化幅度比较大的像素,其实也就是变化率的绝对值比较大的像素,而大家都熟知变化率其实就是导数。本文从图像特征的数学原理出发,详解了基于matlab的图像特征提取的数学原理和具体的实现,也给出了matlab软件内嵌的图像特征提取函数。

二、一维曲线的特征的数学原理

我们都学过高等数学、微积分或者数学分析,其中一个非常重要的概念就是导数,其主要作用就是用来描述函数的变化率。
如果已知函数y=f(x),其在x=x0处的导数定义为:
在这里插入图片描述
在做数值计算的时候,往往使用“差商”来代替“微商”,即:
在这里插入图片描述
在实际问题的应用中,又往往只是知道一些已知的数据点(xi,yi),i=1,2,3,…n,而不知道函数解析表达式,此时将把上式离散化得到如下每个数据点的导数的近似值,即差商:
在这里插入图片描述
当自变量的增量恒为1时,即
在这里插入图片描述
则式(3)将变为
在这里插入图片描述
式(4)称为前向差分。
除了前向差分,其实还有后向差分和中心差分,分别如式(5)和式(6)所示。
在这里插入图片描述
在这里插入图片描述
或者
在这里插入图片描述
在做图像特征提取时,就是使用了差分,或者以差分为基础,推广出更多的图像特征提取方法。当然了,我们也可以在此基础上再做差分,就得到了二阶差分、三阶差分等等,用来提取图像不同的特征,这是因为不同阶的导数描述的是不同的特征,例如导数可以描述函数变化快慢,二阶导数可以描述函数的凹凸性等等。
这时我们就突然发现,原来数学上的导数居然还可以这么用!没错,数学的确很伟大,而且无处不在,只要你肯思考。
下面通过一维曲线来演示一下差分的应用及其几何表现。
在这里插入图片描述
左图中红色○表示原始数据,右侧图中蓝色○表示差分(你终于发现了,差分比原始数据少了一个点,赞),我们会发现差分图形中横坐标为4的点处的差分值是1,其余点都是0,而原始数据中横坐标为4的点处刚好是数据突变的点,也就是变化率最大的位置,这就是该组数据的特征点位置。注意:如果是后向差分,则特征点位置是5。
再看一图(如下):
在这里插入图片描述
通过观察原始数据图形,可以发现4和8的位置都是数据突变位置(针对前向差分),从差分图恰好可以看出4和8这两个位置的差分值的绝对值都大于临近的值。
如此,通过上述四幅图形,就可以清楚的看出差分的作用。
当数据量比较小时候,通过观察原始数据是可以获得特征点位置的,但是当数据量比较大的时候就很困难了,而通过差分图中数据值,很容易就可以获得特征点的位置及特征值。因此利用差分来研究图像特征是非常必要的,而且也是非常非常常用的方法。

三、二维曲面的特征的数学原理

一维曲线特征可以通过差分来解决,那么二维曲面的特征则可以通过梯度来解决。准确的说就是沿着x轴方向和y轴方向的差分组成的向量即可表示该点的梯度。
假设已知曲面方程为z=f(x,y),则某点的梯度的两个分量为:
在这里插入图片描述
对应的差分为:
在这里插入图片描述
当已知离散数据点Z(xi,yi),i=1,2,3,…n时,对应的差分为
在这里插入图片描述
通过计算上述两个差分的模,即可得到点(xi,yi)处的幅值。
图像的数学函数就是一个二元函数而已,只不过在具体应用的时候,由于图像中相邻的像素距离为1,因此都是使用上述的差分来计算图像特征。而且通过使用不同阶的差分以及差分的不同变形会得到不同的特征提取算子,例如Roberts算子、Soble算子、Laplace算子、Prewitt算子等。
下面仅针对前述给出梯度的计算过程来实现图像的特征提取的实现过程,不添加任何其余的处理。当然该方法也是最基本的方法,通过不同的改进方法也可以得到不同的图像特征。
记图像像素矩阵为im,则点(i, j)处的特征计算公式可以简化为:
在这里插入图片描述

四、Matlab手工实现图像特征提取

1.单通道图像特征提取

#im为单通道图像像素矩阵
#返回图像的特征
function eIm =  SingChannelGradientFun( im )
[m, n] = size( im );
eIm = zeros( [m, n] );
for i = 1:m-1
    for j = 1:n-1
        eIm( i, j ) = abs( im(i, j+1) - im(i, j) ) + abs( im(i+1, j) - im(i, j) );
    end
end
end 

2.灰度图像或彩色图像的特征提取

function eIm = GradientEdgeFun( image )
imSize = size( image );
dim = numel( imSize ); %图像的维数
if dim == 2%灰度图像的特征提取
    eIm =  SingChannelRobertsFun( image );
else%彩色图像的特征提取
    imR = image( :, :, 1 );
    imG = image( :, :, 2 );
    imB = image( :, :, 3 );
    eImR =  SingChannelRobertsFun( imR );
    eImG =  SingChannelRobertsFun( imG );
    eImB =  SingChannelRobertsFun( imB );
    eIm = cat(3 ,eImR, eImG, eImB );%将三个颜色分量合成彩色图像
end
end

3.测试
测试一:

clear
clc
image = imread( 'pepper.bmp' );
eIm = GradientEdgeFun( image );
figure; imshow( uint8(image) );
figure; imshow( uint8(eIm) );

运行结果为:
在这里插入图片描述
测试二:

clear
clc
image = imread( 'lena.bmp' );
eIm = GradientEdgeFun( image );
figure; imshow( uint8(image) );
figure; imshow( uint8(eIm) );

运行结果为:
在这里插入图片描述

五、使用中心差分求图像的边缘特征

中心差分公式简化为:
在这里插入图片描述
对于图像而言,如果用im表示图像像素矩阵,则可以如下计算(i,j)点处的特征值:
在这里插入图片描述

相关的代码如下:

function eIm = CenterDiffEdge( image )
imSize = size( image );
dim = numel( imSize ); %图像的维数
if dim == 2
    eIm =  CenterDiffEdgeFun( image );
else
    imR = image( :, :, 1 );
    imG = image( :, :, 2 );
    imB = image( :, :, 3 );
    eImR =  CenterDiffEdgeFun( imR );
    eImG =  CenterDiffEdgeFun( imG );
    eImB =  CenterDiffEdgeFun( imB );
    eIm = cat(3 ,eImR, eImG, eImB );%将三个颜色分量合成彩色图像
end
end
 
function eIm =  CenterDiffEdgeFun( im )
[m, n] = size( im );
eImi = zeros( [m, n] );
for i = 2 : m-1
    for j = 2 : n-1
         eIm( i, j ) = max( abs( im(i-1, j) - im(i+1, j) ), abs( im(i, j-1) - im(i, j+1) ) );
    end
end
std2v = std2( eIm );%设定阈值进行过滤
eIm = ( eIm > std2v ) * 255;
end  

测试代码:

clear all
image = imread( 'pepper.bmp' );%彩色图像
eIm = CenterDiffEdge( image );
figure; imshow( uint8(eIm) );	
image = imread( 'lena.bmp' );%灰度图像
eIm = CenterDiffEdge( image );
figure; imshow( uint8(eIm) );

运行结果:
在这里插入图片描述
至此,可以看出,对于不同的差分,会得到不同的图像特征结果。因此实际应用中,会根据实际需要给出不同差分方法用于提取图像的特征。

六、Matlab自带函数edge提取图像特征

edge用来提取灰度图像的边缘特征,其基本用法是:
BW = edge( image, method )
其中BW是输出的图像特征(边缘)二值化数据,image是已知的图像,method是特征提取的方法,其值有Roberts、Soble、Canny、Prewitt、log等。
例如:

im = imread( 'lena.bmp' );
eIm = edge( im, 'Canny' );
figure; imshow( eIm )
%对于彩色图像需要针对三个颜色分量分别提取特征之后再融合。 
im = imread( 'pepper.bmp' );
imR = edge( im( :, :, 1 ), 'Sobel' ) * 255;
imG = edge( im( :, :, 2 ), 'Sobel' ) * 255;
imB = edge( im( :, :, 3 ), 'Sobel' ) * 255;
eIm = cat( 3, imR, imG, imB );
figure; imshow( eIm );

输出结果为:
在这里插入图片描述

  • 17
    点赞
  • 156
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数学形态学法是一种基于形态学的信号处理方法,可以用于心电信号的特征提取。其基本原理是利用形态学的基本运算,如腐蚀、膨胀、开运算、闭运算等,对信号进行处理,从而提取出信号的特征。 具体步骤如下: 1. 信号预处理:常用的预处理方法包括滤波、降噪等,目的是去除信号中的噪声和干扰。 2. 形态学运算:利用腐蚀、膨胀、开运算、闭运算等基本形态学运算对信号进行处理。其中,腐蚀操作可以用来消除峰值,膨胀操作可以用来填充信号的低谷,开运算可以用来平滑信号,闭运算可以用来连接信号。 3. 特征提取:通过形态学运算得到的信号,可以提取出一些特征,如QRS波群的峰值、宽度等,这些特征可以用于心电信号的分类、诊断等。 下面是一个使用MATLAB软件实现数学形态学法对心电信号特征提取的程序示例: ```matlab % 导入心电信号数据 ecg = load('ecg_data.mat'); signal = ecg.signal; % 滤波和降噪 filtSignal = medfilt1(signal, 151); % 腐蚀和膨胀操作 se = strel('line', 3, 0); erodedSignal = imerode(filtSignal, se); dilatedSignal = imdilate(erodedSignal, se); % 开运算和闭运算 openSignal = imopen(dilatedSignal, se); closeSignal = imclose(dilatedSignal, se); % 提取QRS波群的峰值和宽度 [qrspeaks,locs] = findpeaks(closeSignal, 'MinPeakDistance', 0.2*360); [qrswidths,locs] = findpeaks(-closeSignal, 'MinPeakDistance', 0.2*360); qrswidths = -qrswidths; % 显示心电信号及QRS波群特征 figure; subplot(2,1,1); plot(signal); title('原始心电信号'); subplot(2,1,2); plot(closeSignal); hold on; plot(locs, qrspeaks, 'rv', 'MarkerFaceColor', 'r'); title('处理后的心电信号及QRS波群'); ``` 这段程序首先导入心电信号数据,然后进行滤波和降噪处理,接着使用腐蚀、膨胀、开运算和闭运算等形态学运算对信号进行处理,最后提取QRS波群的峰值和宽度,并将其显示在图像上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值