基于灰度共生矩阵的纹理特征值提取

合集下载

基于灰度共生矩阵的纹理特征提取

基于灰度共生矩阵的纹理特征提取
wi o d d fe e tai n t g o i rn ito . h Ke wo d :txu e tx r e t r s f a rse ta t g;e t r n l ss C ・ c u e c tie y r s e tr ; e t ef au e ; e t e x c i tx u ea ay i; O o c r n emarc s u u r n
模式和 它们 的排列规 则 ,反映 了宏观意义上灰度变化
2 灰度共生矩阵的定 义
17 3年 H r l kl 9 a ai t等人提 出了用灰度共生矩 阵 c l 来描述纹 理特征 ,这是 由于纹 理是 由灰度分 布在空 间 位 置上反复交替变化而形成 的 ,因而在图像 空间中相
隔某距离 的两个像素 问一定存在一定 的灰度关系 ,称 为是 图像 中灰度 的空间相关特性 ,通过研究灰度的空
Absr c : W i ep e d i au e T x u e txtr s te m o te s n ilp o e t s o e s ra e e tr n l ssha ta t d s r a n n tr e t r , e u e i h s se t r p ri ft u f c .T xu ea ay i s a e h
的一些规律 ,图像可 以看成是不 同纹理 区域 的组合 , 纹理是对局部 区域像素之 间关系 的一种度量。纹理特 征可 用于定量描述图像 中的信息。
纹理特征提 取的主要方法有统计 方法 , 模型方法 ,
间相关性 来描述纹理 ,这就是灰度共生矩阵(的思想 2 J
基础。 灰度共生矩 阵被定义为从灰度级 i 的点离开某个
2 01 0年 第 1 9卷 第 6 期

基于灰度共生矩阵(GLCM)的图像纹理分析与提取

基于灰度共生矩阵(GLCM)的图像纹理分析与提取

基于灰度共生矩阵(GLCM)的图像纹理分析与提取重磅干货,第一时间送达灰度共生矩阵灰度共生矩阵(Gray Level CO-Occurrence Matrix-GLCM)是图像特征分析与提取的重要方法之一,在纹理分析、特征分类、图像质量评价灯方面都有很重要的应用,其基本原理图示如下:左侧是一个图像,可以看出最小的灰度级别是1,最大的灰度级别是8,共有8个灰度级别。

右侧对应的灰度共生矩阵,左上角第一行与第一列的坐标(1, 1)包含值1,原因在于水平方向上,相距一个像素值,当前像素跟水平右侧相邻像素只有一个是1、1相邻的像素值(灰度级别)对;右侧共生矩阵的原始(1, 2) = 2 说明在像素矩阵中有两个像素值1,2相邻的像素点对、以此类推得到完整的右侧灰度共生矩阵。

根据当前像素跟相邻像素位置不同,可以计算得到不同的共生矩阵,同时根据像素之间的距离不同会输出不同灰度共生矩阵。

总结来说,有如下四种不同角度的灰度共生矩阵:•0度水平方向GLCM•45度方向GLCM•90度垂直方向GLCM•135度方向GLCM根据相邻像素点之间距离参数D不同可以得到不同距离的GLCM。

此外对正常的灰度图像来说,最小灰度值为0,最大的灰度值为255,共计256个灰度级别,所以GLCM的大小为256x256,但是我们可以对灰度级别进行降维操作,比如可以每8个灰度值表示一个level这样,这样原来256x256大小的共生矩阵就可以改成256/8 * 256 /8 = 32x32的共生矩阵。

所以最终影响灰度共生矩阵生成有三个关键参数:•角度 (支持0、45、90、135)•距离(大于等于1个像素单位)•灰度级别(最大GLCM=256 x 56)GLCM实现纹理特征计算灰度共生矩阵支持如下纹理特征计算,它们是:•能量•熵值•对比度•相关性•逆分差这些纹理特征计算公式如下:上述5个是常见的GLCM的纹理特征,GLCM总计由14个特征值输出,这里就不再赘述了!感兴趣的可以自己搜索关键字GLCM。

基于灰度共生矩阵的肝脏纹理特征提取

基于灰度共生矩阵的肝脏纹理特征提取

基于灰度共生矩阵的肝脏纹理特征提取发表时间:2012-10-22T09:11:46.387Z 来源:《医药前沿》2012年第17期供稿作者:杨国城1 卢凤梅2 李美玲2 [导读] 肝脏疾病尤其是肝癌,是导致病人死亡的一个重要病症。

现代图像处理技术根据不同的图像特征来检测正常和异常肝脏的差异杨国城1 卢凤梅2 李美玲2(1泸州医学院生物医学工程系四川泸州 646000)(2电子科技大学生命科学与技术学院四川成都 610054)【摘要】本文采用共生矩阵的方法提取多幅异常肝脏CT图像的感兴趣区域(region of interest, ROI)的纹理特征,对两种病变肝脏组织——肝囊肿和肝细胞癌,以及正常肝脏进行纹理分析,对比得出。

结论异常肝脏组织的纹理比较粗,比较杂乱且模糊,而正常肝脏组织的纹理比较规则;肝囊肿组织较肝细胞癌组织局部纹理更相似、更均匀而肝细胞癌局部纹理更杂乱。

【关键词】纹理特征灰度共生矩阵肝囊肿肝细胞癌【中图分类号】R318 【文献标识码】A 【文章编号】2095-1752(2012)17-0105-02 1 引言肝脏疾病尤其是肝癌,是导致病人死亡的一个重要病症。

现代图像处理技术根据不同的图像特征来检测正常和异常肝脏的差异[1]。

基于共生矩阵提取纹理特征的方法是目前公认的比较经典的统计分析方法;纹理特征则是对肝脏进行分割和对肝脏疾病进行辅助诊断的一个重要依据,特征提取的多少及所选特征的有无代表性将直接影响后续工作的进行和诊断结果。

本文主要运用灰度共生矩阵来提取肝脏病变CT图像感兴趣区域的纹理特征,进而研究病变组织之间与正常组织的差异。

纹理分析通常包括能量,对比度,相关性,方差,逆差距,和方差,熵等14个特征参数值[2],而研究表明用能量,熵,相关性,逆差距四个特征来描述纹理,就能达到很好的效果。

2 纹理分析方法2.1灰度共生矩阵常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。

cv2灰度共生矩阵提取纹理特征向量

cv2灰度共生矩阵提取纹理特征向量

CV2灰度共生矩阵提取纹理特征向量1. 什么是灰度共生矩阵?灰度共生矩阵(Gray-Level Co-occurrence Matrix,GLCM)是用来描述图像纹理特征的一种统计方法。

它描述了图像中不同像素灰度级的空间关系和频率分布,可以用来提取图像的纹理特征。

2. GLCM的计算过程GLCM的计算过程包括: - 首先选择一个特定的偏移量和特定的方向,用来确定像素对的空间关系。

- 然后遍历整个图像,对于每个像素点,与其偏移量确定的相邻像素进行比较,计算它们之间的灰度级对出现的频率。

- 最终得到一个关于灰度级对出现频率的矩阵,即灰度共生矩阵。

3. 灰度共生矩阵的特征灰度共生矩阵提供了丰富的图像纹理信息,可以从中提取多种特征: - 对比度(Contrast):描述了图像中不同灰度级对之间的对比程度。

- 相关性(Correlation):描述了图像中不同灰度级对之间的线性相关程度。

- 能量(Energy):描述了图像中灰度级对出现的频率。

- Homogeneity:描述了图像中灰度级对在空间上的均匀程度。

4. GLCM在图像处理中的应用灰度共生矩阵提取的纹理特征向量可以应用于图像分类、目标识别、医学图像分析等领域。

通过提取图像的纹理特征,可以更准确地描述图像的特性,从而改善图像处理和分析的效果。

5. 个人观点和理解灰度共生矩阵提取纹理特征向量是图像处理中非常重要的一部分。

它不仅可以描述图像的纹理特征,还可以应用于图像识别和分类等领域,为图像处理技术的发展提供了重要的支持。

总结通过灰度共生矩阵提取纹理特征向量,我们可以更好地理解图像的纹理特征,从而在图像处理和分析中取得更好的效果。

在未来的发展中,灰度共生矩阵技术将会得到更广泛的应用,为图像处理领域带来更多的创新。

希望通过本文的介绍,您能对CV2灰度共生矩阵提取纹理特征向量有一个更加深入的理解。

以上是我撰写的关于CV2灰度共生矩阵提取纹理特征向量的文章,希望对您有所帮助。

灰度共生矩阵提取纹理特征

灰度共生矩阵提取纹理特征

灰度共生矩阵提取纹理特征Novel non-invasive distribution measurement of texture profile analysis (TPA) in salmon fillet byusing visible and near infrared hyperspectral imagingDi Wu and Da-Wen Sun论文中提到:Five spectral features (mean, standard deviation, skew, energy, and entropy) and twentytwo image texture features obtained from graylevel co-occurrence matrix (GLCM) were extracted fromhyperspectral images in this study.灰度共生矩阵提取纹理特征的实验结果分析在图像检索中, 常用的纹理特征主要有Tamura 纹理特征[ 1] 、自回归纹理模型[ 2] 、方向性特征、小波变换[ 3- 4] 和共生矩阵等形式。

这些纹理分析方法的共同点是提取了那些在特定纹理描述中最重要的特征, 突出纹理的不同方面。

其中, 灰度共生矩阵GLCM是由文献[5] 提出的一种用来分析图像纹理特征的重要方法。

目前, 基于共生矩阵的纹理检索算法被广泛应用[ 6- 9] 。

( 1) 角二阶矩ASM=i ! j !P(i,j)2;角二阶矩是灰度共生矩阵各元素的平方和,又称能量。

它是影像纹理灰度变化均一的度量, 反映了影像灰度分布均匀程度和纹理粗细度。

( 2) 对比度CON=i ! j !(i- j)2P(i,j);对比度是灰度共生矩阵主对角线附近的惯性矩, 它度量矩阵的值是如何分布和影像中局部变化的多少, 反映了影像的清晰度和纹理的沟纹深浅。

( 3) 相关CORRLN=i ! j !((ij)p(i,j))-μx μy " #/σxσy; 它度量空间灰度共生矩阵元素在行或列方向上的相似程度, 因此, 相关值大小反映了影像中局部灰度相关性。

基于灰度共生矩阵的图像纹理特征提取研究

基于灰度共生矩阵的图像纹理特征提取研究
51@9GJF9#- ,DVc5F8NQ/6/D- 696F8VFZ8/VPW8OPFPO/V8-6/D- /6Z/WZ P-O FZ8/VPW8OPFPF9c8/6V/6,8YYP-8D56&@Z8N8^DN8/F/6 Q8N9/VcDNFP-FFD8fFNP,FFZ8F8fF5N8^8PF5N8D^FZ8/VPW8/- cD6F_cND,866/-W&@Z8WNP9,D2D,,5NN8-,8VPFN/f/6568O FD8fFNP,FFZ8/VPW8 F8fF5N8^8PF5N86EZ/,Z ,P- 8^^8,F/Q8Y9D7FP/- FZ8,DVcN8Z8-6/Q8/-^DNVPF/D- 65,Z P6FZ8O/N8,F/D-O/6FP-,8P-O ,ZP-W8PVcY/F5O8D^FZ8 /VPW878FE88- FZ8c/f8YWNP9Y8Q8Y6P-O FZ8O/^^8N8-,8P-O ,ZP-W8N5Y8D^FZ86FPF/6F/,PYF8fF5N8^8PF5N8QPY586,P- P,,5NPF8Y9O86,N/78 FZ8/VPW8F8fF5N8^8PF5N86&J/V5YPF/D- 8fc8N/V8-F66ZDEFZPFFZ/6V8FZDO /6^8P6/7Y8&U9,DVcPN/-WFZ8F8fF5N8^8PF5N8QPY586D^O/^^8N8-F /VPW86/F/6,D-,Y5O8O FZPFFZ8O/^^8N8-,8P-O QPN/PF/D- N5Y86PN87P6/,PYY9,D-6/6F8-FE/FZ FZ8P,F5PYF8fF5N8^8PF5N86P-O FZ88^^8,F/Q82 -866D^FZ/6V8FZDO /6Q8N/^/8O&
关键词图像纹理灰度共生矩阵特征提取纹理特征值 中图分类号@<('$44文献标识码;

基于灰度共生矩阵的沥青路面病害雷达图像纹理特征提取研究

基于灰度共生矩阵的沥青路面病害雷达图像纹理特征提取研究

doi: 10.3969/j.issn.1673-6478.2023.04.040基于灰度共生矩阵的沥青路面病害雷达图像纹理特征提取研究杨晓美1,仰圣刚2(1. 江西赣粤高速公路工程有限责任公司,江西南昌330013;2. 华东交通大学交通运输工程学院,江西南昌330013)摘要:随着电磁波探测在道路领域的日益推广,探地雷达逐渐成为道路内部状况诊断的有效手段。

通过探地雷达设备获取的道路内部雷达图像经校零、背景去除、滤波等处理后因图像差异性较大目前没有较为统一的解释。

为了探究不同参数下的灰度共生矩阵特征对不同病害图像的适用性,本文首先通过正交试验设计对灰度共生矩阵参数进行组合,然后在不同参数下利用灰度共生矩阵算法对原始雷达图像进行特征计算,最后得到不同参数设置下对比度、逆方差、能量、熵值四种特征图像。

结果表明:当滑动窗口为11 × 11、统计方向为45°、灰度级数为8时,层间黏结不良的熵特征更为明显;滑动窗口为5 × 5、统计为方向90°、灰度级数为128时,裂缝的熵特征更为明显。

本文提出的探地雷达图像纹理特征适用性参数设置对图像分割、识别及数据增强等有一定的参考价值。

关键词:沥青路面;无损病害检测;三维探地雷达;纹理特征提取;灰度共生矩阵中图分类号:U416.2 文献标识码:A 文章编号:1673-6478(2023)04-0187-05 Research on Texture Feature Extraction of Asphalt Pavement Disease Radar ImageBased on Grayscale Symbiosis MatrixYANG Xiaomei1, YANG Shenggang2(1. Jiangxi Ganyue Expressway Engineering Co., Ltd., Nanchang Jiangxi 330013, China; 2. School ofTransportation Engineering, East China Jiaotong University, Nanchang Jiangxi 330013, China) Abstract:With the increasing promotion of electromagnetic wave detection in the road field, ground penetrating radar has gradually become an effective method for road internal condition diagnosis. There is no unified interpretation of the radar images inside the road obtained by ground penetrating radar equipment after processing such as zeroing, background removal, and filtering, due to the large differences in images. In order to explore the applicability of grayscale co-existence matrix features under different parameters to different disease images, this paper first combines the gray scale co-existence matrix parameters through orthogonal experimental design, and then uses the grayscale co-existence matrix algorithm to calculate the features of the original radar image under different parameters, and finally obtains four feature images of contrast, inverse variance, energy and entropy under different parameter settings. The results show that the entropy characteristics of poor interlayer bonding are more obvious when the sliding window is 11 × 11, the statistical direction is 45°, and the gray level is 8. The entropy characteristics of cracks are more obvious when the sliding window is 5 × 5, the statistic direction is 90°, and the gray level is 128. The parameter setting of texture feature applicability of GPR image proposed in this paper has certain reference value for image segmentation, 收稿日期:2023-02-20作者简介:杨晓美(1976-),女,江西丰城人,高级工程师,从事高速公路项目施工管理工作.()188交通节能与环保第19卷recognition and data enhancement.Key words: asphalt pavement; non-destructive disease detection; 3D ground-penetrating radar; texture feature extraction; gray scale co-occurrence matrix0引言随着公路里程数的快速增长,公路养护特别是沥青路面的养护,是当前公路管理部门面临的最主要的难题[1-2]。

基于灰度共生矩阵的纹理特征提取_概述及解释说明

基于灰度共生矩阵的纹理特征提取_概述及解释说明

基于灰度共生矩阵的纹理特征提取概述及解释说明1. 引言1.1 概述纹理特征是一种用于描述图像或物体表面细节的重要特征。

在许多领域中,如计算机视觉、图像处理和模式识别等,纹理特征的提取对于实现自动分析和识别具有重要作用。

然而,由于图像数据量庞大且复杂多样,如何从中提取出有效的纹理特征一直是一个具有挑战性的问题。

1.2 文章结构本文将着重介绍一种基于灰度共生矩阵(Gray Level Co-occurrence Matrix, GLCM)的纹理特征提取方法。

为了更好地说明该方法的原理和优势,文章将依次介绍灰度共生矩阵概念、纹理特征提取方法、应用案例与实验结果分析,并最后对整个研究工作进行总结和展望。

1.3 目的本文旨在通过对基于灰度共生矩阵的纹理特征提取方法进行概述及解释说明,帮助读者深入了解该方法的原理和应用领域。

同时,通过应用案例与实验结果分析部分的介绍,使读者更好地理解该方法在模式识别中的应用价值。

最后,本文将对研究工作进行总结和展望,为未来的应用和发展提供参考。

2. 灰度共生矩阵概念2.1 灰度共生矩阵定义灰度共生矩阵(Gray-Level Co-occurrence Matrix,简称GLCM)是一种常用的纹理分析方法,用于描述图像中像素间的灰度值关系。

其基本思想是统计图像中不同位置像素对之间的灰度值相关特征,从而表征图像纹理的统计信息。

2.2 灰度共生矩阵计算方法灰度共生矩阵的计算主要包括以下步骤:首先,选择一个特定的灰度距离和方向,根据距离和方向确定相邻像素对;然后,统计这些相邻像素对在指定灰度级别上出现次数,并构建灰度级别之间的共生矩阵;最后,根据所得到的共生矩阵可以计算出一系列反映图像纹理特征的统计量。

2.3 灰度共生矩阵特性分析通过分析灰度共生矩阵可以得到多项有关图像纹理特征的统计参数。

常见的参数包括:(1) 对比度(Contrast):反映了不同灰度级别对之间强度变化的对比程度;(2) 同质性(Homogeneity):反映了不同灰度级别对之间相邻像素对灰度值接近程度的均匀性;(3) 能量(Energy):反映了图像中不同灰度级别出现的频率或概率,即图像的复杂程度;(4) 相关性(Correlation):反映了图像中不同灰度级别对之间线性相关关系的强弱;(5) 熵(Entropy):反映了图像中不确定性和复杂性,越大表示纹理越复杂。

基于灰度共生矩阵提取地震纹理属性的研究及影响因素分析

基于灰度共生矩阵提取地震纹理属性的研究及影响因素分析

基于灰度共生矩阵提取地震纹理属性的研究及影响因素分析地层由于受到构造作用,地下流体作用的影响,会产生断层和裂缝等一系列地质构造特征,这些构造特征会在三维地震资料中呈现出强弱不同的振幅,振幅在垂向地震剖面和横向地层切片上的变化就形成了一种特殊的地震纹理特征,这些纹理特征所形成的不同区域代表了不同的地质构造。

文章将利用灰度共生矩阵方法对地震资料中的纹理属性进行提取,并对其影响因素进行分析。

标签:纹理;纹理属性;灰度共生矩阵;灰度级数;提取窗口1 概述纹理作为图形图像的一项基本特征,通常指呈现在物体表面的凹凸不平的沟纹,它反映了物体表面的粗糙度,光滑度和起伏程度。

对于纹理的定义不尽相同,普遍认为它是像素灰度按一定规律变化形成的,只有把图像分割成若干区域才能对其纹理进行研究。

同时由于自然界中的任何物体表面都会产生不尽相同的纹理,即具有不同的纹理特征,利用纹理的独有性,我们可以通过不同物体所具有的不同的纹理特征来区分不同的图像,从而将其应用于数字图像处理、计算机图形学、遥感影像、生物医学,地球物理勘探等领域。

2 地震纹理属性概述地震数据中像元的反射振幅与波形在特定方向上会发生变化,地震资料中纹理的粗细直接或间接反映了不同地质构造所形成的反射振幅的强弱。

随着几十年来油田勘探开发的深入,勘探对象已经从构造油气藏转向复杂油气藏,传统地震属性对于断距较小的小断层、裂缝以及薄储层的响应不明显,而纹理属性所具有的直观性则可以为小型地质体的识别以及薄砂体储层的预测提供一定的指导依据。

3 灰度共生矩阵原理为了弄清不同的纹理集合所揭示的地质构造特征和地震相,我们需要对地震图像进行纹理分割和纹理基元的合成。

纹理属性的提取是图像分析中一项很重要也很具有难度的工作,不少中外学者对纹理属性的提取方法进行了研究,目前,最广为人们接受的是1993年Jain提出的四大类方法:统计分析方法、模型分析方法、结构分析方法、信号处理方法[1]。

提取图像纹理特征——灰度共生矩阵

提取图像纹理特征——灰度共生矩阵

提取图像纹理特征——灰度共生矩阵摘要图像的特征提取是图像的识别和分类、基于内容的图像检索、图像数据挖掘等研究内容的基础性工作,其中图像的纹理特征对描述图像内容具有重要意义,纹理特征提取己成为目前图像领域研究的热点。

文中深入研究了基于灰度共生矩阵(GLCM)的纹理特征提取方法,给出了基于Matlab的简便实现代码,分析了共生矩阵各个构造参数对构造共生矩阵的影响。

分析结果对优化灰度共生矩阵的构造、实现基于灰度共生矩阵( GLCM)的特定图像的纹理特征提取等都具有重要参考意义。

本文分析了图像纹理的特征提取—灰度共生矩阵,是物体表而最本质的属性。

纹理特征提取是作为纹理分析的首要任务,纹理提出了用灰度共生矩阵的方法提取纹理特征,通过MA丁LAB仿真实现,结果由灰度共生矩阵产生的四个纹理特征能具有较好的鉴别能力。

关键词: 特征提取;灰度共生矩阵;纹理特征;Matlab目录1 设计目的 (1)2相关知识 (1)2.1 MATLAB简介 (1)2.2 MATLAB应用 (1)2.3 MATLAB特点 (2)3 设计方案 (3)3.1 二阶距(能量) (3)3.2 惯性矩 (4)3.3 相关 (4)3.4 熵 (4)4 程序设计 (4)5 仿真结果与分析 (10)5.1 仿真图 (10)5.2 结果分析 (17)6结论 (18)参考文献 (19)提取图像纹理特征——灰度共生矩阵1 设计目的由于纹理是由灰度分布在空间位置上反复出现而形成的,因而在图像空间中相隔某距离的两象素之间会存在一定的灰度关系,即图像中灰度的空间相关特性。

灰度共生矩阵就是一种通过研究灰度的空间相关特性来描述纹理的常用方法。

直觉上来说,如果图像的是由具有相似灰度值的像素块构成,则灰度共生矩阵的对角元素会有比较大的值;如果图像像素灰度值在局部有变化,那么偏离对角线的元素会有比较大的值。

灰度直方图是对图像上单个象素具有某个灰度进行统计的结果,而灰度共生矩阵是对图像上保持某距离的两象素分别具有某灰度的状况进行统计得到的[5]。

灰度共生矩阵纹理特征提取

灰度共生矩阵纹理特征提取

灰度共生矩阵纹理特征提取
灰度共生矩阵纹理特征提取是一种用于图像信息处理的有效方法。

它通过计算每个像素邻域中值与它自身灰度值之间的相关性而开发出
一种图像分析方法。

共生矩阵纹理特征提取就是通过利用这种方法,
将一幅图像分解为更小的小方块,从而提取出特征的过程。

由于灰度共生矩阵纹理特征提取是一种计算开销最小的图像分析
方法,因此它被广泛地应用于机器学习以及机器视觉的研究中。

一般
来说,这种方法能够提取出图像中的表面、几何和灰度纹理特征等,
从而将图像转换成一系列可利用的特征。

这些特征能够有效地帮助计
算机识别图像中的不同特征项,从而增强机器学习算法的性能。

此外,灰度共生矩阵纹理特征提取还可以用于图像分类、对比度
估计以及视觉信息量提取等应用,从而为机器视觉领域提供精确、可
靠的信息处理机制,促进机器人、自动控制和计算机视觉技术的发展。

总之,灰度共生矩阵纹理特征提取是一种有效、可靠且可行的信
息处理方法,被广泛应用于机器学习、机器视觉和其他信息处理研究
领域。

基于灰度共生矩阵的图像纹理特征提取算法研究

基于灰度共生矩阵的图像纹理特征提取算法研究

基于灰度共生矩阵的图像纹理特征提取算法研究图像纹理特征提取技术是图像处理领域中的一个重要分支,其有助于提高图像识别、分类等任务的准确性。

基于灰度共生矩阵的图像纹理特征提取算法则是其中一种重要方法,本文将围绕该技术展开探讨。

一、灰度共生矩阵概述灰度共生矩阵(Gray-Level Co-Occurrence Matrix,GLCM)是一个将像素间灰度差分布统计出来的矩阵,用于表征图像的纹理、对比度等特征。

在灰度共生矩阵中,每个元素G(i,j)表示距离为d、角度为θ时,灰度级i和灰度级j在图像中出现的概率,即GLCM(i,j)。

灰度共生矩阵中,角度θ用于控制图像锐利度。

通常情况下,我们会选择0、45、90、135度四个角度进行分析。

而距离d决定了一组像素中含有几个像素。

在进行矩阵计算时,需要选择一个合适的距离和角度值,以便提取出描述图像特征的重要信息。

二、灰度共生矩阵的计算灰度共生矩阵的计算过程,可简单归纳为以下几步:1. 将原始图像转为灰度图像;2. 根据所选的距离和角度,将灰度图像分为若干个方向的块;3. 对于每个块,计算该块内像素的灰度值及其空间关系。

在空间相同的情况下,统计不同灰度值出现的次数;4. 统计出每个灰度对出现的概率,构建灰度共生矩阵。

三、基于灰度共生矩阵的图像纹理特征提取算法基于灰度共生矩阵的图像纹理特征提取算法,主要是通过对灰度共生矩阵的处理,实现对图像纹理特征的提取。

常见的图像纹理特征包括熵、能量、对比度、均值、方差等,这些特征能够对不同的物体或背景进行区分和分类。

1. 熵熵(Entropy)是用于度量信源不确定性的一项指标。

在基于灰度共生矩阵的图像纹理特征中,熵是用于描述图像纹理复杂度的重要参数之一。

在计算熵时,根据灰度共生矩阵的式子,先统计每个灰度级出现的概率pi,再将pi带入以下式子进行计算:H=-Σ(pi*log2(pi))2. 能量能量(Energy)是描述图像统计规律性的一个参数。

基于灰度共生矩阵的纹理特征值提取

基于灰度共生矩阵的纹理特征值提取

基于灰度共生矩阵的纹理特征值提取作者:黄丽华来源:《科技视界》 2013年第22期黄丽华(南京农业大学工学院,江苏南京 210031)【摘要】图像分类识别的常用方法是先提取图像特征,再进行特征值的归类。

图像特征包括几何特征、形状特征、颜色特征、纹理特征等等。

本系统主要针对图像的纹理特征进行提取、分析,通过研究灰度的空间相关特性来描述纹理,利用灰度共生矩阵产生的四个纹理特征值使其能有效的描述相应图片的纹理特征,最后实现具有显著纹理特性的图像的分类识别。

【关键词】图像特征;灰度共生矩阵;分类识别1系统功能及工作原理1.1 系统功能简介系统使用基于统计法的灰度共生矩阵,进而提取二次统计特征量来作为区分各图像的标志,已达到对图像对象的识别。

通过CCS3.3 图像处理软件进行模拟仿真,检验相应功能是否实现。

1.2 工作原理1.2.1 灰度共生矩阵生成灰度共生矩阵被定义为从灰度级i的点离开某个固定位置关系d=(Dx,Dy)达到灰度为j的概率。

灰度共生矩阵用P(i,j)(i,j=0,1,2,…,L)表示。

其中L表示图像的灰度级,i,j分别表示像素的灰度。

d表示两个像素间的空间位置关系。

不同的d决定了两个像素间的距离和方向。

秒为灰度共生矩阵的生成方向,通常取0,45,90和135四个方向。

当两像素间的位置关系d选定后,就生成一定关系d下的灰度共生矩阵。

共生矩阵的一个元素代表了一种灰度组合下下出现的次数。

如元素P(1,0)就代表了图像上位置关系为d的两个像素灰度分别为1和0的情况出现的次数。

1.2.2 矩阵分析1)主对角线元素的作用灰度共生矩阵中主对角线上的元素是一定位置关系下的两象素同灰度组合出现的次数。

由于沿着纹理方向上相近元素的灰度基本相同,垂直纹理方向上相近象素间有较大灰度差的一般规律,因此,这些主对角线元素的大小有助于判别纹理的方向和粗细,对纹理分析起着重要的作用。

2)元素值的离散性灰度共生矩阵中元素值相对于主对角线的分布可用离散性来表示,它常常反映纹理的粗细程度。

matlab灰度共生矩阵纹理特征提取

matlab灰度共生矩阵纹理特征提取

matlab灰度共生矩阵纹理特征提取MATLAB是一种高级编程语言和交互式环境,用于数值计算、数据分析、可视化和编程。

在MATLAB中,灰度共生矩阵是一种灰度图像处理中的常用工具,可以用于提取图像的纹理特征。

本文将介绍如何使用MATLAB中的灰度共生矩阵方法提取图像的纹理特征。

第一步,读取图像文件。

在MATLAB中,可以使用imread函数读取图像文件。

例如,可以使用以下代码读取名为“lena.tif”的图像文件:img = imread('lena.tif');第二步,将图像转换为灰度图像。

由于灰度共生矩阵只能处理灰度图像,因此必须将图像转换为灰度图像。

可以使用MATLAB中的rgb2gray函数将图像从RGB格式转换为灰度格式。

例如,可以使用以下代码将图像转换为灰度图像:grayImg = rgb2gray(img);第三步,计算灰度共生矩阵。

灰度共生矩阵描述了灰度图像中相邻像素之间的灰度变化规律。

可以使用MATLAB中的graycomatrix函数计算灰度共生矩阵。

例如,可以使用以下代码计算灰度共生矩阵:glcm = graycomatrix(grayImg, 'NumLevels', 8, 'Offset', [0 1; -1 1; -1 0; -1 -1]);在graycomatrix函数中,'NumLevels'参数指定灰度级别数量,'Offset'参数指定相邻像素的偏移量。

第四步,计算灰度共生矩阵的纹理特征。

灰度共生矩阵可以用于提取图像的纹理特征,例如对比度、能量、熵和同质性等。

可以使用MATLAB中的graycoprops函数计算灰度共生矩阵的纹理特征。

例如,可以使用以下代码计算灰度共生矩阵的对比度、能量、熵和同质性:contrast = graycoprops(glcm, 'Contrast');energy = graycoprops(glcm, 'Energy');entropy = graycoprops(glcm, 'Entropy');homogeneity = graycoprops(glcm, 'Homogeneity');graycoprops函数中的第一个参数指定要计算的灰度共生矩阵,第二个参数指定要计算的纹理特征。

遥感实验——利用灰度共生矩阵提取纹理信息

遥感实验——利用灰度共生矩阵提取纹理信息

实验一利用灰度共生矩阵提取纹理信息一、实验要求1、编写灰度共生矩阵提取纹理信息的程序。

2、分别提取道路、河流、草地的纹理特征,比较它们的不同。

二、实验原理灰度共生矩阵通过对影像灰度级之间联合条件概率密度p (i ,j /d,θ)的计算表示纹理。

p (i ,j /d,θ)表示在给定空间距离d和方向θ时,灰度i为始点,出现灰度级为j的概率。

通过对图像上保持某种距离的两像素分别具有某灰度的状况进行统计而得到,描述了成堆像素的灰度组合分布,p (i ,j /d,θ)常用矩阵形式表示,称为灰度共生矩阵。

通常θ方向为:0,45,90,135,4个方向。

这样p (i ,j /d,θ)为一对称矩阵。

式中,i,j分别为两个像素的灰度;G为图像的灰度级数,d为两个像素间的位置关系,用d =(Δx ,Δy)表示,即为两个像素间在x和y方向上的距离分别为Δx,Δy不同的d决定了两像素间的距离和方向。

当两像素的位置关系选定后,可生成一定d下的灰度共生矩阵Pd为了能更直观地以共生矩阵描述纹理状况,从共生矩阵导出一些反映矩阵状况的参数,典型的有以下几种:(1)能量:是灰度共生矩阵元素值的平方和,所以也称能量,反映了图像灰度分布均匀程度和纹理粗细度。

如果共生矩阵的所有值均相等,则ASM值小;相反,如果其中一些值大而其它值小,则ASM值大。

当共生矩阵中元素集中分布时,此时ASM值大。

ASM值大表明一种较均一和规则变化的纹理模式。

(2)对比度:,其中。

反映了图像的清晰度和纹理沟纹深浅的程度。

纹理沟纹越深,其对比度越大,视觉效果越清晰;反之,对比度小,则沟纹浅,效果模糊。

灰度差即对比度大的象素对越多,这个值越大。

灰度公生矩阵中远离对角线的元素值越大,CON越大。

(3)相关:它度量空间灰度共生矩阵元素在行或列方向上的相似程度,因此,相关值大小反映了图像中局部灰度相关性。

当矩阵元素值均匀相等时,相关值就大;相反,如果矩阵像元值相差很大则相关值小。

基于灰度共生矩阵的纹理提取

基于灰度共生矩阵的纹理提取

基于灰度共⽣矩阵的纹理提取1 前⾔纹理特征在地物光谱特征⽐较相似的时候常作为⼀种特征⽤于图像的分类和信息提取。

本⽂主要介绍基于灰度共⽣矩阵的图像纹理提取。

2 灰度共⽣矩阵纹理⽯油灰度分布在空间位置上反复出现⽽形成的,因⽽图像空间中相隔某距离的两个像素之间存在⼀定的灰度关系,即图像中灰度的空间相关特性。

灰度共⽣矩阵是⼀种通过研究灰度的空间相关特性来描述纹理的常⽤⽅法。

有⼀个⽹站提供了⾮常详细的关于灰度共⽣矩阵的介绍,我在这⾥就不赘述了。

⽹址如下:3 纹理提取的算法流程本⽂重点说明⼀下遥感影像纹理提取的算法流程,如下图1所⽰:图 1 纹理提取算法流程具体描述如下:1) 灰度降级,对原始影像进⾏灰度降级如8,16,32,64等;纹理计算的灰度降级策略来源于IDL的bytscl函数介绍,具体描述如下:图 2 灰度降级2) 根据设定好的窗⼝⼤⼩,逐窗⼝计算灰度共⽣矩阵;3) 根据选择的⼆阶统计量,计算纹理值。

4 纹理算⼦协同性(GLCM_HOM):对应ENVI的Homogeneity反差性(GLCM_CON):⾮相似性(GLCM_DIS):均值GLCM_MEAN:对应ENVI的Mean⽅差GLCM_VAR:对应ENVI的Variance⾓⼆阶矩GLCM_ASM:对应ENVI的Second Moment相关性GLCM_COR:对应ENVI的CorrelationGLDV⾓⼆阶矩GLDV_ASM:熵GLCM_ENTROPY:对应ENVI的Entropy归⼀化⾓⼆阶矩GLDV_CON:对应ENVI的Contrast5 代码实现同样实现了CPU和GPU两个版本。

但是⽬前效率较低,要是有哪位⼤神可以指点下如何提⾼纹理计算的效率感激不尽~先上传头⽂件和源⽂件1#pragma once2 #include <iostream>3 #include <string>4 #include <vector>56class CCo_occurrenceTextureExtration7 {8public:9 CCo_occurrenceTextureExtration(void);10 ~CCo_occurrenceTextureExtration(void);111213 typedef enum ANGLE_TYPE14 {15 DEGREE_0,16 DEGREE_45,17 DEGREE_90,18 DEGREE_13519 };20 typedef enum LIST_TYPE21 {22 GLCM_HOM,23 GLCM_CON,24 GLCM_DIS,25 GLCM_MEAN,26 GLCM_VAR,27 GLCM_ASM,28 GLCM_COR,29 GLDV_ASM,30 GLCM_ENTROPY,31 GLDV_MEAN,32 GLDV_CON,33 };343536//影像灰度降级(包括直⽅图均衡化)37bool Init();38bool ReduceGrayLevel();39bool ExtraTextureWinEXE();40bool ExtraTexturePixEXE();41int ExtraTexturePixOpenCLEXE();42private:43char* LoadProgSource(const char* cFilename, const char* cPreamble, size_t* szFinalLength);44bool GetGrayCoocurrenceMatrix(std::vector<std::vector<int>>grayValue,45 std::vector<std::vector<float>> &grayMatrix,int &m_count);46float CalGLCMStatistics(std::vector<std::vector<float>> grayMatrix,47const int count);48double* cdf(int *h,int length);4950public:51 std::string m_strInFileName;52 std::string m_strOutFileName;53 std::string m_strReduceLevelFileName;54int m_iWidth;55int m_iHeigth;56int m_iBandCount;57int *m_BandMap;58int m_AngleMode;59int m_TextureMode;60int m_dis;61int m_grayLevel;62int m_winWidth;63int m_winHeigth;6465 };源⽂件如下:4 #include <math.h>5 #include <omp.h>6 #include <CL/cl.h>7 #include <stdlib.h>8 #include <malloc.h>9#pragma comment(lib,"OpenCL.lib")1011 CCo_occurrenceTextureExtration::CCo_occurrenceTextureExtration( )12 {13 m_BandMap = NULL;14 }15 CCo_occurrenceTextureExtration::~CCo_occurrenceTextureExtration(void)16 {17if(!m_BandMap){18delete []m_BandMap;19 }20 }2122bool CCo_occurrenceTextureExtration::Init()23 {24 GDALAllRegister();25 GDALDataset *poDS = (GDALDataset*)GDALOpen(m_strInFileName.c_str(),GA_ReadOnly);26 m_iWidth = poDS->GetRasterXSize();27 m_iHeigth = poDS->GetRasterYSize();28 m_iBandCount = poDS->GetRasterCount();2930 m_BandMap = new int[m_iBandCount];31int i = 0;32while(i < m_iBandCount){33 m_BandMap[i] = i+1;34 i++;35 }36 GDALClose((GDALDatasetH)poDS);37return TRUE;38 }3940bool CCo_occurrenceTextureExtration::ReduceGrayLevel()41 {42//直⽅图均衡化43///// 统计直⽅图44 GDALAllRegister();45 GDALDataset *poDS = (GDALDataset*)GDALOpen(m_strInFileName.c_str(),GA_ReadOnly);46double adfMSSGeoTransform[6] = {0};47 poDS->GetGeoTransform(adfMSSGeoTransform);48 GDALDataType eDT = poDS->GetRasterBand(1)->GetRasterDataType();49//创建⽂件50 GDALDriver *poOutDriver = (GDALDriver*)GDALGetDriverByName("GTIFF");51 GDALDataset *poOutDS = poOutDriver->Create(m_strReduceLevelFileName.c_str(),52 m_iWidth,m_iHeigth,m_iBandCount,GDT_Byte,NULL);53 poOutDS->SetGeoTransform(adfMSSGeoTransform);54 poOutDS->SetProjection(poDS->GetProjectionRef());55for(int i = 0;i<m_iBandCount;i++){56double *bandMINMAX = new double[2];57 GDALRasterBand *poBand = poDS->GetRasterBand(m_BandMap[i]);58 GDALRasterBand *poNewBand = poOutDS->GetRasterBand(i+1);59 poBand->ComputeRasterMinMax(FALSE,bandMINMAX);60for(int j = 0;j<m_iHeigth;j++){61double *readBuff = new double[m_iWidth];62 unsigned char*writeBuff = new unsigned char[m_iWidth];63 poBand->RasterIO(GF_Read,0,j,m_iWidth,1,readBuff,m_iWidth,1,GDT_Float64,0,0);64int k = 0;65while(k<m_iWidth){66int tmp = 0;67if(eDT == GDT_Float32 || eDT == GDT_Float64){68 tmp = int((m_grayLevel-1+0.99999)*(readBuff[k] - bandMINMAX[0])/(bandMINMAX[1] - bandMINMAX[0]));69 }else{70 tmp = int((m_grayLevel)*(readBuff[k] - bandMINMAX[0] - 1)/(bandMINMAX[1] - bandMINMAX[0]));71 }72 writeBuff[k] = unsigned char(tmp);73 k++;74 }75 CPLErr str = poNewBand->RasterIO(GF_Write,0,j,m_iWidth,1,writeBuff,m_iWidth,1,GDT_Byte,0,0);76delete []readBuff;readBuff = NULL;77delete []writeBuff;writeBuff = NULL;78 }79delete []bandMINMAX;bandMINMAX = NULL;80 }81 GDALClose((GDALDatasetH) poDS);82 GDALClose((GDALDatasetH) poOutDS);83return TRUE;84 }8586double* CCo_occurrenceTextureExtration::cdf( int *h,int length )87 {88int n = 0;89for( int i = 0; i < length - 1; i++ )90 {91 n += h[i];92 }93double* p = new double[length];94int c = h[0];98 c += h[i];99 p[i] = ( double )c / n;100 }101return p;102 }103104char* CCo_occurrenceTextureExtration::LoadProgSource( const char* cFilename, const char* cPreamble, size_t* szFinalLength ) 105 {106 FILE* pFileStream = NULL;107 size_t szSourceLength;108109// open the OpenCL source code file110 pFileStream = fopen(cFilename, "rb");111if(pFileStream == 0)112 {113return NULL;114 }115116 size_t szPreambleLength = strlen(cPreamble);117118// get the length of the source code119 fseek(pFileStream, 0, SEEK_END);120 szSourceLength = ftell(pFileStream);121 fseek(pFileStream, 0, SEEK_SET);122123// allocate a buffer for the source code string and read it in124char* cSourceString = (char *)malloc(szSourceLength + szPreambleLength + 1);125 memcpy(cSourceString, cPreamble, szPreambleLength);126if (fread((cSourceString) + szPreambleLength, szSourceLength, 1, pFileStream) != 1)127 {128 fclose(pFileStream);129free(cSourceString);130return0;131 }132133// close the file and return the total length of the combined (preamble + source) string134 fclose(pFileStream);135if(szFinalLength != 0)136 {137 *szFinalLength = szSourceLength + szPreambleLength;138 }139 cSourceString[szSourceLength + szPreambleLength] = '\0';140141return cSourceString;142 }143144bool CCo_occurrenceTextureExtration::GetGrayCoocurrenceMatrix(std::vector<std::vector<int>>grayValue,145 std::vector<std::vector<float>> &m_grayMatrix,146int &m_count)147 {148int i,j,r,c;149 m_count = 0;150int ii = 0;151152switch(m_AngleMode)153 {154case DEGREE_0:155 i = 0;156while(i<m_winHeigth){157 j = 0;158while(j<m_winWidth){159int endR = i;160int endC = j + m_dis;161if(endC < m_winWidth){162 r = grayValue[i][j];163 c = grayValue[endR][endC];164 m_grayMatrix[r][c] += 1;165 m_grayMatrix[c][r] += 1;166 m_count = m_count+2;167 }168 j++;169 }170 i++;171 }172break;173case DEGREE_45:174 i = 0;175while(i<m_winHeigth){176 j = 0;177while(j<m_winWidth){178int endR = i - m_dis;179int endC = j + m_dis;180if(endR>=0 && endR < m_winHeigth && endC >=0 && endC < m_winWidth){181 r = grayValue[i][j];182 c = grayValue[endR][endC];183 m_grayMatrix[r][c] += 1;184 m_grayMatrix[c][r] += 1;185 m_count = m_count+2;186 }187 j++;188 }192case DEGREE_90:193 i= 0;194while(i<m_winHeigth){195 j = 0;196while(j < m_winWidth){197int endR = i - m_dis;198int endC = j;199if(endR >= 0){200 r = grayValue[i][j];201 c = grayValue[endR][endC];202 m_grayMatrix[r][c] += 1;203 m_grayMatrix[c][r] += 1;204 m_count = m_count+2;205 }206 j++;207 }208 i++;209 }210break;211case DEGREE_135:212 i = 0;213while(i<m_winHeigth){214 j = 0;215while(j<m_winWidth){216int endR = i - m_dis;217int endC = j - m_dis;218if(endR >= 0 && endC >= 0){219 r = grayValue[i][j];220 c = grayValue[endR][endC];221 m_grayMatrix[r][c] += 1;222 m_grayMatrix[c][r] += 1;223 m_count = m_count+2;224 }225 j++;226 }227 i++;228 }229break;230default:231return FALSE;232 }233return TRUE;234 }235236float CCo_occurrenceTextureExtration::CalGLCMStatistics(std::vector<std::vector<float>> m_grayMatrix, 237const int m_count)238 {239int i,j,k;240float imean = 0.0f;241float jmean = 0.0f;242float ivar = 0.0f;243float jvar = 0.0f;;244float res = 0.0f;245switch(m_TextureMode)246 {247case GLCM_HOM: //同质性248 i = 0;249while(i < m_grayLevel){250 j = 0;251while(j < m_grayLevel){252if(m_grayMatrix[i][j] != 0){253float Pij = m_grayMatrix[i][j]*1.0f/m_count;254 res += Pij/(1 + (i-j)*(i-j));255 }256 j++;257 }258 i++;259 }260break;261case GLCM_CON: //对⽐度262 i = 0;263while(i < m_grayLevel){264 j = 0;265while(j < m_grayLevel){266if(m_grayMatrix[i][j] != 0){267float Pij = m_grayMatrix[i][j]*1.0f/m_count;268 res += Pij*(i-j)*(i-j);269 }270 j++;271 }272 i++;273 }274break;275case GLCM_DIS: //⾮相似性276 i = 0;277while(i < m_grayLevel){278 j = 0;279while(j < m_grayLevel){280if(m_grayMatrix[i][j] != 0){281float Pij = m_grayMatrix[i][j]*1.0f/m_count;282 res += Pij*std::abs(i-j);287 }288break;289case GLCM_COR: // 相关性290 i = 0;291while(i < m_grayLevel){292 j = 0;293while(j < m_grayLevel){294if(m_grayMatrix[i][j] != 0){295float Pij = m_grayMatrix[i][j]*1.0f/m_count;296 imean += Pij * i;297 jmean += Pij * j;298 }299 j++;300 }301 i++;302 }303// var304 i = 0;305while(i < m_grayLevel){306 j = 0;307while(j < m_grayLevel){308if(m_grayMatrix[i][j] != 0){309float Pij = m_grayMatrix[i][j]*1.0f/m_count;310 ivar += Pij * (i - imean)*(i - imean);311 jvar += Pij * (j - imean)*(j - imean);312 }313 j++;314 }315 i++;316 }317// xiangguanx318 i = 0;319while(i < m_grayLevel){320 j = 0;321while(j < m_grayLevel){322if(m_grayMatrix[i][j] != 0){323float Pij = m_grayMatrix[i][j]*1.0f/m_count;324 res += (Pij *(i - imean)*(j - jmean))/sqrt(ivar*jvar); 325 }326 j++;327 }328 i++;329 }330break;331case GLCM_MEAN: // 均值332 i = 0;333while(i < m_grayLevel){334 j = 0;335while(j < m_grayLevel){336if(m_grayMatrix[i][j] != 0){337float Pij = m_grayMatrix[i][j]*1.0f/m_count;338 imean += Pij * i;339//jmean += Pij * j;340 }341 j++;342 }343 i++;344 }345 res = imean;346break;347case GLCM_VAR: // ⽅差348// mean349 i = 0;350while(i < m_grayLevel){351 j = 0;352while(j < m_grayLevel){353if(m_grayMatrix[i][j] != 0){354float Pij = m_grayMatrix[i][j]*1.0f/m_count;355 imean += Pij * i;356 }357 j++;358 }359 i++;360 }361// var362 i = 0;363while(i < m_grayLevel){364 j = 0;365while(j < m_grayLevel){366if(m_grayMatrix[i][j] != 0){367float Pij = m_grayMatrix[i][j]*1.0f/m_count;368 ivar += Pij * (i - imean)*(i - imean);369 }370 j++;371 }372 i++;373 }374//res = (ivar + jvar)/2;375 res = ivar;376break;381while(j < m_grayLevel){382if(m_grayMatrix[i][j] != 0){383float Pij = m_grayMatrix[i][j]*1.0f/m_count;384 res += Pij*Pij;385 }386 j++;387 }388 i++;389 }390break;391case GLCM_ENTROPY: // 熵392 i = 0;393while(i < m_grayLevel){394 j = 0;395while(j < m_grayLevel){396if(m_grayMatrix[i][j] != 0){397float Pij = m_grayMatrix[i][j]*1.0f/m_count;398 res += -1.0f*Pij * log(Pij);399 }400 j++;401 }402 i++;403 }404break;405case GLDV_MEAN:406 k = 0;407while(k<m_grayLevel){408 i = 0;409while(i < m_grayLevel){410 j = 0;411while(j < m_grayLevel){412if(m_grayMatrix[i][j] != 0 && std::abs(i-j)== k){413float Pij = m_grayMatrix[i][j]*1.0f/m_count;414 res += Pij*k;415 }416 j++;417 }418 i++;419 }420 k++;421 }422break;423case GLDV_CON:424 k = 0;425while(k<m_grayLevel){426 i = 0;427while(i < m_grayLevel){428 j = 0;429while(j < m_grayLevel){430if(m_grayMatrix[i][j] != 0 && std::abs(i-j)== k){431float Pij = m_grayMatrix[i][j]*1.0f/m_count;432 res += Pij*k*k;433 }434 j++;435 }436 i++;437 }438 k++;439 }440break;441case GLDV_ASM:442 k = 0;443while(k<m_grayLevel){444 i = 0;445while(i < m_grayLevel){446 j = 0;447while(j < m_grayLevel){448if(m_grayMatrix[i][j] != 0 && std::abs(i-j)== k){449float Pij = m_grayMatrix[i][j]*1.0f/m_count;450 res += Pij*Pij;451 }452 j++;453 }454 i++;455 }456 k++;457 }458break;459 }460return res;461 }462463bool CCo_occurrenceTextureExtration::ExtraTextureWinEXE()464 {465//读影像466 GDALAllRegister();467 GDALDataset *poDS = (GDALDataset*)GDALOpen(m_strReduceLevelFileName.c_str(),GA_ReadOnly); 468if(!poDS){469return FALSE;470 }475 GDALDriver *poOutDriver = (GDALDriver*)GDALGetDriverByName("GTIFF");476 GDALDataset *poOutDS = poOutDriver->Create(m_strOutFileName.c_str(),477 m_iWidth,m_iHeigth,m_iBandCount,GDT_Float32,NULL);478 poOutDS->SetGeoTransform(adfMSSGeoTransform);479 poOutDS->SetProjection(poDS->GetProjectionRef());480int b = 0;481while(b<m_iBandCount){482 GDALRasterBand *poBand = poDS->GetRasterBand(b+1);483 GDALRasterBand *poNewBand = poOutDS->GetRasterBand(b+1);484int i = 0;485while(i<m_iHeigth){486int startR = i;487int endR = startR + m_winHeigth - 1;488if(endR > m_iHeigth-1){489 endR = m_iHeigth - 1;490 startR = endR - m_winHeigth + 1;491 }492 unsigned char *readBuff = new unsigned char[m_iWidth * m_winHeigth];493float *writeBuff = new float[m_iWidth* m_winHeigth];494 poBand->RasterIO(GF_Read,0,startR,m_iWidth,m_winHeigth,readBuff,m_iWidth,495 m_winHeigth,GDT_Byte,0,0);496497int j = 0;498while(j < m_iWidth){499int startC = j;500int endC = startC + m_winWidth - 1;501if(endC > m_iWidth - 1){502 endC = m_iWidth - 1;503 startC = endC - m_winWidth + 1;504 }505 std::vector<std::vector<int>> grayValue;506 grayValue = std::vector<std::vector<int>>(m_winHeigth,std::vector<int>(m_winWidth,0));507 std::vector<std::vector<float>> grayMatrix;508 grayMatrix = std::vector<std::vector<float>>(m_grayLevel,std::vector<float>(m_grayLevel,0.0f)); 509int k = 0;510while(k < m_winHeigth){511int l = 0 ;512while(l < m_winWidth){513 grayValue[k][l] = int(readBuff[k*m_iWidth +startC+l]);514 l++;515 }516 k++;517 }518int count = 0;519if(!GetGrayCoocurrenceMatrix(grayValue,grayMatrix,count)){520return FALSE;521 }522float tmp = CalGLCMStatistics(grayMatrix,count);523 k = 0;524while(k < m_winHeigth){525int l = 0 ;526while(l < m_winWidth){527 writeBuff[k*m_iWidth +startC+l] = tmp;528 l++;529 }530 k++;531 }532 j = j + m_winWidth;533 }534 poNewBand->RasterIO(GF_Write,0,startR,m_iWidth,m_winHeigth,writeBuff,m_iWidth,535 m_winHeigth,GDT_Float32,0,0);536//更新灰度共⽣矩阵537delete []readBuff;readBuff = NULL;538delete []writeBuff;writeBuff = NULL;539 i = i + m_winHeigth;540 }541 b++;542 }543 GDALClose((GDALDatasetH)poDS);544 GDALClose((GDALDatasetH)poOutDS);545return TRUE;546 }547548bool CCo_occurrenceTextureExtration::ExtraTexturePixEXE()549 {550//读影像551 GDALAllRegister();552 GDALDataset *poDS = (GDALDataset*)GDALOpen(m_strReduceLevelFileName.c_str(),GA_ReadOnly); 553if(!poDS){554return FALSE;555 }556double adfMSSGeoTransform[6] = {0};557 poDS->GetGeoTransform(adfMSSGeoTransform);558//创建⽂件559 GDALDriver *poOutDriver = (GDALDriver*)GDALGetDriverByName("GTIFF");560 GDALDataset *poOutDS = poOutDriver->Create(m_strOutFileName.c_str(),561 m_iWidth,m_iHeigth,m_iBandCount,GDT_Float32,NULL);562 poOutDS->SetGeoTransform(adfMSSGeoTransform);563 poOutDS->SetProjection(poDS->GetProjectionRef());564int nLineSpace,nPixSpace,nBandSpace;568569int iNumRow = 128; // 分块读取的⾏数570int overloadPix = m_winHeigth-1;571if(m_iHeigth < iNumRow && m_iHeigth > m_winHeigth){572 iNumRow = m_winHeigth;573 }574if(m_iHeigth < m_winHeigth){575return FALSE;576 }577int loopNum = (m_iHeigth + iNumRow - 1)/(iNumRow - overloadPix);578float stepProcess = 100.0f/(100.0f*loopNum*(iNumRow - overloadPix));579580for(int i = 0;i<loopNum;i++){581int tmpRowNum = iNumRow;582int startR = i*iNumRow - i*(overloadPix/2);583if(startR < 0)584 {585 startR = 0;586 }587int endR = startR + tmpRowNum - 1;588if(endR > m_iHeigth -1 ){589 endR = m_iHeigth -1;590 tmpRowNum = endR - startR + 1;591 }592 unsigned char *readBuff = new unsigned char[tmpRowNum*m_iWidth*m_iBandCount];593float *writeBuff = new float[m_iWidth*m_iBandCount*(tmpRowNum - overloadPix)];594 poDS->RasterIO(GF_Read,0,startR,m_iWidth,tmpRowNum,readBuff,m_iWidth,595 tmpRowNum,GDT_Byte,m_iBandCount,m_BandMap,nPixSpace,nLineSpace,nBandSpace);596597for(int iR = overloadPix/2;iR < tmpRowNum - overloadPix/2;iR++)598 {599// zhuyong 2016 10 17600#pragma omp parallel for num_threads(2)601for(int j = 0;j < m_iWidth;j++)602 {603int startC = j - m_winWidth/2;604int endC = j + m_winWidth/2;605if(startC<0){606 startC = 0;607 endC = startC + m_winWidth -1;608 }609if(endC > m_iWidth-1){610 endC = m_iWidth -1;611 startC = endC - m_winWidth +1;612 }613// 波段计算614int b = 0;615while(b < m_iBandCount){616// 获取灰度值617 std::vector<std::vector<int>> grayValue;618 grayValue = std::vector<std::vector<int>>(m_winHeigth,std::vector<int>(m_winWidth,0));619 std::vector<std::vector<float>> grayMatrix;620 grayMatrix = std::vector<std::vector<float>>(m_grayLevel,std::vector<float>(m_grayLevel,0.0f));621int k = 0;622while(k < m_winHeigth){623int l = 0 ;624while(l < m_winWidth){625 grayValue[k][l] = int(readBuff[(iR - overloadPix/2 + k)*m_iWidth*m_iBandCount + b*m_iWidth + startC+l]);626 l++;627 }628 k++;629 }630int count = 0;631if(!GetGrayCoocurrenceMatrix(grayValue,grayMatrix,count)){632 }633float tmp = CalGLCMStatistics(grayMatrix,count);634 writeBuff[(iR- overloadPix/2)*m_iWidth*m_iBandCount+ b*m_iWidth + j] = tmp;635 b++;636 }637 }638 }639 poOutDS->RasterIO(GF_Write,0,startR+overloadPix/2,m_iWidth,tmpRowNum - overloadPix,writeBuff,640 m_iWidth,tmpRowNum - overloadPix,GDT_Float32,m_iBandCount,m_BandMap,nPixSpace,sizeof(float)*m_iWidth*m_iBandCount, 641sizeof(float)*m_iWidth);642delete []readBuff;readBuff = NULL;643delete []writeBuff;writeBuff = NULL;644 }645646 GDALClose((GDALDatasetH)poDS);647 GDALClose((GDALDatasetH)poOutDS);648return TRUE;649 }650651int CCo_occurrenceTextureExtration::ExtraTexturePixOpenCLEXE()652 {653//读影像654 GDALAllRegister();655 GDALDataset *poDS = (GDALDataset*)GDALOpen(m_strReduceLevelFileName.c_str(),GA_ReadOnly);656if(!poDS){657return FALSE;658 }662 GDALDriver *poOutDriver = (GDALDriver*)GDALGetDriverByName("GTIFF");663 GDALDataset *poOutDS = poOutDriver->Create(m_strOutFileName.c_str(),664 m_iWidth,m_iHeigth,m_iBandCount,GDT_Float32,NULL);665 poOutDS->SetGeoTransform(adfMSSGeoTransform);666 poOutDS->SetProjection(poDS->GetProjectionRef());667668int nLineSpace,nPixSpace,nBandSpace;669 nLineSpace = sizeof(unsigned char)*m_iWidth*m_iBandCount;670 nPixSpace = 0;671 nBandSpace = sizeof(unsigned char)*m_iWidth;672673int iNumRow = 32; // 分块读取的⾏数674int overloadPix = m_winHeigth-1;675if(m_iHeigth < iNumRow && m_iHeigth > m_winHeigth){676 iNumRow = m_winHeigth;677 }678if(m_iHeigth < m_winHeigth){679return FALSE;680 }681int loopNum = ceil((m_iHeigth*1.0f - iNumRow)/(iNumRow - overloadPix)) + 1;682683// OpenCL部分 =============== 1 创建平台684 cl_uint num_platforms;685 cl_int ret = clGetPlatformIDs(0,NULL,&num_platforms);686if(ret != CL_SUCCESS || num_platforms < 1){687 printf("clGetPlatformIDs Error\n");688return -1;689 }690 cl_platform_id platform_id = NULL;691 ret = clGetPlatformIDs(1,&platform_id,NULL);692if(ret != CL_SUCCESS){693 printf("clGetPlatformIDs Error2\n");694return -1;695 }696697// OpenCL部分 =============== 2 获得设备698 cl_uint num_devices;699 ret = clGetDeviceIDs(platform_id,CL_DEVICE_TYPE_GPU,0,NULL,700 &num_devices);701if(ret != CL_SUCCESS || num_devices < 1){702 printf("clGetDeviceIDs Error\n");703return -1;704 }705 cl_device_id device_id;706 ret = clGetDeviceIDs(platform_id,CL_DEVICE_TYPE_GPU,1,&device_id,NULL);707if(ret != CL_SUCCESS){708 printf("clGetDeviceIDs Error2\n");709return -1;710 }711712// OpenCL部分 =============== 3 创建Context713 cl_context_properties props[] = {CL_CONTEXT_PLATFORM,714 (cl_context_properties)platform_id,0};715 cl_context context = NULL;716 context = clCreateContext(props,1,&device_id,NULL,NULL,&ret);717if(ret != CL_SUCCESS || context == NULL){718 printf("clCreateContext Error\n");719return -1;720 }721722// OpenCL部分 =============== 4 创建Command Queue723 cl_command_queue command_queue = NULL;724 command_queue = clCreateCommandQueue(context,device_id,0,&ret);725if(ret != CL_SUCCESS || command_queue == NULL){726 printf("clCreateCommandQueue Error\n");727return -1;728 }729730// OpenCL部分 =============== 6 创建编译Program731const char *strfile = "D:\\PIE3\\src\\Test\\TextOpecCLResample\\TextOpecCLResample\\Co_occurrenceMatrixKernel.txt"; 732 size_t lenSource = 0;733char *kernelSource = LoadProgSource(strfile,"",&lenSource);734 cl_program *programs = (cl_program *)malloc(loopNum*sizeof(cl_program));735 memset(programs,0,sizeof(cl_program)*loopNum);736737 cl_kernel *kernels = (cl_kernel*)malloc(loopNum*sizeof(cl_kernel));738 memset(kernels,0,sizeof(cl_kernel)*loopNum);739740int startR = 0;741for(int i = 0;i<loopNum;i++)742 {743int tmpRowNum = iNumRow;744if(startR < 0)745 {746 startR = 0;747 }748int endR = startR + tmpRowNum - 1;749if(endR > m_iHeigth -1 ){750 endR = m_iHeigth -1;751 tmpRowNum = endR - startR + 1;752 }753 unsigned char *readBuff = new unsigned char[tmpRowNum*m_iWidth*m_iBandCount];754float *writeBuff = new float[m_iWidth*m_iBandCount*(tmpRowNum - overloadPix)];756 tmpRowNum,GDT_Byte,m_iBandCount,m_BandMap,nPixSpace,nLineSpace,nBandSpace);757758// OpenCL部分 =============== 5 创建Memory Object759 cl_mem mem_read = NULL;760 mem_read = clCreateBuffer(context,CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR,761sizeof(cl_uchar)*tmpRowNum*m_iWidth*m_iBandCount,readBuff,&ret);762if(ret != CL_SUCCESS || NULL == mem_read){763 printf("clCreateBuffer Error\n");764return -1;765 }766767 cl_mem mem_write = NULL;768 mem_write = clCreateBuffer(context,CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR,769sizeof(cl_float)*m_iWidth*m_iBandCount*(tmpRowNum - overloadPix),writeBuff,&ret);770if(ret != CL_SUCCESS || NULL == mem_write){771 printf("clCreateBuffer Error\n");772return -1;773 }774775// OpenCL部分 =============== 6 创建编译Program776//const char *strfile = "D:\\PIE3\\src\\Test\\TextOpecCLResample\\TextOpecCLResample\\Co_occurrenceMatrixKernel.txt"; 777//size_t lenSource = 0;778//char *kernelSource = LoadProgSource(strfile,"",&lenSource);779//cl_program program = NULL;780 programs[i] = clCreateProgramWithSource(context,1,(const char**)&kernelSource,781 NULL,&ret);782if(ret != CL_SUCCESS || NULL == programs[i]){783 printf("clCreateProgramWithSource Error\n");784return -1;785 }786 ret = clBuildProgram(programs[i],1,&device_id,NULL,NULL,NULL);787if(ret != CL_SUCCESS){788char* build_log;789 size_t log_size;790//查询⽇志的⼤⼩791 clGetProgramBuildInfo(programs[i], device_id, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);792 build_log = new char[log_size+1];793//获得编译⽇志信息794 ret = clGetProgramBuildInfo(programs[i], device_id, CL_PROGRAM_BUILD_LOG, log_size, build_log, NULL);795 build_log[log_size] = '\0';796 printf("%s\n",build_log);797 printf("编译失败!");798delete []build_log;799return -1;800 }801802// OpenCL部分 =============== 7 创建Kernel803//cl_kernel kernel = NULL;804 kernels[i] = clCreateKernel(programs[i],"Co_occurrenceMatrixKernel",&ret);805if(ret != CL_SUCCESS || NULL == kernels[i]){806 printf("clCreateProgramWithSource Error\n");807return -1;808 }809810// OpenCL部分 =============== 8 设置Kernel参数811 ret = clSetKernelArg(kernels[i],0,sizeof(cl_mem),&mem_read);812 ret |= clSetKernelArg(kernels[i],1,sizeof(cl_mem),&mem_write);813 ret |= clSetKernelArg(kernels[i],2,sizeof(cl_int),&m_iHeigth);814 ret |= clSetKernelArg(kernels[i],3,sizeof(cl_int),&m_iWidth);815 ret |= clSetKernelArg(kernels[i],4,sizeof(cl_int),&m_iBandCount);816 ret |= clSetKernelArg(kernels[i],5,sizeof(cl_int),&tmpRowNum);817 ret |= clSetKernelArg(kernels[i],6,sizeof(cl_int),&overloadPix);818 ret |= clSetKernelArg(kernels[i],7,sizeof(cl_int),&m_grayLevel);819 ret |= clSetKernelArg(kernels[i],8,sizeof(cl_int),&m_winHeigth);820 ret |= clSetKernelArg(kernels[i],9,sizeof(cl_int),&m_winWidth);821 ret |= clSetKernelArg(kernels[i],10,sizeof(cl_int),&m_dis);822 ret |= clSetKernelArg(kernels[i],11,sizeof(cl_int),&m_AngleMode);823 ret |= clSetKernelArg(kernels[i],12,sizeof(cl_int),&m_TextureMode);824if(ret != CL_SUCCESS){825 printf("clSetKernelArg Error\n");826return -1;827 }828829// OpenCL部分 =============== 9 设置Group Size830 cl_uint work_dim = 2;831 size_t global_work_size[] = {m_iWidth,tmpRowNum};832 size_t *local_work_size = NULL;833834// OpenCL部分 =============== 10 执⾏内核835 ret = clEnqueueNDRangeKernel(command_queue,kernels[i],work_dim,NULL,global_work_size,836 local_work_size,0,NULL,NULL);837 ret |= clFinish(command_queue);838if(ret != CL_SUCCESS){839 printf("clEnqueueNDRangeKernel Error\n");840return -1;841 }842843 writeBuff = (float*)clEnqueueMapBuffer(command_queue,mem_write,CL_TRUE,CL_MAP_READ | CL_MAP_WRITE, 8440,sizeof(cl_float)*m_iWidth*m_iBandCount*(tmpRowNum - overloadPix),0,NULL,NULL,&ret);845//ret = clEnqueueReadBuffer(command_queue,mem_resample,CL_TRUE,0,846// sizeof(cl_float)*tmpRowNum*resampleWidth*mssBandCount,(void*)resampleBuf,0,NULL,NULL);847if(ret != CL_SUCCESS){848 printf("clEnqueueMapBuffer Error\n");。

python灰度共生矩阵提取纹理特征

python灰度共生矩阵提取纹理特征

Python灰度共生矩阵提取纹理特征1.介绍在计算机视觉和图像处理领域,纹理特征是用来描述图像中物体表面细节的重要特征之一。

纹理特征可以提供关于图像物体的结构、形状、纹理、模式等信息。

其中,灰度共生矩阵(Gray Level Co-occurrence Matrix, GLCM)是一种常见的用于提取纹理特征的方法。

2.灰度共生矩阵概述灰度共生矩阵是通过计算图像中不同像素对之间的关系统计信息,来表示图像纹理特征的方法之一。

它的原理是统计图像中某一像素与其相邻指定距离和指定方向的像素对之间的灰度级组合出现的频率。

灰度共生矩阵通常是一个对称的二维矩阵,其维度取决于图像的灰度级数目。

每个矩阵元素表示了对应灰度级组合出现的频率。

常用的灰度共生矩阵特征包括:能量(Energy)、对比度(Contrast)、相关性(Correlation)和熵(Entropy)等。

3.Python中的灰度共生矩阵提取纹理特征Python提供了丰富的图像处理库和工具,用于实现灰度共生矩阵的计算和纹理特征的提取。

下面是使用Python进行灰度共生矩阵和纹理特征提取的基本步骤和代码示例:我们需要加载图像并将其转换为灰度图像,这可以通过使用Python的图像处理库如OpenCV或PIL来实现。

以下是加载图像并转换为灰度图像的示例代码:import cv2# 读取图像image = cv2.imread('image.jpg')# 转换为灰度图像gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)接下来,我们可以使用灰度图像计算灰度共生矩阵,并提取纹理特征。

对于灰度图像的灰度共生矩阵计算,可以使用Python的skimage库或Mahotas库。

以下是计算灰度共生矩阵的示例代码:import numpy as npfrom skimage.feature import greycomatrix, greycoprops# 计算灰度共生矩阵glcm = greycomatrix(gray_image, [1], [0], levels=256, symmetric=True, normed=T rue)# 提取纹理特征 - 能量energy = greycoprops(glcm, 'energy')# 提取纹理特征 - 对比度contrast = greycoprops(glcm, 'contrast')# 提取纹理特征 - 相关性correlation = greycoprops(glcm, 'correlation')# 提取纹理特征 - 熵entropy = greycoprops(glcm, 'homogeneity')我们可以将提取到的纹理特征进行进一步的分析、处理和应用。

SAR图像纹理特征提取

SAR图像纹理特征提取

SAR 图像纹理特征提取1.基于灰度共生矩阵的纹理特征灰度共生矩阵表示了灰度的空间依赖关系,能够很好地反映纹理中灰度级空间相关性的 规律。

灰度共生矩阵被定义为从灰度为的像素点离开某一个固定位置关系的点上的灰度为的式中,表示集合的势,显然[为L X 的矩阵。

若(r 与间距离为,两者与坐标横轴的夹角为',则可以得到各种间距及角度的灰度共生矩阵 ],'I N I : o 由于灰度共生矩阵表示了图像中相距 的两个灰度级像素同时出现的联合概 率分布,因此,以灰度共生矩阵为基础的纹理特征是一种有效的纹理表示方法。

灰度共生矩阵不仅是角与相邻分解单元之间的函数, 而且是距离与相邻分解单元之间的函数。

对于距离为的像素i 与像素i,通常有4个角度:0 °、45°、90°、135。

因而得到 4各方向的矩阵。

为了降低运算复杂度, 在计算灰度共生矩阵前, 首先对图像进行直方图规则化, 将灰度概率(或频度)。

它不仅反映灰度的分布特性, 布特性,是有关图像灰度变换的二阶统计特征。

关于方向、相邻间隔、变换幅度的综合信息, 础。

设【v 为一幅二维数字图像,其大小为 系的灰度共生矩阵为也反映了具有同样灰度的像素之间的位置分一幅图像的灰度共生矩阵能反映出图像灰度 它是分析图像的局部模式和它们排列规则的基 帥蚀黑;像素,灰度级为,则满足一定空间关级将至16个灰度级,并构造共生矩阵。

依据灰度共生矩阵,提出了 14种统计量:角二阶矩、 对比度、相关、均方和、逆差分矩、和平均、和方差、和熵、熵、差方差、差熵、最大相关 系数、两个相关性信息测度。

可以只选择某一距离,某一角度的灰度共生矩阵,得到14种 统计量,也可考虑 4种方向的平均。

2.基于灰度-梯度共生矩阵的纹理特征灰度共生矩阵虽然能够很好地表示一种纹理模式下的像素灰度的空间关系,但它并不能 反映边缘信息。

灰度-梯度共生矩阵法师灰度级直方图和边缘梯度直方图的结合,它考虑的是像素级和边缘梯度大小的联合统计分布。

灰度共生矩阵提取纹理特征的实验结果分析

灰度共生矩阵提取纹理特征的实验结果分析

灰度共生矩阵提取纹理特征的实验结果分析一、本文概述本文旨在探讨灰度共生矩阵(Gray Level Co-occurrence Matrix, GLCM)在提取图像纹理特征方面的应用及其实验结果分析。

灰度共生矩阵是一种经典的纹理分析方法,通过统计图像中像素对在不同方向、不同距离上的灰度共生情况,揭示图像的纹理信息。

本文首先介绍了灰度共生矩阵的基本原理和计算方法,然后详细阐述了实验设计、数据处理过程以及结果分析方法。

实验部分采用了多种不同类型的图像样本,包括自然纹理、人工纹理等,以验证灰度共生矩阵在提取不同纹理特征时的有效性和鲁棒性。

对实验结果进行了详细的分析和讨论,探讨了灰度共生矩阵在不同纹理特征提取中的优势和局限性,为后续的纹理分析和图像识别工作提供了有益的参考和借鉴。

二、灰度共生矩阵理论基础灰度共生矩阵(Gray Level Co-occurrence Matrix, GLCM)是一种用于描述图像局部纹理特性的统计方法。

它基于像素间的空间关系,通过计算图像中不同位置和方向上的像素对出现的频率来构建共生矩阵,进而提取纹理特征。

定义像素对的位置和方向:需要确定像素对之间的相对位置和方向。

常见的方向有0°、45°、90°和135°,这些方向能够覆盖图像的大部分纹理特征。

计算像素对出现的频率:对于给定的方向和位置,统计图像中所有满足条件的像素对出现的次数。

这些条件通常包括像素对的灰度级和相对位置。

构建共生矩阵:将统计得到的频率值填入一个矩阵中,该矩阵的行和列分别对应像素对的灰度级。

这样,矩阵中的每个元素都表示特定灰度级组合出现的频率。

通过灰度共生矩阵,可以提取出多种纹理特征,如能量、对比度、熵等。

这些特征能够反映图像的纹理复杂度、均匀性和方向性等。

例如,能量特征描述了图像纹理的均匀程度,对比度特征反映了图像的清晰度和局部变化程度,而熵特征则衡量了图像纹理的复杂性和随机性。

python灰度共生矩阵提取纹理特征

python灰度共生矩阵提取纹理特征

python灰度共生矩阵提取纹理特征标题:Python中的灰度共生矩阵:纹理特征提取的强大工具摘要:纹理是图像中的一个重要特征,它可以传达图像的表面细节和结构信息。

在计算机视觉和图像处理领域,提取图像的纹理特征对于模式识别、图像分类以及医学图像分析等应用具有重要意义。

在本文中,我们将探索Python中的一种强大工具——灰度共生矩阵(GLCM)及其在图像处理中的应用。

通过GLCM,我们可以从图像中提取出更加丰富的纹理特征,进一步分析和理解图像。

引言:纹理特征在计算机视觉中扮演着重要的角色,因为它们可以帮助我们识别和描述图像中的表面细节和结构。

与其他特征相比,纹理特征可以提供更多关于图像中物体或场景的信息,从而更好地支持图像分析和理解。

然而,提取和描述纹理特征是一项复杂且具有挑战性的任务。

在Python中,我们可以使用灰度共生矩阵(GLCM)来提取和描述图像的纹理特征。

GLCM是一种二维矩阵,它通过统计图像中邻接像素对的出现频率来捕捉图像的纹理信息。

通过计算GLCM中的统计特征,如对比度、能量、熵和相关性等,我们可以量化图像中的纹理特征,并利用这些特征进行后续的分析和处理。

本文将介绍GLCM的定义和原理,然后详细探讨在Python中如何实现GLCM的计算和纹理特征的提取。

我们还将讨论如何调整GLCM计算的参数,以获得更好的纹理特征描述。

我们将分享一些关于纹理特征在图像处理中的应用实例,如图像分类和医学图像分析,以展示GLCM的潜力和优势。

正文:1. 灰度共生矩阵(GLCM)的定义和原理1.1 定义:GLCM是一个二维矩阵,用于捕捉图像中邻接像素对的出现频率。

1.2 原理:GLCM利用图像中像素对的出现频率来描述图像的纹理特征。

2. 在Python中计算GLCM2.1 图像的灰度化处理2.2 计算邻接像素对的出现频率2.3 构建GLCM矩阵3. 提取纹理特征3.1 对比度3.2 能量3.3 熵3.4 相关性4. 调整GLCM的计算参数4.1 邻域大小4.2 方向角度5. 纹理特征的应用实例5.1 图像分类5.2 医学图像分析总结与回顾:纹理特征在图像处理和计算机视觉中起着重要的作用,而灰度共生矩阵(GLCM)作为一种强大的工具,可以帮助我们从图像中提取纹理特征并描述图像的表面细节和结构。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于灰度共生矩阵的纹理特征值提取
【摘要】图像分类识别的常用方法是先提取图像特征,再进行特征值的归类。

图像特征包括几何特征、形状特征、颜色特征、纹理特征等等。

本系统主要针对图像的纹理特征进行提取、分析,通过研究灰度的空间相关特性来描述纹理,利用灰度共生矩阵产生的四个纹理特征值使其能有效的描述相应图片的纹理特征,最后实现具有显著纹理特性的图像的分类识别。

【关键词】图像特征;灰度共生矩阵;分类识别
1 系统功能及工作原理
1.1 系统功能简介
系统使用基于统计法的灰度共生矩阵,进而提取二次统计特征量来作为区分各图像的标志,已达到对图像对象的识别。

通过ccs3.3 图像处理软件进行模拟仿真,检验相应功能是否实现。

1.2 工作原理
1.2.1 灰度共生矩阵生成
1.2.2 矩阵分析
1)主对角线元素的作用
灰度共生矩阵中主对角线上的元素是一定位置关系下的两象素
同灰度组合出现的次数。

由于沿着纹理方向上相近元素的灰度基本相同,垂直纹理方向上相近象素间有较大灰度差的一般规律,因此,这些主对角线元素的大小有助于判别纹理的方向和粗细,对纹理分析起着重要的作用。

2)元素值的离散性
灰度共生矩阵中元素值相对于主对角线的分布可用离散性来表示,它常常反映纹理的粗细程度。

离开主对角线远的元素的归一化值高,即元素的离散性大,也就是说,一定位置关系的两象素间灰度差的比例高。

若以|△x|=1或0,|△y|=1或0的位置关系为例,离散性大意味着相邻象素间灰度差大的比例高,说明图像上垂直于该方向的纹理较细;相反,则图像上垂直于该方向上的纹理较粗。

当非主对角线上的元素的归一化值全为0时,元素值的离散性最小,即图像上垂直于该方向上不可能出现纹理。

1.2.3 灰度共生矩阵的纹理特征
1)二阶距(能量)
二阶距是灰度共生矩阵元素值得平方和,所以也称为能量,反映了图像灰度分布均匀程度和纹理粗细程度。

2)对比度
反映了图像的清晰度和纹理沟纹深浅的程度。

纹理的沟纹深,其对比度大,效果清晰;反之,对比度小,则沟纹浅,效果模糊。

灰度差即对比度大的像素对越多,这个值越大。

灰度共生矩阵中远离对角线的元素值越大,对比度越大。

3)相关
相关是用来衡量灰度共生矩阵的元素在行或列方上的相似程度。

当矩阵元素值均匀相等时,相关值大;相反,如果矩阵像素值相差很大则相关值小。

果图像中有水平方向纹理,则水平方向矩阵的相
关大于其余矩阵的相关值。

4)熵
熵是图像具有信息量的度量,纹理信息也属于图像的信息,是一个随机性的度量,当灰度共生矩阵中所有元素有最大的随机性、灰度共生矩阵中所有值几乎相等时,共生矩阵中元素分散分布时,熵较大。

它表示图像中纹理的非均匀程度或复杂程度。

若图像没有任何纹理,灰度共生矩阵几乎为零阵。

它反映图像中纹理的复杂程度或非均匀度。

若纹理复杂,熵值大;反之,若图像中灰度均匀,共生矩阵中元素大小差异大,熵值小。

2 技术实现
2.1 图像预处理
本课题是基于灰度共生矩阵的纹理特征值提取,其过程的实现必须进过图像的预处理之后,才可以进行纹理分析,故用到的图片必须是具有256级灰度级的灰度图片。

2.2 压缩灰度级
灰度共生矩阵的计算量由图像的灰度级和图片的大小决定,假设图像g有l个灰度级,其大小为r行c列,则运算量大约是l*r*c,计算量大,故需要在尽量保持图像原形的情况下削减灰度级的取值个数和图像分辨率。

一般一幅图片的灰度级为256级,采用等概率量化方法进行缩减。

在本系统中是将图像压缩为16个灰度级。

3 设计系统的仿真图形
4 对系统总结与评价
本课题研究的基于灰度共生矩阵的纹理特征值提取系统在vc++
的运行环境下能顺利提取图像的特征值并通过运行界面加以显示,成功的实现了灰度共生提取特征值算法。

并实现了在ccs3.3上的模拟仿真。

【参考文献】
[1]王波,姚宏宇,李弼程.一种有效的基于灰度共生矩阵的图像检索方法[j].武汉大学学报:信息科学版,2006,33(9):761-764.
[2]郭德军,宋蛰存.基于灰度共生矩阵的纹理图像分类研究[j].林业机械与木工设备,2005,33(7):21-23.
[3]彭启琮,李玉柏,管庆.dsp技术的发展与应用[m].2版.北京:高等教育出版社,2007.
[责任编辑:王静]。

相关文档
最新文档