精华内容
下载资源
问答
  • 图像语义特征提取
    2021-04-22 00:37:33

    VGG卷积神经网络是牛津大学在2014年提出来的模型。当这个模型被提出时,由于它的简洁性和实用性,马上成为了当时最流行的卷积神经网络模型。它在图像分类和目标检测任务中都表现出非常好的结果。在2014年的ILSVRC比赛中,VGG 在Top-5中取得了92.3%的正确率。有VGG16和VGG19,模型的权重由ImageNet训练而来

    1、VGG结构

    50103fcc60d9e78b69436dffa72c65fa.png

    下面以VGG16为例来说明:

    32a46572d26a3f349c8a356a9b369d11.png

    看出VGG16由13个卷积层+3个全连接层=16层构成,过程为:

    经过的卷积核大小为333,stride=1,padding=1,pooling为采用2x2的max pooling方式。

    (1) 输入:输入224 * 224 * 3的图片。

    (2) Conv1_1+conv1_2+pool1:经过64个卷积核的两次卷积后,采用一次max pooling。经过第一次卷积后,有(3 * 3 * 3) * 64=1728个训练参数;第二次卷积后,有(3 * 3 * 64) * 64=36864个训练参数,大小变为112 * 112 * 64.

    (3) Conv2_1+conv2_2+pool2:经过两次128个的卷积核卷积之后,采用一次max pooling,有(3 * 3 * 128) * 128=147456个训练参数,大小变为56 * 56 * 128.

    (4) Conv3_1+conv3_2+con3_3+pool3: 经过三次256个的卷积核卷积之后,采用一次max pooling,有(3 * 3 * 256) * 256=589824个训练参数,大小变为28 * 28 * 256.

    (5) Conv4_1+conv4_2+con4_3+pool4: 经过三次512个的卷积核卷积之后,采用一次max pooling,有(3 * 3 * 512) * 512=2359296个训练参数,大小变为14 * 14 * 512.

    (6) Conv5_1+conv5_2+con5_3+pool5: 再经过三次512个的卷积核卷积之后,采用一次max pooling,有(3 * 3 * 512) * 512=2359296个训练参数,大小变为7 * 7 * 512.

    (7) Fc6+Fc7+Fc8:经过三次全连接,最终得到1000维的向量。

    2、利用tensorflow搭建网络并提取指定层特征

    包括定义网络参数,定义卷积层、池化层、全连接层操作,定义网络结构,等操作,然后根据是分类任务或是其他任务定义损失函数开始训练等。代码较长,在此就不列出,会附在附件中,需要的同事可查看。因为我只需要利用预训练好的vgg提取图像的特征,所以会去掉最后一层softmax,这里需要提前下载在大的图像数据集ImageNet上训练好的网络权重文件vgg16.npy。 encoding must be 'ASCII', 'latin1', or 'bytes' ,当npy文件中只有层名字时候,选用encoding= 'latin1',当npy文件中既有层名字又有各个参数,使用encoding='bytes'.这里是第一种情况,所以用encoding= 'latin1'。选用加载方法如下:vgg16_npy_path为vgg16.npy文件的存放路径,

    d577d018b4811ec32f079a1b1c6da300.png

    提取图像特征的代码如下,需要提取哪一层的特征,就把名字修改一下即可,如:我提取的是fc7层,下面就写vgg.fc7,每层名字的定义在vgg16.py文件中,到此操作完毕。

    0572963b6709e7a68dc6620a8d709379.png

    3、遇到的问题

    在调用vgg16.py函数时,一直报下面这个错误:

    7bc16dcf450437a29b2b7d6c38e7a250.png

    查找原因发现是因为split()这个函数在不同版本的tensorflow中参数位置发生了改变,在tensorflow<0.12.0版本中的用法是:

    tf.split(axis, num_or_size_splits, value)

    在tensorflow>0.12.0版本中的用法是:

    tf.split(value, num_or_size_splits, axis)

    在vgg16.py对应位置上修改即可,

    73912cadab9c72a6d0e7d53da78ec24d.png

    完整代码:https://github.com/2281123066/vgg-tensorflow.git

    vgg16,vgg19模型下载:

    链接:https://pan.baidu.com/s/1S0hBs3ioP-TUgd3IS82syQ 密码:s4po

    更多相关内容
  • 为了提高图像语义特征提取的精确度, 克服目前大部分图像语义特征提取算法中, 因图像特征提取不当, 导致特征参数不能全面反映图像语义的问题, 提出了一种基于典型相关分析CCA的特征融合的图像语义特征提取方法。...
  • 图像特征提取语义分析是通过提取图像底层视觉特征,然后利用图像分析技术实现图像内容的语义描述、分类和理解。 其核心是确定图像底层特征与高层语义之间的映射关系,这正是计算机视觉领域当前研究的热点与难点。 ...
  • 种基于期望最大化( E M) 算法的局部图像特征语义提取方法。首先提取图像的局部图像特 征, 统计特征在视觉词汇本中的出现频率, 将图像表示成词袋模型; 引入文本分析中的潜在语义分析技术建立从低层图像 特征到...
  • 将深度学习应用于图像语义特征提取中,提出一种无监督的算法与朴素的基于深度学习的图像标注方法。
  • 图像处理入门5-特征提取

    千次阅读 2021-08-11 17:58:47
    而比较流行的深度学习方法,实质也提取特征,只不过是自动提取的,并对特征迭代计算找出最佳特征分布。 特征提取的一般原则 图像识别实际上是一个分类的过程,为了将它与其他不同类别的图像区分开来。我们自然希望...

    特征提取

    图像特征提取属于图像分析的范畴,是对图像信息的深层理解, 是数字图像处理的高级阶段, 同时也是图像识别的开始。特征工程是图像处理的必备工具,所以掌握它的重要性不言而喻。什么是特征?特征是某一类对象区别于其他类对象的相应(本质)特点或特性, 或是这些特点和特性的集合。那么特征都有哪些呢?粗略的讲,我们平常看到的灰度值,图像里物体的长宽,周长、面积、圆度、等区域描绘子, 以及直方图和灰度共现矩阵能量、熵、灰度相关性、图像矩等纹理描绘子都是特征(Gabor、几何特征、纹理特征或者统计意义的特征)。它比单纯灰度值的语义更抽象一层。其实特征提取到处可见,比如机器学习就是人工按照需要提取特征,并做特征分类。而比较流行的深度学习方法,实质也提取特征,只不过是自动提取的,并对特征迭代计算找出最佳特征分布。

    特征提取的一般原则
    图像识别实际上是一个分类的过程,为了将它与其他不同类别的图像区分开来。我们自然希望选择那些在同类图像之间差异较小(较小的类内距,类内集中度高),在不同类别的图像之间差异较大(较大的类间距,类间分离性好)的图像特征, 我们称之为最具有区分能力(most discriminative)的特征。此外, 在特征提取中先验知识扮演着重要的角色, 如何依靠先验知识来帮助我们选择特征也是后面将持续关注的问题。

    特征的评价
    面对实际问题时,特征提取应具体问题具体分析,其评价标准具有一定的主观性,以解决问题为导向。然而,还是有一些可供遵循的普遍原则,能够作为我们在特征提取实践中的指导。总结如下:
    特征应当容易提取。换言之, 为了得到这些特征我们付出的代价不能太大。 这还要与特征的分类能力权衡考虑.选取的特征应具有抗干扰性能,有效过滤噪声和不相关转换不敏感。 而最重要的一点, 应试图寻找最具区分能力的特征。上述内容是参考意义,不具有唯一性。下面举例说明,提取图像特征的一些方法。

    区域形状

    在取图像特征后,当我们想要提取某个区域时,往往存在几个相似的区域,这时可以根据区域的某个特征与其他区域区别开,用此特征来选择指定的区域。

    1.提取圆形区域:

    *读取图像
    read_image (Image, 'C:/Users/DELL/Desktop/circle_plate_01.png')
    *二值化
    threshold (Image, Region, 128, 255)
    *分离区域,此时区域比较多且杂,需要从中提取出来
    connection (Region, ConnectedRegions)
    *按面积特征选择大于150的区域
    select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 150, 99999)
    *在上一步基础上,按圆度选择特征在(0.99,1)之间的区域,这样按照特征就提出想要的区域
    select_shape (SelectedRegions1, SelectedRegions, 'circularity', 'and', 0.99,1)
    
    
            原图                                  二值化分并离不连通区域
    用面积筛选区域                              用圆度筛选区域

    2.获取区域特征

    *读取图像
    read_image (Image, 'C:/Users/Desktop/pic.bmp')
    *分解3通道
    decompose3 (Image, Image1, Image2, Image3)
    trans_from_rgb (Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, 'hsv')
    *阈值分割
    threshold (ImageResult3, Region, 180, 255)
    *腐蚀
    erosion_rectangle1 (Region, RegionErosion, 2, 2)
    dev_close_window ()
    *创建窗口句柄
    dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
    *膨胀
    dilation_rectangle1 (RegionErosion, RegionDilation, 2, 2)
    *分割区域
    connection (RegionDilation, ConnectedRegions)
    *按面积筛选
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999)
    *求区域指定的特征值
    region_features (SelectedRegions, ['area','row1','column1', 'width', 'height'], Value)
    *将特征值循环标注到图像上
    for i := 0 to (|Value|/5) - 1 by 1
        area := Value[i*5]
        row1 := Value[i*5 + 1]
        column1 := Value[i*5 + 2]
        width := Value[i*5 + 3]
        height := Value[i*5 + 4]
        
        *height
        disp_arrow (WindowHandle, row1, column1, row1 + height, column1, 1)
        disp_message (WindowHandle, height, 'image', row1 + height/3, column1 - 10, 'cyan', 'false')
        
        *width
        disp_arrow (WindowHandle, row1, column1, row1, column1 + width, 1)
        disp_message (WindowHandle, height, 'image', row1 - 10 , column1 + width/3, 'cyan', 'false')
        
        *area
        disp_message (WindowHandle, area, 'image', row1 + height/3 , column1 + width/3, 'black', 'true')
    endfor
    
    

    在这里插入图片描述

    图像

    在这里插入图片描述

    标注特征值



    展开全文
  • 针对图像语义分割中图像的上下文信息利用不充分、边缘分割不清等问题,提出一种基于多尺度特征提取与全连接条件随机场的网络模型。分别以多尺度形式将RGB图像和深度图像输入网络,利用卷积神经网络提取图像特征;将深度...
  • 已经在语义分割任务中取得了显著的效果,但是如何有效地利用网络在浅层次的视觉特征和深层次的语义特征一直是研究的热点,以此为出发点,提出了一种融合多级特征信息的图像语义分割方法。通过空洞卷积提取各层级的...
  • 通过研究自然景观图案的语义分类,分析了不同的核函数和参数优化算法对图像语义分类性能的影响,并用自然景观图片进行了验证。实验结果表明:当核函数为RBF且参数采用网格搜索优化时,SVM的分类效果最优,可实现对自然...
  • 针对复杂语境下自然语言语义特征提取、匹配精度和实时性较差的问题,提出了模糊聚类、单亲遗传搜索匹配算法相结合的新方法,通过对候选特征点进行模糊聚类处理,使其分布在高斯差分图像的灰度轮廓线边缘,利用单亲遗传...
  • 为了提高驾驶员在车辆行驶过程中的安全性,设计了一种结合图像语义分割的增强现实型平视显示(AR-HUD)系统。首先,提出一种改进的单发多框检测器网络对道路场景图像进行语义分割,网络前端采用VGG-16提取图像特征,...
  • 其一是利用反卷积网络,对卷积网络中不同深度的卷积层提取到的多尺度特征进行融合,之后再次通过反卷积操作对融合后的特征图进行上采样,将其放大到原图像的大小,最后对每个像素进行语义类别的预测.其二为了提升...
  • 利用经过预训练的VGG-Net-16模型提取表征能力更强的多层图像特征,再将各层深度特征分别用于训练对应的条件随机场模型,最后将多个条件随机场模型的输出结果进行融合,实现了最终的图像语义分割。结果表明:与基于...
  • 针对图像情感语义识别中特征提取的问题,提出了一种加权值的图像特征融合算法,并应用于图像情感语义识别。该方法根据不同特征对情感语义的影响不同,在提取出颜色、纹理和形状特征后通过加权融合为新的特征输入量,并用...
  • 数字图像处理与Python实现笔记之图像特征提取

    万次阅读 多人点赞 2020-07-30 16:23:00
    数字图像处理与Python实现笔记摘要绪论1 数字图像处理基础知识2 彩色图像处理初步3 空间滤波4 频域滤波5 图像特征提取5.1 图像颜色特征提取5.2 图像纹理特征提取5.3 图像形状特征提取5.4 图像边缘特征提取6 图像压缩...

    摘要

    1. 简要介绍数字图像处理涉及的一些基本概念、基本运算、基本类型,以及如何通过Python对数字图像进行读取和简单操作。
    2. 以彩色图像为例对数字图像处理的基本操作进行介绍,熟悉数字图像处理的基本过程,主要包括颜色空间的基本概念、伪彩色图像处理操作,彩色图像处理简单操作。
    3. 瞄准在空间域中对图像进行增强,介绍空间滤波的机理、基本概念以及使用的基本技术。本章内容包括空间滤波基本概念、基于空间滤波的图像平滑处理、基于空间滤波的锐化操作以及混合空间增强。
    4. 从频域角度入手对图像处理及增强方法展开介绍。因为频域滤波所需的数学知识较多,所以本章采取由浅入深的策略,首先介绍一维傅里叶变换,其次介绍二维傅里叶变换和快速傅里叶变换,最后介绍图像频域滤波中出现的各种技术,其大体可分为低通滤波和高通滤波两大类。
    5. 从全局特征提取和局部特征提取两方面入手,分别介绍颜色特征、纹理特征、形状特征、边缘特征、点特征的提取方法。本章内容是目前机器视觉和图像处理领域的学者关注较多的内容,通过穿插较多的实例,帮助读者理解图像特征提取的基本技术。
    6. 瞄准如何减少图像传输及存储数据大小,介绍主要使用的压缩技术,包括有损压缩和无损压缩等,并使用JPEG压缩技术串讲全章知识点。
    7. 介绍图像的小波域表示及多分辨率表示。

    绪论

    • 人工智能是引领未来发展的战略性技术,是新一轮科技革命和产业变革的重要驱动力量,将深刻地改变人类社会生活。

    • 促进人工智能和实体经济的深度融合,构建数据驱动、人机协同、跨界融合、共创分享的智能经济形态,更是推动质量变革、效率变革、动力变革的重要途经。

    • 进年来,我国人工智能新技术、新产品、新业态持续涌现,与农业、制造业、服务业等行业的融合步伐明显加快,在技术创新、应用推广、产业发展等方面成效初显。

    • 人工智能技术并不是一个新生事物,它在最近几年引起全球性关注并得到飞速发展的主要原因,在于它的三个基本要素(算法、数据、算力)的迅猛发展,其中又以数据和算力的发展尤为重要。

    • 物联网技术的蓬勃发展使得数据累计的难度越来越低,而芯片算力的不断提升,使得过去只能通过云计算才能完成的人工智能运算,现在可以下沉到最普通的设备上完成。

    • 物联网技术为机器带来感知能力,而人工智能则通过计算算力为机器带来了决策能力,正如感知和大脑对自然生命进化所起到的必然性作用。

    1 数字图像处理基础知识

    https://hulin.blog.csdn.net/article/details/107570020

    2 彩色图像处理初步

    https://hulin.blog.csdn.net/article/details/107578369

    3 空间滤波

    https://hulin.blog.csdn.net/article/details/107589248

    4 频域滤波

    https://hulin.blog.csdn.net/article/details/107609844

    5 图像特征提取

    • 图像特征是指可以对图像的内容或特点,进行表征的一系列数学的集合,主要包括图像的自然特征(如亮度、色彩、纹理等)和图像人为特征(如图像频谱、图像直方图等)。

    • 图像特征提取可以视为广义上的图像变换,即将图像从原始属性空间转化到特征属性空间。

    • 图像特征提取过程是指对图像包含的信息进行处理和分析,并将其中不易受随机因素干扰的信息,作为图像的特征提取出来,进而实现将图像的原始特征,表示为一组具有明显的物理意义或统计意义的特征。

    • 图像特征提取之后,通常还会伴随图像特征的选择。图像特征选择过程是去除冗余信息的过程,其具有提高识别精度、减少运算量、提高运算速度等作用。

    • 良好的图像特征通常具有以下3个特征。
      ① 代表性或可区分性
      图像特征应能够对该类别的图像进行高效表达。不同类别的对象之间的特征差异越大越好,以满足相应任务的要求。如在区分乒乓球和足球时,纹理特征就是一个不错的特征,因为足球一般有六边形纹理结构,而乒乓球没有。在进行图像分割时,图像中的边缘突变就是一个很好的特征,因为可以明确表示图像的内容发生了改变。
      ② 稳定性
      同一类别图像的特征应该具有类似的特征值,以保证类别内图像的相似度大于类别间图像的相似度。如在区分成熟苹果和不成熟苹果时,颜色是一个比较好的特征,因为不成熟的苹果通常呈青色,而成熟的苹果通常呈黄色或者红色,尺寸大小这个特征在区分苹果成熟与否时,不是一个稳定的特征。
      ③ 独立性
      图像特征应该彼此独立,尽量减少彼此的关联性,因为图像特征之间的关联性较强,会影响图像内容的较好表达。如苹果的直径和重量就属于关联性较强的两个特征,因为他们都可以反映苹果的大小,因此同时使用大小和重量这两个特征就会显得冗余。

    • 图像特征提取可以分为底层特征提取和高层语义特征提取。高层语义特征提取通常关注语义层次的特征,如识别任务中的人类识别,图像分类等。底层特征提取通常关注图像的颜色、纹理、形状等一般特征。底层特征提取很少关注图像的语义信息,通过底层特征提取获得的信息一般比较普遍。

    • 高层语义特征提取通常需要关联语义,如人脸识别中很多语义特征与人脸的部件相关,这能够反映图像中是否存在某类对象。高层语义特征提取以底层特征提取为基础,辅以模式识别等方法,建立语义关联,进而形成语义特征。深度学习的出现为语义特征提取提供了新的思路,实现了底层特征提取和高层语义关联之间的衔接,极大地提升了图像语义分析的效果。

    • 图像特征提取根据其相对尺度,可分为全局特征提取和局部特征提取。全局特征提取关注图像的整体表征。常见的全局特征包括颜色特征、纹理特征、形状特征、空间位置关系特征等。局部特征提取关注图像的某个局部区域的特殊性质。一幅图像中往往包含若干兴趣区域,从这些区域中可以提取出数量不等的若干个局部特征。和全局特征提取过程相比,局部特征提取过程首先需确定要描述的兴趣区域,然后再对兴趣区域进行特征描述。

    5.1 图像颜色特征提取

    • 颜色特征是比较简单但是应用广泛的一种视觉特征。颜色特征往往和图像中包含的对象或场景相关。
    • 与其他图像特征相比,颜色特征对图像的尺寸、方向、视角变化的依赖性较小,即相对于图像的尺寸、方向、视角变化具有较好的健壮性。颜色特征是一种全局特征,能够描述图像或图像区域对应的景物的表面性质。
    • 目前主要使用的颜色特征主要包括颜色直方图、颜色矩、颜色集、颜色聚合向量以及颜色相关图。

    5.1.1 颜色直方图

    • 颜色直方图用于描述图像中像素颜色的数值分布情况,可以反映图像颜色的统计分布和图像基本色调。颜色直方图仅可表征图像中某一颜色值出现的频数,无法描述图像像素分布的空间位置信息。
    • 任意一幅图像都能唯一给出一幅与它对应的颜色直方图,但是不同的图像可能有相同的颜色直方图,因此直方图与图像存在一对多的关系。如将图像划分为若干个子区域,所有子区域的颜色直方图之和等于全图的颜色直方图。
    • 一般情况下,由于图像上的背景和前景物体的颜色分布明显不同,颜色直方图上会出现双峰,但背景和前景物体的颜色较为接近的图像,颜色直方图不具有这一特性。

    1 一般颜色直方图

    • 颜色直方图是基本的颜色特征,它反映的是图像中像素颜色值的组成分布,即出现了哪些颜色,以及各种颜色出现的概率。
    from matplotlib import pyplot as plt
    from skimage import data, exposure
    
    
    # 中文显示工具函数
    def set_ch():
        from pylab import mpl
        mpl.rcParams['font.sans-serif'] = ['FangSong']
        mpl.rcParams['axes.unicode_minus'] = False
    
    
    set_ch()
    img = data.coffee()
    # 计算直方图
    histogram_r = exposure.histogram(img[:, :, 0], nbins=256)
    histogram_g = exposure.histogram(img[:, :, 1], nbins=256)
    histogram_b = exposure.histogram(img[:, :, 2], nbins=256)
    
    plt.figure()
    plt.subplot(221)
    plt.axis('off')
    plt.title('原始图像')
    plt.imshow(img)
    
    plt.subplot(222)
    plt.axis('off')
    plt.title('R通道直方图')
    plt.imshow(histogram_r)
    
    plt.subplot(223)
    plt.axis('off')
    plt.title('G通道直方图')
    plt.imshow(histogram_g)
    
    plt.subplot(224)
    plt.axis('off')
    plt.title('B通道直方图')
    plt.imshow(histogram_b)
    plt.show()
    
    
    • 彩色图像的一般颜色直方图
      在这里插入图片描述
    • 一般颜色直方图对图像的旋转、小幅平移、小幅缩放等变换不敏感,对图像质量的变化(如增加噪声也不敏感),所以一般颜色直方图法适用于对难以进行语义分割的图像和无需考虑空间位置的图像进行描述。
    • 计算机的固有量化机制导致一般颜色直方图法会忽略颜色间的相似性。

    2 全局累加直方图

    • 当图像中的颜色值不能取遍所有可能的颜色值时,一般颜色直方图中就会出现一些零值。这些零值的出现会影响相似性的度量,进而使计算出的相似度不能准确反映图像之间的颜色分布差异。
    • 为了弥补一般颜色直方图的缺陷,再一般颜色直方图的基础上,通过对直方图颜色进行累加,消除零值影响,形成全局累加直方图。

    3 主色调直方图

    • 在一幅图像中,不同颜色值出现的概率不尽相同,且通常情况下少数几种颜色就能涵盖整幅图像的主色调。
    • 基于该思想,主色调直方图会计算出图像中每种颜色出现的频率,选择出现频率最高的几种颜色并将其作为主色调。使用主色调直方图,不会降低颜色直方图匹配的效果,反而会抑制图像非主要成分的噪声,降低噪声对图像匹配的影响。

    颜色直方图的优点和缺点如下。

    • 优点:计算简单,对图像的平移和旋转变换不敏感,能简单描述图像中颜色的全局分布情况。
    • 缺点:无法捕捉(即丢失)颜色组成之间的空间位置关系。

    5.1.2 颜色矩

    • 矩是非常重要的统计量,用于表征数据分布的特点。在统计中,一阶矩表示数据的均值,二阶矩表示数据分布的方差,三阶矩表示数据分布的偏移度。
    • 图像的颜色矩用于对图像内颜色分布进行表征,是重要的一种全局图像特征表示。数字图像中颜色分布的统计信息主要集中在低阶矩中。
    • 图像的颜色矩特征提取时主要瞄准图像颜色矩中的一阶矩、二阶矩、三阶矩,对图像而言,这三种统计特征已经足以表达数字图像的颜色分布。
    • 相对于颜色直方图特征提取,颜色矩特征提取的优点是无须对颜色特征进提前量化。
    • 一阶矩可以表征该颜色通道的平均响应强度,二阶矩可以表示该颜色通道的响应方差,三阶矩可以表征该颜色通道数据分布的偏移度。针对彩色图像,图像的颜色矩一共有9个分量,每个颜色通道均有3个低阶矩。
    • 颜色矩仅使用少数几个矩容易导致过多错误检出,因而其通常和其他的几个特征配合使用。
    from matplotlib import pyplot as plt
    from skimage import data, exposure
    import numpy as np
    from scipy import stats
    
    
    # 中文显示工具函数
    def set_ch():
        from pylab import mpl
        mpl.rcParams['font.sans-serif'] = ['FangSong']
        mpl.rcParams['axes.unicode_minus'] = False
    
    
    set_ch()
    
    image = data.coffee()
    # 求RGB图像的颜色矩特征,共9维特征
    # 定义3*3数组,分别对RGB图像的三个通道求均值、方差、偏移量
    features = np.zeros(shape=(3, 3))
    for k in range(image.shape[2]):
        mu = np.mean(image[:, :, k])  # 求均值
        delta = np.std(image[:, :, k])  # 求方差
        skew = np.mean(stats.skew(image[:, :, k]))  # 求偏移量
        features[0, k] = mu
        features[1, k] = delta
        features[2, k] = skew
    print(features)
    
    

    5.1.3 颜色集

    • 颜色集又可以称为颜色索引集,是对颜色直方图的一种近似。
    • 颜色集方法的步骤是:第一,将图像从RGB图像空间转换到HSV颜色空间等视觉均衡的颜色空间,并将颜色空间量化为若干个边长均等的小立方体。第二,使用基于颜色的自动分割技术,将图像划分为若干个子区域。第三,使用颜色量化空间中的某个颜色分类索引每个子区域,以将图像表示为一个二进制的颜色索引集。
      ① 像素矢量表示
      ② 颜色空间转换
      ③ 颜色集索引
      ④ 颜色集表示

    5.1.4 颜色聚合向量

    • 颜色聚合向量是在颜色直方图上做进一步运算,其核心思想就是将属于颜色直方图的每个颜色量化区间的像素分为两部分,如果该颜色量化区间中的某些像素,占据连续区域的面积大于指定阈值,则将该区域内的像素作为聚合像素,否则作为非聚合像素。
    • 颜色聚合向量除了包含颜色频率信息外,也包含颜色的部分空间分布信息,因此其可以获得比颜色直方图过更好的效果。颜色聚合向量算法的具体步骤如下。
      ① 量化
      颜色聚合向量算法的第一步与求普通的颜色直方图类似,即对图像进行量化处理。一般采用均匀量化方法,量化的目标是使图像中只保留有限个颜色空间。
      ② 连通区域划分
      针对重新量化后的像素矩阵,根据像素间的连通性把图像划分为若干个连通区域。
      ③ 判断聚合性
      统计每个连通区域中的像素数目,根据设定的阈值判断该区域中的像素的聚合性
      ④ 聚合向量形成

    5.1.5 颜色相关图

    • 颜色相关图不仅可以显示像素在图像中的占比,也可以反映不同颜色对间的空间位置的相关性。
    • 颜色相关图利用颜色对间的相对距离分布来描述空间位置信息。
    from matplotlib import pyplot as plt
    from skimage import data, exposure
    import numpy as np
    from scipy import stats
    
    
    # 中文显示工具函数
    def set_ch():
        from pylab import mpl
        mpl.rcParams['font.sans-serif'] = ['FangSong']
        mpl.rcParams['axes.unicode_minus'] = False
    
    
    set_ch()
    
    
    def isValid(X, Y, point):
        """
        判断某个像素是否超出图像空间范围
        :param X:
        :param Y:
        :param point:
        :return:
        """
        if point[0] < 0 or point[0] >= X:
            return False
        if point[1] < 0 or point[1] >= Y:
            return False
        return True
    
    
    def getNeighbors(X, Y, x, y, dist):
        """
        Find pixel neighbors according to various distances
        :param X:
        :param Y:
        :param x:
        :param y:
        :param dist:
        :return:
        """
        cn1 = (x + dist, y + dist)
        cn2 = (x + dist, y)
        cn3 = (x + dist, y - dist)
        cn4 = (x, y - dist)
        cn5 = (x - dist, y - dist)
        cn6 = (x - dist, y)
        cn7 = (x - dist, y + dist)
        cn8 = (x, y + dist)
        points = (cn1, cn2, cn3, cn4, cn5, cn6, cn7, cn8)
        Cn = []
        for i in points:
            if (isValid(X, Y, i)):
                Cn.append(i)
        return Cn
    
    
    def corrlogram(image, dist):
        XX, YY, tt = image.shape
        cgram = np.zeros((256, 256), dtype=np.int)
        for x in range(XX):
            for y in range(YY):
                for t in range(tt):
                    color_i = image[x, y, t]
                    neighbors_i = getNeighbors(XX, YY, x, y, dist)
                    for j in neighbors_i:
                        j0 = j[0]
                        j1 = j[1]
                        color_j = image[j0, j1, t]
                        cgram[color_i, color_j] = cgram[color_i, color_j] + 1
        return cgram
    
    
    img = data.coffee()
    dist = 4
    cgram = corrlogram(img, dist)
    plt.imshow(cgram)
    plt.show()
    
    

    在这里插入图片描述

    5.2 图像纹理特征提取

    • 纹理是一种反映图像中同质现象的视觉特征,它体现了物体表面的具有重复性或周期性变化的表面结构组织排列属性。纹理有三大特点:重复性、周期性、同质性。
      ① 重复性
      图像可以看作是某种局部元素在全局区域的不断重复出现。
      ② 周期性
      图像中元素并非随机出现,而是按照一定的周期性重复出现。
      ③ 同质性
      重复出现的元素在结构和尺寸上大致相同。
    • 纹理是某种局部序列不断重复、非随机排列、在结构和尺寸上大致相同的统一体。
      在这里插入图片描述
    • 不同于灰度、颜色等图像特征,纹理特征通过像素及其周边空间域像素的灰度分布进行描述,也就是局部纹理信息。局部纹理的反复排布呈现出的重复性,就是所谓的全局纹理信息。
    • 纹理信息在表现全局特征性质的同时,也体现了图像或图像所在区域对应景物的表面特性。纹理特征只是对物体表面特性进行描述,并不能反映物体的本质属性,即图像高层语义信息。
    • 纹理特征提取过程是通过一定的图像处理技术抽取出纹理特征,从而获得纹理的定量或定性描述的过程。纹理特征提取的基本过程如下。
      ① 纹理基元建模
      从像素出发,找出纹理基元(即纹理图像中辨识能力比较强的特征),并根据纹理基元的排列信息,建立起纹理基元模型。
      ② 整体纹理模型构建
      利用纹理基元模型对纹理图像进行特征提取,以支持对图像的进一步分割、分类以及辨识,形成图像整体纹理模型。
    • 常见的纹理特征提取方法可以分为如下4类。
      ① 统计分析法
      统计分析法又称基于统计纹理特征的检测方法,该方法假设纹理图像在空间灰度分布上,存在某种重复性,通过对纹理图像的灰度空间分布进行计算,从而得到纹理特征,主要包括灰度直方图法、灰度共生矩阵法、灰度行程长度法、灰度差分统计、交叉对角矩阵、自相关函数法等。该类方法在木纹、沙地、草地之类的图像分析上很有效。其主要优势是:方法简单,易于实现,典型的代表方法是灰度共生矩阵法,被认为是比较有效的纹理分析方法。
      ② 结构分析法
      结构分析法认为纹理基元之间存在某种结构规则关系,该类方法首先对图像中的纹理基元进行分离,然后基于纹理基元的特征和空间排列规则对纹理进行表征,主要包括偏心度、面积、方向等特征,其主要目标是通过图像结构特征和排列规则的描述,得到纹理特征的描述,此类算法主要适用于已知纹理基元的情况,对砖墙、纤维等纹理基元和排列规则都比较明显的图像有效。
      ③ 模型分析法
      模型分析法基于像素及其邻域像素之间的关系建立模型,根据不同模型提取不同特征量,进行参数估计。典型的模型分析法包括自然回归法、马尔可夫条件随机场法以及分形法等。
      ④ 频谱分析法
      频谱分析法又称为信号处理法和滤波方法。该方法将纹理图像从空间域变换到频域,然后通过计算峰值处的面积、峰值与原点的距离平方、峰值处的相位、两个峰值间的相角差等,获得在空间域不易获得的纹理特征,如周期、功率谱信息等,典型的频谱分析法有二维傅里叶(变换)滤波方法,Gabor(变换)滤波变换和小波方法等。

    5.2.1 统计纹理分析方法

    • 统计纹理分析方法是较常用的纹理特征描述分析方法,通过统计图像的空间频率、边界频率以及空间灰度依赖关系等对纹理进行描述。
    • 细致的纹理有较高的频率,例如,布匹的纹理是非常细致的纹理,其纹理基元较小,出现频率较高。粗糙的纹理结构具有较低的空间频率,如大理石纹理一般较粗糙,具有较大的纹理基元,出现频率较低。
    • 纹理图像的空间频率可以作为纹理描述的一种方式。边界频率是另外一种基于统计的纹理图像描述方法,边界频率越高,表明纹理越精细。空间灰度依赖关系方法通过描述纹理结构之间的空间依赖关系描述纹理。
    • 常用的统计纹理分析方法有自相关函数、边界频率、灰度共生矩阵等。统计纹理分析方法并不刻意精确描述纹理的结构。从统计学的角度看,纹理图像是一些复杂的模式,通常通过获得的统计特征集描述这些模式。
    • 灰度共生矩阵法也称联合概率矩阵法。该方法基于图像中的灰度结构重复出现的概率,对图像纹理特征进行描述。该方法的本质是使用条件概率表征纹理特征,通过对空间上,具有某种位置关系的一对像素成对出现的概率进行统计,得到灰度共生矩阵,然后从灰度共生矩阵中提取有意义的统计特征对纹理进行描述。
    from matplotlib import pyplot as plt
    from skimage.feature import greycomatrix, greycoprops
    from skimage import data
    import numpy as np
    
    
    # 中文显示工具函数
    def set_ch():
        from pylab import mpl
        mpl.rcParams['font.sans-serif'] = ['FangSong']
        mpl.rcParams['axes.unicode_minus'] = False
    
    
    set_ch()
    PATCH_SIZE = 21
    image = data.camera()
    # 选择图像中的草地区域
    grass_locations = [(474, 291), (440, 433), (466, 18), (462, 236)]
    grass_patches = []
    for loc in grass_locations:
        grass_patches.append(image[loc[0]:loc[0] + PATCH_SIZE, loc[1]:loc[1] + PATCH_SIZE])
    
    # 选择图像中的天空区域
    sky_locations = [(54, 48), (21, 233), (90, 380), (195, 330)]
    sky_patches = []
    for loc in sky_locations:
        sky_patches.append(image[loc[0]:loc[0] + PATCH_SIZE, loc[1]:loc[1] + PATCH_SIZE])
    # 计算每个块中灰度共生矩阵属性
    xs = []
    ys = []
    for patch in (grass_patches + sky_patches):
        glcm = greycomatrix(patch, [5], [0], 256, symmetric=True, normed=True)
        xs.append(greycoprops(glcm, 'dissimilarity')[0, 0])
        ys.append(greycoprops(glcm, 'correlation')[0, 0])
    # 创建绘图
    fig = plt.figure(figsize=(8, 8))
    # 展现原始图像,以及图像块的位置
    ax = fig.add_subplot(3, 2, 1)
    ax.imshow(image, cmap=plt.cm.gray, interpolation='nearest', vmin=0, vmax=255)
    for (y, x) in grass_locations:
        ax.plot(x + PATCH_SIZE / 2, y + PATCH_SIZE / 2, 'gs')
    for (y, x) in sky_locations:
        ax.plot(x + PATCH_SIZE / 2, y + PATCH_SIZE, 'bs')
    ax.set_xlabel('原始图像')
    ax.set_xticks([])
    ax.set_yticks([])
    ax.axis('image')
    # 对于每个块,plot(dissimilarity,correlation)
    ax = fig.add_subplot(3, 2, 2)
    ax.plot(xs[:len(grass_patches)], ys[:len(grass_patches)], 'go', label='Grass')
    ax.plot(xs[:len(sky_patches)], ys[:len(sky_patches)], 'bo', label='Sky')
    ax.set_xlabel('灰度共生矩阵相似性')
    ax.set_ylabel('灰度共生矩阵相关度')
    ax.legend()
    # 展示图像
    for i, patch in enumerate(grass_patches):
        ax = fig.add_subplot(3, len(grass_patches), len(grass_patches) * 1 + i + 1)
        ax.imshow(patch, cmap=plt.cm.gray, interpolation='nearest', vmin=0, vmax=255)
        ax.set_xlabel('Grass %d' % (i + 1))
    for i, patch in enumerate(sky_patches):
        ax = fig.add_subplot(3, len(sky_patches), len(sky_patches) * 2 + i + 1)
        ax.imshow(patch, cmap=plt.cm.gray, interpolation='nearest', vmin=0, vmax=255)
        ax.set_xlabel('Sky %d' % (i + 1))
    # 展示图像块并显示
    fig.suptitle('Grey level co-occurrence matrix features', fontsize=14)
    plt.show()
    
    
    • 基于灰度共生矩阵的纹理描述方法
      在这里插入图片描述

    5.2.2 Laws纹理能量测量法

    • Laws纹理能量测量法是一种典型的一阶纹理分析方法,在纹理分析领域有一定影响。
    • Laws纹理能力测量的基本思想是创建两个窗口:一个是微窗口,可为3×3、5×5或7×7,常取5×5测量以像元为中心的小区域的灰度的不规则性,以形成属性,称为微窗口滤波;另一个是宏窗口,为15×15或32×32,用来在更大的区域上求属性的一阶统计量(常为均值和标准偏差),称为能量变换。
    • 整个纹理分析过程为:f(x,y)→微窗口滤波→F(x,y)→能量转换→E(x,y)→分类

    5.2.3 Gabor变换

    • 大量心理和生理学研究发现,在人类的低级视觉中,输入信号被一系列具有不同频率和方位的线性空间滤波器分解成一组频率和方位通道,Gabor分解可以很好的描述这一信号分解过程。
    • Gabor变换具有两个重要的特性。一是其良好的空间域与频域局部化性质。二是无论从空间域的起伏特性上,方位选择特性上,空间域与频域选择上,还是从正交相位的关系上,二维Gabor基函数具有与大多数哺乳动物的视觉表皮简单细胞的二维感知域模型相似的性质。
    • 可以借鉴人类处理信号的特性,用包含多个Gabor滤波器的滤波器组,对图像进行不同中心频率和方位的滤波处理,从而提取不同频率成分和不同方位的特征,作为目标的非参数化特征,研究其不同分辨率目标的特征与图像分辨率的关系。
    • Gabor滤波器滤波过程
      在这里插入图片描述

    5.2.4 局部二值模式

    • 局部二值模式(Local Binary Pattern,LBP)的基本思想是将中心像素点的灰度值作为阈值,将其邻域内的像素点灰度值与阈值进行比较,从而得到二进制编码用以表述局部纹理特征。
    • LBP表示方法不易受图像整体灰度线性变化的影响,当图像的灰度值发生线性均匀变化时,其LBP特征编码是不变的。
    • LBP特征计算简单,表征能力强,在纹理特征描述上具有较好的效果。
    • 基本LBP算子:3*3的矩形块,有一个中心像素和8个邻域像素,分别对应9个灰度值。
    • 特征值:以中心像素的灰度值为阈值,将其邻域的8个灰度值与阈值比较,大于中心灰度值的像素用1表示,反之用0表示。然后顺时针方向读出8个二进制值。
      在这里插入图片描述
    • 经阈值化后的二值矩阵,可以看出一个二值纹理模式,用来刻画邻域内,像素点的灰度相对中心点的变化。
    • 因为人类视觉系统对纹理的感知与平均灰度(亮度无关),而局部二值模式方法注重像素灰度的变化,符合人类视觉对纹理感知的特点。
    import skimage.feature
    import skimage.segmentation
    import skimage.data
    import matplotlib.pyplot as plt
    
    
    # 中文显示工具函数
    def set_ch():
        from pylab import mpl
        mpl.rcParams['font.sans-serif'] = ['FangSong']
        mpl.rcParams['axes.unicode_minus'] = False
    
    
    set_ch()
    img = skimage.data.coffee()
    for colour_channel in (0, 1, 2):
        img[:, :, colour_channel] = skimage.feature.local_binary_pattern(img[:, :, colour_channel], 8, 1.0, method='var')
    plt.imshow(img)
    plt.show()
    
    

    在这里插入图片描述

    5.3 图像形状特征提取

    • 形状和区域特征是图像中的另一类重要特征。不同于颜色、纹理等底层特征,对形状特征的描述必须以对图像中的物体或区域对象的分割为前提。
    • 形状特征的表示方法可以分为两类:一是基于轮廓特征,典型方法是傅里叶描述符方法。二是基于区域特征,典型方法是形状无关矩法。轮廓特征中只用到物体的边界,而区域特征需要考虑整个形状区域。

    5.3.1 简单形状特征

    • 矩形度。反应物体对外接矩形的充满度,用物体的面积与其最小外接矩形的面积之比描述。
      在这里插入图片描述
    • 球状性。球状性既可以描述二维目标,也可描述三维目标。
      在这里插入图片描述
    • 圆形性。目标圆形性是指用目标区域R的所有边界点定义的特征量。

    5.3.2 傅里叶描述符

    • 傅里叶描述符是用于单封闭曲线形状特征描述的常用工具。傅里叶描述符将待描述目标曲线看组一维数值序列,使用傅里叶变换对该序列进行转换,得到描述该曲线的一系列傅里叶系数。
    • 傅里叶描述符具有计算简单、描述清晰等优点。相较于其他复杂的描述方法,傅里叶描述符更加直观,易于理解。
    • 傅里叶描述方法一般分为两步:首先,定义轮廓线的表示,把坐标的序列点看作复数,即s(k)=x(k)+jy(k),x轴作为实轴,y轴作为虚轴,边界的性质不变。这种表示方法的优点是将一个二维边缘描述问题,简化为一个一维序列描述问题。其次,对一维序列s(k)进行傅里叶变换,并求得其傅里叶系数。

    5.3.3 形状无关矩

    • 由于图像区域的某些矩对于平移、旋转、尺度等几何变换具有一些不变的特性,使得矩的表示方法在物体的分类与识别方面具有重要的意义。

    5.4 图像边缘特征提取

    • 图像边缘具有方向和幅度两个主要成分。沿边缘方向移动,像素的灰度值变化速率较为平缓,而沿垂直于边缘的方向移动,像素的灰度值变化率较为剧烈。这种剧烈的变化或者呈阶跃状(Step Edge),或呈屋顶状(Proof Edge),分为称为阶跃状边缘和屋顶状边缘。根据边缘的性质,一般用一阶或二阶导数对其进行描述和检测。
      在这里插入图片描述
    • 图像中的边缘可以通过对他们求导数确定,而导数可利用微分算子计算。对于数字图像处理而言,通常利用差分近似微分。
    • 图像边缘检测的基本步骤如下。
      ① 滤波
      边缘检测主要基于导数计算,但易受噪声影响,滤波操作的主要目的是降低噪声的干扰,但滤波在降低噪声的同时,也会损失边缘强度。
      ② 增强
      增强算法将局部邻域中灰度值有显著变化的点突出显示,一般可通过计算梯度幅值完成。
      ③ 检测
      有些图像中梯度幅值较大的点并不是边缘点,需要对其进行进一步筛选,最简单的检测方法是设定梯度幅值阈值。
      ④ 定位
      定位即精确确定边缘的位置。
    • 传统边缘检测的流程。

    在这里插入图片描述

    5.4.1 梯度边缘检测

    • 梯度的方向(由梯度矢量的幅角表示)是函数f(x,y)增加最快的方向,定义为ϕ(x,y)=arctan(Gy/Gx),从梯度原理出发,已经发展了很多边缘检测算子。

    5.4.2 一阶边缘检测算子

    1 罗伯特算子

    • 罗伯特边缘检测算子,用对角线上相邻像素之差代替梯度寻找边缘。
    • 罗伯特边缘检测的步骤:
      (1)用两个模板分别对图像进行运算得到RxfRyf,并计算|G(i,j)|=|Gx|+|Gy|
      (2)判断该相加结果是否大于某个阈值。如果满足条件,则将其作为结果图像中对应模板(i,j)位置的像素值;如果不满足条件,则结合结果图像中对应模板(i,j)位置的像素赋0值。
    import matplotlib.pyplot as plt
    from skimage.data import camera
    from skimage.filters import roberts
    
    
    # 中文显示工具函数
    def set_ch():
        from pylab import mpl
        mpl.rcParams['font.sans-serif'] = ['FangSong']
        mpl.rcParams['axes.unicode_minus'] = False
    
    
    set_ch()
    image = camera()
    edge_roberts = roberts(image),
    fig, ax = plt.subplots(ncols=2, sharex=True, sharey=True, figsize=(8, 4))
    ax[0].imshow(image, cmap='gray')
    ax[0].set_title('原始图像')
    
    ax[1].imshow(edge_roberts, cmap='gray')
    ax[1].set_title('Roberts 边缘检测')
    for a in ax:
        a.axis('off')
    plt.tight_layout()
    plt.show()
    
    

    在这里插入图片描述

    2 索贝尔算子

    • 索贝尔边缘检测的步骤:
      (1)用两个模板分别对图像进行计算,得出|G(i,j)|=Gx+Gy
      (2)判别该相加结果是否大于或等于某个阈值,如果满足条件,则将其作为结果图像中对应模板(i,j)位置的像素值;如果不满足条件,则给结果图像中对应模板(i,j)位置的像素赋0值。
    import matplotlib.pyplot as plt
    from skimage.data import camera
    from skimage.filters import sobel, sobel_v, sobel_h
    
    
    # 中文显示工具函数
    def set_ch():
        from pylab import mpl
        mpl.rcParams['font.sans-serif'] = ['FangSong']
        mpl.rcParams['axes.unicode_minus'] = False
    
    
    set_ch()
    image = camera()
    edge_sobel = sobel(image)
    edge_sobel_v = sobel_v(image)
    edge_sobel_h = sobel_h(image)
    fig, ax = plt.subplots(ncols=2, nrows=2, sharex=True, sharey=True, figsize=(8, 4))
    
    ax[0, 0].imshow(image, cmap=plt.cm.gray)
    ax[0, 0].set_title('原始图像')
    
    ax[0, 1].imshow(edge_sobel, cmap=plt.cm.gray)
    ax[0, 1].set_title('Sobel 边缘检测')
    
    ax[1, 0].imshow(edge_sobel_v, cmap=plt.cm.gray)
    ax[1, 0].set_title('Sobel 垂直边缘检测')
    
    ax[1, 1].imshow(edge_sobel_h, cmap=plt.cm.gray)
    ax[1, 1].set_title('Sobel 水平边缘检测')
    
    for a in ax:
        for j in a:
            j.axis('off')
    plt.tight_layout()
    plt.show()
    
    

    在这里插入图片描述

    • 索贝尔边缘检测算子在较好的获得边缘性效果的同时,对噪声具有一定的平滑作用,减少了噪声的敏感性。但索贝尔边缘检测的边缘比较粗,会检测出一些伪边缘,边缘检测精度较低。

    3 Prewitt算子

    • Prewitt算子在方向和方向的梯度幅值上的形式,与索贝尔算子的形式完全相同,只是系数均为1,对应的3*3模板为
      在这里插入图片描述

    • Prewitt算子的计算比索贝尔算子更简单,但在噪声抑制方面,索贝尔算子比Prewitt算子略胜一筹。

    • 梯度算子对噪声有一定的敏感性,所以适用于图像边缘灰度值比较尖锐,且图像中噪声比较小的情况

    5.4.3 二阶边缘检测算子

    • 在利用一阶导数的边缘检测算子进行边缘检测时,有时会出现因检测到的边缘点过多,而导致边缘线过粗的情况。
    • 通过去除一阶导数中的非局部最大值,就可以检测出更细的边缘,而一阶导数的局部最大值对应二阶导数的零交叉点。所以,通过找图像的二阶导数的零交叉点,就能找到精确的边缘点。

    1 拉普拉斯(Laplace)算子

    • 对阶跃状边缘,其二阶导数在边缘点出现过零交叉,即边缘点两旁的二阶导数取异号,据此可通过二阶导数检测边缘点。
    • Laplace算子的边缘检测
    import matplotlib.pyplot as plt
    from skimage.data import camera, coffee
    from skimage.filters import laplace
    
    
    # 中文显示工具函数
    def set_ch():
        from pylab import mpl
        mpl.rcParams['font.sans-serif'] = ['FangSong']
        mpl.rcParams['axes.unicode_minus'] = False
    
    
    set_ch()
    image_camera = camera()
    edge_laplace_camera = laplace(image_camera)
    image_coffee = coffee()
    edge_laplace_coffee = laplace(image_coffee)
    fig, ax = plt.subplots(ncols=2, nrows=2, sharex=True, sharey=True, figsize=(8, 6))
    
    ax[0, 0].imshow(image_camera, cmap=plt.cm.gray)
    ax[0, 0].set_title('原始图像')
    
    ax[0, 1].imshow(edge_laplace_camera, cmap=plt.cm.gray)
    ax[0, 1].set_title('Laplace 边缘检测')
    
    ax[1, 0].imshow(image_coffee, cmap=plt.cm.gray)
    ax[1, 0].set_title('原始图像')
    
    ax[1, 1].imshow(edge_laplace_coffee, cmap=plt.cm.gray)
    ax[1, 1].set_title('Laplace 边缘检测')
    
    for a in ax:
        for j in a:
            j.axis('off')
    plt.tight_layout()
    plt.show()
    
    
    • 边缘检测算子模板的基本特征是中心位置的系数为正,其余位置的系数为负,且模板的系数之和为0.
    • 它的使用方法是用图中的两个点阵之一作为卷积核,与原图像进行卷积运算即可。
    • Lapace检测模板的特点是各向同性,对孤立点及线端的检测效果好,Laplace算子的缺点是会出现边缘方向信息丢失,对噪声敏感,整体检测效果不如梯度算子,且与索贝尔算子相比,对图像进行处理时,Laplace算子能使噪声成分得到加强,对噪声更敏感。
      在这里插入图片描述

    2 LoG边缘检测算子

    • 实际应用中,由于噪声的影响,对噪声敏感的边缘检测点检测算法(如拉普拉斯算子法)可能会把噪声当边缘检测点检测出来,而真正的边缘点会被噪声淹没而未检测出。
    • LoG算子基于Laplace算子和Gauss算子,也称拉普拉斯-高斯边缘检测算子。
    • 由于平滑会导致边缘的延展,因此在边缘检测时,仅考虑那些具有局部最大值的点为边缘点。
    import matplotlib.pyplot as plt
    from skimage.data import camera, coffee
    from skimage.filters import laplace, gaussian
    
    
    # 中文显示工具函数
    def set_ch():
        from pylab import mpl
        mpl.rcParams['font.sans-serif'] = ['FangSong']
        mpl.rcParams['axes.unicode_minus'] = False
    
    
    set_ch()
    image = camera()
    edge_laplace = laplace(image)
    gaussian_image = gaussian(image)
    edge_LoG = laplace(gaussian_image)
    
    fig, ax = plt.subplots(ncols=2, nrows=2, sharex=True, sharey=True, figsize=(8, 6))
    
    ax[0, 0].imshow(image, cmap=plt.cm.gray)
    ax[0, 0].set_title('原始图像')
    
    ax[0, 1].imshow(edge_laplace, cmap=plt.cm.gray)
    ax[0, 1].set_title('Laplace 边缘检测')
    
    ax[1, 0].imshow(gaussian_image, cmap=plt.cm.gray)
    ax[1, 0].set_title('高斯平滑后的图像')
    
    ax[1, 1].imshow(edge_LoG, cmap=plt.cm.gray)
    ax[1, 1].set_title('LoG 边缘检测')
    
    for a in ax:
        for j in a:
            j.axis('off')
    plt.tight_layout()
    plt.show()
    
    
    • 基于LoG的边缘检测效果
      在这里插入图片描述

    5.5 图像点特征提取

    • 如果图像中一个非常小的区域的灰度值,与其邻域值相比有明显的差异,则称这个非常小的区域为图像点(一般意义上的孤立像素点)
      在这里插入图片描述

    • 目前对图像点特征提取的技术有多种,其中研究最多、应用最广的是角点检测算法。

    • 从直观可视的角度出发,两条直线相交的顶点可看作是角点;物体的几个平面的相交处也可以看作角点。从图像特征的角度出发,图像中周围灰度变化较剧烈的点可看作是角点;图像边界上曲率足够高的点也可以看作是角点。

    • 常见的角点类型。
      在这里插入图片描述

    • 角点的检测方法有很多种,其检测原理也多种多样,但这些方法概括起来大体可分为3类:一是基于模板的角点检测算法;二是基于边缘的角点检测算法;三是基于图像灰度变化的角点检测算法。其中,基于图像灰度变化的角点检测算法应用最广泛。

    • SUSAN角点检测算法选用圆形模板,将位于圆形窗口模板中心等待检测的像素点称为核心点。核心点的邻域被划分为两个区域:亮度值相似于核心点亮度的区域即核值相似区和亮度值不相似于核心点亮度的区域。

    • SUSAN算法通过核值相似区的大小判别图像角点,并实现图像中角点特征的检测和提取。
      在这里插入图片描述

    • SUSAN算子实现代码

    import matplotlib.pyplot as plt
    from skimage.data import camera
    import numpy as np
    
    
    # 中文显示工具函数
    def set_ch():
        from pylab import mpl
        mpl.rcParams['font.sans-serif'] = ['FangSong']
        mpl.rcParams['axes.unicode_minus'] = False
    
    
    def susan_mask():
        mask = np.ones((7, 7))
        mask[0, 0] = 0
        mask[0, 1] = 0
        mask[0, 5] = 0
        mask[0, 6] = 0
        mask[1, 0] = 0
        mask[1, 6] = 0
        mask[5, 0] = 0
        mask[5, 6] = 0
        mask[6, 0] = 0
        mask[6, 1] = 0
        mask[6, 5] = 0
        mask[6, 6] = 0
        return mask
    
    
    def susan_corner_detection(img):
        img = img.astype(np.float64)
        g = 37 / 2
        circularMask = susan_mask()
        output = np.zeros(img.shape)
        for i in range(3, img.shape[0] - 3):
            for j in range(3, img.shape[1] - 3):
                ir = np.array(img[i - 3:i + 4, j - 3:j + 4])
                ir = ir[circularMask == 1]
                ir0 = img[i, j]
                a = np.sum(np.exp(-((ir - ir0) / 10) ** 6))
                if a <= g:
                    a = g - a
                else:
                    a = 0
                output[i, j] = a
        return output
    
    
    set_ch()
    image = camera()
    out = susan_corner_detection(image)
    plt.imshow(out, cmap='gray')
    plt.show()
    
    
    • 基于SUSAN算子的角点检测响应图像
      在这里插入图片描述

    5.6 小结

    • 本章首先对图像特征提取进行了简单介绍,其次主要介绍了全局特征提取技术,如颜色、纹理、形状特征提取,最后对局部特征提取技术(如边缘检测、角点检测)进行了简单介绍。

    参考资料

    1. 岳亚伟《数字图像处理与Python实现》人民邮电出版社
    展开全文
  • 在检索实验中,在基于内容的图像检索系统中(CBIR)分别使用颜色特征-HSV空间颜色直方图,小波纹理特征,以及这两个特征进行融合,并使用两种不同的相似度度量方法,分析比较不同特征提取方法及相似度测量方法在刑侦图像和...
  • Python人脸图像特征提取(HOG、Dlib、CNN方法)一、HOG人脸图像特征提取1、HOG特征:1) 主要思想:2) 实现方法:3) 性能提高:4) 优点2、HOG特征提取算法的实现过程:二、Dlib人脸图像特征提取1.Dlib介绍2.主要特点三...

    Python人脸图像特征提取(HOG、Dlib、CNN方法)

    一、HOG人脸图像特征提取

    1、HOG特征:

    1) 主要思想:

    2) 实现方法:

    3) 性能提高:

    4) 优点

    2、HOG特征提取算法的实现过程:

    二、Dlib人脸图像特征提取

    1.Dlib介绍

    2.主要特点

    三、卷积神经网络人脸图像特征提取

    1、卷积神经网络简介

    2、卷积神经网络结构

    1) 输入层

    2) 隐含层

    卷积层

    池化层

    输出层

    一、HOG人脸图像特征提取

    1、HOG特征:

    方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。

    1) 主要思想:

    在一副图像中,局部目标的表象和形状能够被梯度或边缘的方向密度分布很好地描述。其本质为:梯度的统计信息,而梯度主要存在于边缘的地方。

    Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。

    2) 实现方法:

    首先将图像分成小的连通区域,这些连通区域被叫做细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来,就可以构成特征描述符。

    3) 性能提高:

    将这些局部直方图在图像的更大的范围内(叫做区间)进行对比度归一化,可以提高该算法的性能,所采用的方法是:先计算各直方图在这个区间中的密度,然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更好的效果。

    4) 优点

    与其他的特征描述方法相比,HOG有很多优点。首先,由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征是特别适合于做图像中的人体检测的。

    2、HOG特征提取算法的实现过程:

    HOG特征提取方法就是将一个image:

    1)灰度化(将图像看做一个x,y,z(灰度)的三维图像);

    2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;

    3)计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。

    4)将图像划分成小cells(例如6*6像素/cell);

    5)统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;

    6)将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor。

    7)将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image(你要检测的目标)的HOG特征descriptor了。这个就是最终的可供分类使用的特征向量了。

    HOG特征提取流程图:

    b7b78402208436e9728a9f3d578058dc.png

    具体每一步的详细过程如下:

    标准化gamma空间和颜色空间

    为了减少光照因素的影响,首先需要将整个图像进行规范化(归一化)。在图像的纹理强度中,局部的表层曝光贡献的比重较大,所以,这种压缩处理能够有效地降低图像局部的阴影和光照变化。因为颜色信息作用不大,通常先转化为灰度图;

    计算图像梯度

    计算图像横坐标和纵坐标方向的梯度,并据此计算每个像素位置的梯度方向值;求导操作不仅能够捕获轮廓,人影和一些纹理信息,还能进一步弱化光照的影响。

    最常用的方法是:简单地使用一个一维的离散微分模板在一个方向上或者同时在水平和垂直两个方向上对图像进行处理,更确切地说,这个方法需要使用滤波器核滤除图像中的色彩或变化剧烈的数据

    构建方向的直方图

    细胞单元中的每一个像素点都为某个基于方向的直方图通道投票。投票是采取加权投票的方式,即每一票都是带有权值的,这个权值是根据该像素点的梯度幅度计算出来。可以采用幅值本身或者它的函数来表示这个权值,实际测试表明: 使用幅值来表示权值能获得最佳的效果,当然,也可以选择幅值的函数来表示,比如幅值的平方根、幅值的平方、幅值的截断形式等。细胞单元可以是矩形的,也可以是星形的。直方图通道是平均分布在0-1800(无向)或0-3600(有向)范围内。经研究发现,采用无向的梯度和9个直方图通道,能在行人检测试验中取得最佳的效果。

    14907bf11c6f371d31a6e41caf01fa63.png

    将细胞单元组合成大的区间

    由于局部光照的变化以及前景-背景对比度的变化,使得梯度强度的变化范围非常大。这就需要对梯度强度做归一化。归一化能够进一步地对光照、阴影和边缘进行压缩。

    ed0778ed72bca3e5dc1f414a138dbc93.png

    采取的办法是:把各个细胞单元组合成大的、空间上连通的区间。这样,HOG描述符就变成了由各区间所有细胞单元的直方图成分所组成的一个向量。这些区间是互有重叠的,这就意味着:每一个细胞单元的输出都多次作用于最终的描述器。

    73ca47ba83604e13496261d17ac643c0.png

    区间有两个主要的几何形状——矩形区间(R-HOG)和环形区间(C-HOG)R-HOG区间大体上是一些方形的格子,它可以有三个参数来表征:每个区间中细胞单元的数目、每个细胞单元中像素点的数目、每个细胞的直方图通道数目。

    收集HOG特征

    把提取的HOG特征输入到SVM分类器中,寻找一个最优超平面作为决策函数。

    二、Dlib人脸图像特征提取

    1.Dlib介绍

    Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具。它广泛应用于工业界和学术界,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。Dlib的开源许可证 允许您在任何应用程序中免费使用它。

    Dlib有很长的时间,包含很多模块,近几年作者主要关注在机器学习、深度学习、图像处理等模块的开发。

    2.主要特点

    文档丰富

    与许多开源项目不同的是,Dlib为每个类和功能提供了完整和精确的文档。同时它还有调试模式,可以帮助你检查使用某个函数的先决条件。启用此功能后,它将捕获由于错误地调用函数或以不正确的方式使用对象而导致的绝大多数错误。

    提供了许多示例程序(非常有用的示例!)

    我认为文档是函数库最重要的部分。因此,如果您发现任何未记录的内容,不清楚或已过时的文档,请告诉原作者,作者会及时修复它。

    高质量的广泛兼容的代码

    好的单元测试覆盖率。代码的单元测试行与库代码行之比约为1到4。

    该库在MS Windows,Linux和Mac OS X系统上定期进行测试。事实上,它可以在任何POSIX系统上运行,并且已经在Solaris,HPUX和BSD上使用。

    没有其他软件包依赖。只需要通过开箱即用的操作系统提供的底层API。

    在使用库之前,不需要安装或配置步骤。有关详细信息,请参阅 如何编译页面。

    所有操作系统特定的代码都被隔离在尽可能小的操作系统抽象层中。库的其余部分要么在OS抽象层之上分层,要么是纯ISO标准C ++。

    三、卷积神经网络人脸图像特征提取

    1、卷积神经网络简介

    卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)”

    2、卷积神经网络结构

    1) 输入层

    卷积神经网络的输入层可以处理多维数据,常见地,一维卷积神经网络的输入层接收一维或二维数组,其中一维数组通常为时间或频谱采样;二维数组可能包含多个通道;二维卷积神经网络的输入层接收二维或三维数组;三维卷积神经网络的输入层接收四维数组.由于卷积神经网络在计算机视觉领域应用较广,因此许多研究在介绍其结构时预先假设了三维输入数据,即平面上的二维像素点和RGB通道。

    与其它神经网络算法类似,由于使用梯度下降算法进行学习,卷积神经网络的输入特征需要进行标准化处理。具体地,在将学习数据输入卷积神经网络前,需在通道或时间/频率维对输入数据进行归一化,若输入数据为像素,也可将分布于 的原始像素值归一化至 [0,1] 区间。输入特征的标准化有利于提升卷积神经网络的学习效率和表现。

    2) 隐含层

    卷积神经网络的隐含层包含卷积层、池化层和全连接层3类常见构筑,在一些更为现代的算法中可能有Inception模块、残差块(residual block)等复杂构筑。在常见构筑中,卷积层和池化层为卷积神经网络特有。卷积层中的卷积核包含权重系数,而池化层不包含权重系数,因此在文献中,池化层可能不被认为是独立的层。以LeNet-5为例,3类常见构筑在隐含层中的顺序通常为:输入-卷积层-池化层-全连接层-输出。

    卷积层

    卷积层的功能是对输入数据进行特征提取,其内部包含多个卷积核,组成卷积核的每个元素都对应一个权重系数和一个偏差量(bias vector),类似于一个前馈神经网络的神经元(neuron)。卷积层内每个神经元都与前一层中位置接近的区域的多个神经元相连,区域的大小取决于卷积核的大小,在文献中被称为“感受野”,其含义可类比视觉皮层细胞的感受野。卷积核在工作时,会有规律地扫过输入特征,在感受野内对输入特征做矩阵元素乘法求和并叠加偏差量:

    3a354e7eb8d226a586eb35af0f2ba38b.png

    池化层

    在卷积层进行特征提取后,输出的特征图会被传递至池化层进行特征选择和信息过滤。池化层包含预设定的池化函数,其功能是将特征图中单个点的结果替换为其相邻区域的特征图统计量。池化层选取池化区域与卷积核扫描特征图步骤相同,由池化大小、步长和填充控制。

    输出层

    卷积神经网络中输出层的上游通常是全连接层,因此其结构和工作原理与传统前馈神经网络中的输出层相同。对于图像分类问题,输出层使用逻辑函数或归一化指数函数(softmax function)输出分类标签。在物体识别(object detection)问题中,输出层可设计为输出物体的中心坐标、大小和分类。在图像语义分割中,输出层直接输出每个像素的分类结果。

    c806d225fe9e3cfb3042e64b35f74979.png

    展开全文
  • 该方法首先利用Canny检测算子提取原始图像的边缘信息,并据此得到低层纹理特征与颜色特征,同时利用SVR将低层特征映射到高级语义,以获得图像的高级对象语义。然后结合图像边缘线条方向,利用SVR将线条方向映射为高级...
  • 基于内容的图像特征提取系统

    千次阅读 2020-10-01 22:05:01
    随着信息化多媒体时代的到来及世界范围内Internet的发展,人们在工作和生活中越来越多的接触到大量的各种各样的图像信息。图像作为一种重要的信息载体,具有直观、内容丰富、无语言限制和便于国际交流等特点,是组成...
  • 通过研究自然景观图案的语义分类,分析了不同的核函数和参数优化算法对图像语义分类性能的影响,并用自然景观图片进行了验证。实验结果表明:当核函数为RBF且参数采用网格搜索优化时,SVM的分类效果最优,可实现对...
  • 人工智能-深度学习-基于深度学习的图像语义提取与图像检索技术研究.pdf
  • 图像语义提取与描述的研究现状及趋势,郭克华,段桂华,图像高层语义和低层视觉特征之间存在的鸿沟,是语义图像检索研究中遇到的一大难题。为了能保证图像语义提取的精度,同时避免降低
  • 人脸图像特征提取matlab代码语义分割 2019年 用于物体检测的可感知规模的三叉戟网络 李阳浩,陈云涛,王乃燕,张兆祥 () 语义实例遇到显着对象:视频语义显着实例分割研究 Trung-Nghia Le,杉本彰宏(Akihiro ...
  • 视频高层语义特征提取问题

    千次阅读 2019-12-31 22:31:57
    视频高层语义其实也是针对帧来做的,因为帧之间的连续性或者连贯性目前的确有难度,这种连续性就是指行为或者动作的识别,空间上的概念。很多都是时间上的概念,目前视频理解就是如此,复杂的动作,比如SomethingV2...
  • 视觉和声音是人类固有的感觉输入。我们的大脑是可以迅速进化我们的能力来处理视觉和听觉信号的,一些系统甚至在出生前就对刺激做出...我们已经在文本分析应用方面取得了比图像或音频更多的进展。以搜索问题为例。人们.
  • 为了进一步提升语义分割算法的性能,提出多层级的上下文信息机制,使用多层级特征对长距离的依赖关系信息和局部性较强的上下文信息进行提取,增强卷积神经网络特征的信息丰富度与类别区分度。所提多层级上下文信息机制...
  • 针对现有方法对复杂图像目标自动提取性能欠佳等不足,提出了一种新的利用多尺度语义模型的目标自动提取方法。首先,采用多尺度分割得到的图像块作为目标提取的候选区域;然后,利用语义模型获取目标的语义分布信息;...
  • 为了提高遥感图像语义分割的效果和分类精度,设计了一种结合ResNet18网络预训练模型的双通道图像特征提取网络。将多重图像特征图进行拼接,融合后的特征图具有更强的特征表达能力。同时,采用批标准化层和带有位置索引...
  • 针对室内场景下光照变化、物体相互遮挡以及类别复杂等问题,提出了一种基于双流加权Gabor卷积网络融合的彩色-深度(RGB-D)图像语义分割方法。为了获得方向和尺度不变性特征,设计了一种加权Gabor方向滤波器用于构建深度...
  • 用于从航空和卫星图像提取特征的通用生态系统 柏林航空影像,分割蒙版,建筑物轮廓,简化的GeoJSON多边形 目录 总览 RoboSat是用Python 3编写的端到端管道,用于从航空和卫星图像提取特征。 要素可以是图像中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,488
精华内容 16,195
关键字:

图像语义特征提取