• 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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.测试
    测试一:

    clear
    clc
    image = imread( 'pepper.bmp' );
    eIm = GradientEdgeFun( image );
    figure; imshow( uint8(image) );
    figure; imshow( uint8(eIm) );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    clear
    clc
    image = imread( 'lena.bmp' );
    eIm = GradientEdgeFun( image );
    figure; imshow( uint8(image) );
    figure; imshow( uint8(eIm) );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

    中心差分公式简化为:
    在这里插入图片描述
    对于图像而言,如果用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  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    测试代码:

    clear all
    image = imread( 'pepper.bmp' );%彩色图像
    eIm = CenterDiffEdge( image );
    figure; imshow( uint8(eIm) );	
    image = imread( 'lena.bmp' );%灰度图像
    eIm = CenterDiffEdge( image );
    figure; imshow( uint8(eIm) );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    六、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 );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

  • 相关阅读:
    TAO toolkit 训练UNET 踩坑记录 解决mask与image无法对齐问题
    【Bitburner】Factions
    快速修复“找不到xinput1_3.dll无法继续执行此代码的”问题的5个方法
    jdk线程池ThreadPoolExecutor优雅停止原理解析(自己动手实现线程池)(二)
    算法刷题日志——贪心
    类加载器、双亲委派机制
    CMake常用命令(一) cmake_minimum_required
    PTA 小字辈(树)
    OA系统必备的五个基本要素
    高尔夫模拟器,极致的室内高尔夫球运动体验!
  • 原文地址:https://blog.csdn.net/sunnyoldman001/article/details/126501199