图像特征提取(颜色,纹理,形状)

2023-05-16

本文主要内容转载自博客:http://blog.csdn.net/abcjennifer/article/details/7424971

                        http://blog.csdn.net/abcjennifer/article/details/7425483

                        http://blog.csdn.net/abcjennifer/article/details/7427033

1.颜色特征提取

     计算机视觉的特征提取算法研究至关重要。在一些算法中,一个高复杂度特征的提取可能能够解决问题(进行目标检测等目的),但这将以处理更多数据,需要更高的处理效果为代价。而颜色特征无需进行大量计算。只需将数字图像中的像素值进行相应转换,表现为数值即可。因此颜色特征以其低复杂度成为了一个较好的特征。

    在图像处理中,我们可以将一个具体的像素点所呈现的颜色分多种方法分析,并提取出其颜色特征分量。比如通过手工标记区域提取一个特定区域(region)的颜色特征,用该区域在一个颜色空间三个分量各自的平均值表示,或者可以建立三个颜色直方图等方法。下面我们介绍一下颜色直方图和颜色矩的概念。

(1)颜色直方图:

    颜色直方图用以反映图像颜色的组成分布,即各种颜色出现的概率。Swain和Ballard最先提出了应用颜色直方图进行图像特征提取的方法[40],首先利用颜色空间三个分量的剥离得到颜色直方图,之后通过观察实验数据发现将图像进行旋转变换、缩放变换、模糊变换后图像的颜色直方图改变不大,即图像直方图对图像的物理变换是不敏感的。因此常提取颜色特征并用颜色直方图应用于衡量和比较两幅图像的全局差。另外,如果图像可以分为多个区域,并且前景与背景颜色分布具有明显差异,则颜色直方图呈现双峰形。

    颜色直方图也有其缺点:由于颜色直方图是全局颜色统计的结果,因此丢失了像素点间的位置特征。可能有几幅图像具有相同或相近的颜色直方图,但其图像像素位置分布完全不同。因此,图像与颜色直方图得多对一关系使得颜色直方图在识别前景物体上不能获得很好的效果。

    考虑到颜色直方图的以上问题,主色调直方图便产生了。所谓主色调直方图基于假设少数几个像素的值能够表示图像中的绝大部分像素,即出现频率最高的几个像素被选为主色,仅用主色构成的主色调直方图描述一幅图像。这样的描述子并不会降低通过颜色特征进行匹配的效果,因为从某种角度将,频度出现很小的像素点可以被视为噪声。

(2)颜色矩:

     颜色矩是一种有效的颜色特征,由Stricker和Orengo提出[41],该方法利用线性代数中矩的概念,将图像中的颜色分布用其矩表示。利用颜色一阶矩(平均值Average)、颜色二阶矩(方差Variance)和颜色三阶矩(偏斜度Skewness)来描述颜色分布。与颜色直方图不同,利用颜色矩进行图像描述无需量化图像特征。由于每个像素具有颜色空间的三个颜色通道,因此图像的颜色矩有9个分量来描述。由于颜色矩的维度较少,因此常将颜色矩与其他图像特征综合使用。

(3)颜色集:

    以上两种方法通常用于两幅图像间全局或region之间的颜色比较、匹配等,而颜色集的方法致力于实现基于颜色实现对大规模图像的检索。颜色集的方法由Smith和Chang提出[42],该方法将颜色转化到HSV颜色空间后,将图像根据其颜色信息进行图像分割成若干region,并将颜色分为多个bin,每个region进行颜色空间量化建立颜色索引,进而建立二进制图像颜色索引表。为加快查找速度,还可以构造二分查找树进行特征检索。


2.纹理特征提取

      一幅图像的纹理是在图像计算中经过量化的图像特征。图像纹理描述图像或其中小块区域的空间颜色分布和光强分布。纹理特征的提取分为基于结构的方法和基于统计数据的方法。一个基于结构的纹理特征提取方法是将所要检测的纹理进行建模,在图像中搜索重复的模式。该方法对人工合成的纹理识别效果较好。但对于交通图像中的纹理识别,基于统计数据的方法效果更好。

(1)LBP特征

    LBP方法(Local binary patterns)是一个计算机视觉中用于图像特征分类的一个方法。LBP方法在1994年首先由T. Ojala, M.Pietikäinen, 和 D. Harwood 提出[43][44],用于纹理特征提取。后来LBP方法与HOG特征分类器联合使用,改善了一些数据集[45]上的检测效果。

对LBP特征向量进行提取的步骤如下:

    首先将检测窗口划分为16×16的小区域(cell),对于每个cell中的一个像素,将其环形邻域内的8个点(也可以是环形邻域多个点,如图 3‑4. 应用LBP算法的三个邻域示例所示)进行顺时针或逆时针的比较,如果中心像素值比该邻点大,则将邻点赋值为1,否则赋值为0,这样每个点都会获得一个8位二进制数(通常转换为十进制数)。然后计算每个cell的直方图,即每个数字(假定是十进制数)出现的频率(也就是一个关于每一个像素点是否比邻域内点大的一个二进制序列进行统计),然后对该直方图进行归一化处理。最后将得到的每个cell的统计直方图进行连接,就得到了整幅图的LBP纹理特征,然后便可利用SVM或者其他机器学习算法进行分类了。

(2)灰度共生矩阵

     灰度共生矩阵是另一种纹理特征提取方法,首先对于一幅图像定义一个方向(orientation)和一个以pixel为单位的步长(step),灰度共生矩阵T(N×N),则定义M(i,j)为灰度级为i和j的像素同时出现在一个点和沿所定义的方向跨度步长的点上的频率。其中N是灰度级划分数目。由于共生矩阵有方向和步长的组合定义,而决定频率的一个因素是对矩阵有贡献的像素数目,而这个数目要比总共数目少,且随着步长的增加而减少。因此所得到的共生矩阵是一个稀疏矩阵,所以灰度级划分N常常减少到8级。如在水平方向上计算左右方向上像素的共生矩阵,则为对称共生矩阵。类似的,如果仅考虑当前像素单方向(左或右)上的像素,则称为非对称共生矩阵。

[43]T. Ojala, M. Pietikäinen, and D. Harwood (1994), "Performance evaluation of texture measures with classification based on Kullback discrimination of distributions", Proceedings of the 12th IAPR International Conference on Pattern Recognition (ICPR 1994), vol. 1, pp. 582 - 585.
[44] T. Ojala, M. Pietikäinen, and D. Harwood (1996), "A Comparative Study of Texture Measures with Classification Based on Feature Distributions", Pattern Recognition, vol. 29, pp. 51-59.
[45] Xiaoyu Wang, Tony X. Han, Shuicheng Yan,"An HOG-LBP Human Detector with Partial Occlusion Handling", ICCV 2009


3.边缘特征提取

    边缘检测是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域,在一维空间中,类似的操作被称作步长检测(step detection)。边缘是一幅图像中不同屈原之间的边界线,通常一个边缘图像是一个二值图像。边缘检测的目的是捕捉亮度急剧变化的区域,而这些区域通常是我们关注的。在一幅图像中两度不连续的区域通常是以下几项之一:

# 图像深度不连续处

# 图像(梯度)朝向不连续处

# 图像光照(强度)不连续处

# 纹理变化处

    理想情况下,对所给图像应用边缘检测器可以得到一系列连续的曲线,用于表示对象的边界。因此应用边缘检测算法所得到的结果将会大大减少图像数据量,从而过滤掉很多我们不需要的信息,留下图像的重要结构,所要处理的工作即被大大简化。然而,从普通图片上提取的边缘往往被图像的分割所破坏,也就是说,检测到的曲线通常不是连续的,有一些边缘曲线段开,就会丢失边缘线段,而且会出现一些我们不感兴趣的边缘。这就需要边缘检测算法的准确性。下面介绍两个本文实现的边缘检测算法:canny算子和sobel算子进行边缘检测。

(1)Canny算子边缘检测

    Canny边缘检测算法基于一个多阶边缘算子,是由John F. Canny于1986年首先提出的[46],他不但给出了边缘检测的方法,也提出了边缘检测的计算理论。

    Canny边缘检测器使用一个基于高斯模型派生的检测模型,因为未处理图像可能含有噪声,所以开始在原始图像上应用一个高斯滤波器,结果是一个轻度平滑的图像,以至于不至于被单个噪声像素干扰全局重要参数。

    以一个5×5的高斯滤波模板为例(见公式3-7),对图像A应用高斯滤波可得B。下面对图像的光强梯度统计都基于图B。


一幅图像中的边缘可能在方向上各有所异,所以Canny算法用四个滤波器分别检测图像中的水平、垂直和对角线边缘。边缘检测器(如 Roberts, Prewitt, Sobel)值返回一个水平方向分量Gx和竖直方向分量Gy,由此边缘梯度和方向即可确定:


    所有边缘的角度都在上述选定的四个方向(0°,45°,90°,135°)周围。下一步通过滞后性门限跟踪边缘线。

与小的光强梯度相比,数值较大的光强梯度更容易作为边缘线。在大多数图像中定义一个门限值来确定光强梯度取值多少适合作为边缘线通常是不可行的,因此Canny算法使用滞后作用确定门限值。该方法使用两个门限分别定义高低边界。假设所有的边缘应该不受噪声影响而且是连续的曲线。因此我们设置一个高门限用于判定确定是边缘的曲线,再由此出发,利用方向信息跟踪那些可追踪的图像边缘。当追踪该边缘时,应用低门限可以让我们追踪那些含有边缘的区域直到找到下一个曲线的起点。

如图 3‑5所示,(a)为原图的灰度图,(b)为高斯滤波平滑图,(c)和(d)分别是手动设置的高低门限值如图所示的canny边缘检测结果。根据多组图像数据测试发现,当canny高低门限值分别设置为50,150时能够保证大部分有效信息的保留且不会有过多冗余信息。因此后文中采用门限值[Thres1,Thres2]= 50,120 作为canny边缘检测参数。Opencv中以下代码实现:

      cvCannydst,src, 50, 120, 3 );




(2)Sobel算子边缘检测

    和Canny算子类似,Sobel算子[47]也是利用梯度信息对图像进行边缘检测的。对图像进行边缘检测时,计算每个像素的梯度并给出不同方向从明到暗的最大变化及其变化率。这个结果显示出图片在该点亮度变化为“急剧”还是“平滑”,由此可以判断该区域成为边缘的概率。在实际操作中,这个成为边缘的可能性(称为magnitude)计算比计算方向更为可靠,也更为便捷。在图像中的每个像素点,梯度向量只想亮度增长最大的方向,该梯度向量的长度对应于该方向的光强变化率。这就说明在同一像素图像上一个区域的某点的sobel算子是一个零向量,而且在边缘线上的点上有一组向量值为亮度梯度。

    数学上在原图像上应用3×3的掩膜计算水平和垂直两个方向的变化梯度近似值。如果我们定义A为源图像,和分别作为一幅图像的水平近似梯度和垂直近似梯度,计算方式如下:


式3-9中,*表示二维卷积运算。这里建立的坐标系在x坐标方向向右,y坐标方向向下,在图像中的每个点,用式3-8描述总梯度大小及方向。用Sobel算子进行边缘检测结果见图 3‑6所示。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像特征提取(颜色,纹理,形状) 的相关文章

  • 第四章 智能指针

    裸指针问题如下 xff1a 裸指针在声明中并未指出 xff0c 裸指针指涉到的是单个对象还是一个数组 裸指针在声明中也没有提示是不是要对其进行虚构 换言之 xff0c 无法得知指针是否拥有其指涉的对象 或者是否空悬指针的析构是不是拥有重载的
  • dpdk无锁队列

    这篇博客是从网上博客整理摘抄而来 xff0c 具体参考的博客内容在文末给出 Linux无锁队列 kfifo概述 Linux内核中有一个先进先出的数据结构 xff0c 采用环形队列的数据结构来实现 xff0c 提供一个无边界的字节流服务 最重
  • C++虚函数和虚函数表原理

    虚函数的地址存放于虚函数表之中 运行期多态就是通过虚函数和虚函数表实现的 类的对象内部会有指向类内部的虚表地址的指针 通过这个指针调用虚函数 虚函数的调用会被编译器转换为对虚函数表的访问 xff1a ptr gt span class hl
  • 非递归快排

    非递归快排 通过使用栈来模拟函数栈的调用 xff0c 每次将首尾指针存入到栈中 xff0c 并对首尾之间区域进行快排 span class hljs preprocessor include lt iostream gt span span
  • ppt基础篇--自学笔记

    字体 给文字加边框 加背景 底纹logo 方框 加透明框 拆分 字体镂空 不规则图形 xff08 结合背景 xff09 图片 删除背景 xff08 两张叠加 xff09 点击设置透明色 xff08 背景为纯色 xff09 背景虚化 添加矩形
  • Golang Assertion

    Go中所有的类型都可以被转化成interface xff0c 通常在传入可变参数中的API中 xff0c 可变参数的类型就是interface func typeConversion strs interface ret string fo
  • 解决Idea Maven生成的jar运行出现“没有主清单属性”问题

    1 问题描述 通过maven构建了jar文件 xff0c 如图所示 2 命令窗口运行jar 提示 没有主清单属性 2 1 分析问题 在打包构建的jar目录内 xff0c 可以看到有一个MANIFEST MF文件 xff0c 如图所示 xff
  • VMWare虚拟机扩展磁盘空间(扩充root根目录空间)

    1 扩展虚拟机磁盘空间 Vm虚拟机下Linux扩展原有磁盘空间 xff0c 10G 10G的基础上不能满足需求 xff0c 只好进行磁盘扩展 调整到合适的磁盘空间 需注意以下几点 xff1a linux只能扩展磁盘容量而不能减小 xff0c
  • vim批量操作技巧

    vim批量操作技巧 目录 vim批量操作技巧一 列操作二 批量复制与删除三 批量替换四 批量注释 一 列操作 删除列 在正常模式下 xff08 一般按Esc键就是 xff09 光标定位 CTRL 43 v 进入 VISUAL BLOCK 可
  • VMware17pro图解安装 Rocky Linux 9.1

    1 引言 Rocky Linux为CentOS Linux 的继承者 RHEL 9 的复制品 下面是在VMware上安装实例 1 1 下载安装VMware VMware下载 xff1a VMware官网下载 1 2 下载Rocky9 x镜像
  • (二)Proxmox7.3 VE 安装Rocky9.1系统

    1 准备环境 PVE虚拟管理平台能正常访问 https IP 8006 由于我的服务器磁盘空间不足4G了 xff0c 这里我就安装个debian虚拟机来演示吧 xff0c 毕竟它小巧不占用地方 xff0c 主要是想记录好pve创建虚拟机的步
  • No Spring Session store is configured: set the 'spring.session.store-type'

    发现session store type使用来存放session的存储方式 xff0c 目前Spring boot中只支持Redis方式 由于本应用暂无需将session放入redis的需求 xff0c 故这里就可以将session sto
  • idea修改git账号及密码的方法

    IDEA修改git账号及密码的方法 xff1a 1 file gt settings gt passwords 这里写图片描述 默认In KeePass 保存密码 切换到Do not save forget password after r
  • KETTLE使用教程

    1 Kettle的下载与安装 kettle的最新下载地址 xff1a http community pentaho com projects data integration 由于Kettle 是采用java 编写 xff0c 因此需要在本
  • Hive lag()与lead() 函数

    lag与lead函数是跟偏移量相关的两个分析函数 xff0c 通过这两个函数可以在一次查询中取出同一字段的前N行的数据 lag 和后N行的数据 lead 作为独立的列 从而更方便地进行进行数据过滤 这种操作可以代替表的自联接 xff0c 并
  • WebService简单案例实例

    本周工作日即将结束 xff0c 下周项目经理安排了一项任务可能需要使用到webservice xff0c 但本人之前尚未使用过 xff0c 网上查了一些案例看了看 在此小记一篇留作日后回首也希望可以帮助到查看者朋友 1 什么是WebServ
  • Java中CountDownLatch介绍与应用

    正如每个Java文档所描述的那样 xff0c CountDownLatch是一个同步工具类 xff0c 它允许一个或多个线程一直等待 xff0c 直到其他线程的操作执行完后再执行 在Java并发中 xff0c countdownlatch的
  • Windows下搭建 Rust 开发环境

    Rust 支持很多的集成开发环境 xff08 IDE xff09 或开发专用的文本编辑器 查看官网公布支持的开发工具 Rust 的编译工具依赖 C 语言的编译工具 xff0c 可以使用 Microsoft C 43 43 生成工具 或者 M
  • ubuntu安装mysql错误处理

    1 错误信息 W GPG error http repo mysql com apt ubuntu xenial InRelease The following signatures were invalid KEYEXPIRED 1487
  • 如何安装 SUSE Linux Enterprise Server 15 SP4

    SUSE Enterprise Linux Server SLES 是一种现代的模块化 Linux 发行版 xff0c 主要为服务器和大型机开发 它专注于支持生产工作负载 xff0c 通常由大型组织用于托管和运行应用程序 SUSE还支持传统

随机推荐