图像纹理特征

 本文主要介绍医学影像领域常用到的基于图像灰度值变化所衍生出的各项纹理特征,理论部分主要参考了文献1,同时介绍了相关函数调用方式。

灰度共生矩阵

 灰度共生矩阵2,Gray-Level co-occurance matrix (GLCM)用于描述两个空间上符合一定分布规律的灰度值对出现的概率,矩阵 ( x , y ) (x,y) (x,y)处的值即表示了这样的灰度值对在图像中出现的频次,用公式描述为
p ( x , y ) = ∑ I { ( i , j ) ∣ i m g ( i , j ) = x , i m g ( f ( i , j ) ) = y , i = 1 , 2... h , j = 1 , 2 , . . , w } p(x,y)=\sum I\{(i,j)|img(i,j)=x,img(f(i,j))=y, i=1,2...h,j=1,2,..,w\} p(x,y)=∑I{(i,j)∣img(i,j)=x,img(f(i,j))=y,i=1,2...h,j=1,2,..,w}
其中 I I I为指示函数, w , h w,h w,h为原始图片的宽度和高度, f f f为定义空间分布的函数。

通常来说 f ( i , j ) f(i,j) f(i,j)会设置为 ( i , j + 1 ) , ( i − 1 , j + 1 ) , ( i − 1 , j ) , ( i − 1 , j − 1 ) (i,j+1),(i-1,j+1),(i-1,j),(i-1,j-1) (i,j+1),(i−1,j+1),(i−1,j),(i−1,j−1)其中一个,也就分别对应于原图中 ( i , j ) (i,j) (i,j)元素的0°、45°、90°、135°方向,更进一步的的,有时候也认为这一空间分布应当是双向的,也就是类似 f ( i , j ) = ( i , j + 1 ) o r ( i , j − 1 ) f(i,j)=(i,j+1) or (i,j-1) f(i,j)=(i,j+1)or(i,j−1)。
给出当 f ( i , j ) = ( i , j + 1 ) o r ( i , j − 1 ) f(i,j)=(i,j+1)or (i,j-1) f(i,j)=(i,j+1)or(i,j−1)时的示例图如下, P P P中(1,2)位置的为4,对应原图中灰度值对(1,2)、(2,1)的出现次数为4次。细节:统计灰度值对的时候并不考虑循环填充的情况,即并不认为最右边一行和左边一行是连接的。矩阵的大小为:灰度阶数*灰度阶数。

灰度游程矩阵

 灰度游程矩阵,Gray-Level run-length matrix (GLRLM)用于描述沿某一方向的延续灰度值序列出现的频率,矩阵 ( x , y ) (x,y) (x,y)处的值即表示原图中沿某一方向连续出现 y y y个灰度值为 x x x的像素点频次,用公式描述为:
p ( x , y ) = ∑ I { ( i , j ) ∣ ∀ k ∈ [ 0 , 1 , . . , y − 1 ] , i m g ( f ( i , j , k ) ) = x , i = 1 , 2... h , j = 1 , 2 , . . , w } p(x,y)=\sum I\{(i,j)\ |\ \forall k\in[0,1,..,y-1],img(f(i,j,k))=x ,i=1,2...h,j=1,2,..,w\} p(x,y)=∑I{(i,j) ∣ ∀k∈[0,1,..,y−1],img(f(i,j,k))=x,i=1,2...h,j=1,2,..,w}
其中 I I I为指示函数, w , h w,h w,h为原始图片的宽度和高度, f f f为定义方向的函数,值得注意的是参与了一次较长游程计算的元素不会再参与下一次较短游程的计算,如连续的4个1值不会再被认定为存在2组连续2个1值。
通常而言 f ( i , j , k ) f(i,j,k) f(i,j,k)会设置为 ( i , j + k ) , ( i − k , j + k ) , ( i − k , j ) , ( i − k , j − k ) (i,j+k),(i-k,j+k),(i-k,j),(i-k,j-k) (i,j+k),(i−k,j+k),(i−k,j),(i−k,j−k),同样是表征0°、45°、90°、135°方向,给出0°方向案例如下:

原图 I I I中灰阶3在水平方向上最长的延续长度为3个,出现过1次;延续长度为2的出现过1次,延续长度为1的出现过4次,对应 P P P中第三行为[4,1,1,0,0]。
细节:同样不认为是循环填充的。矩阵大小为:灰度阶数* m a x ( w , h ) max(w,h) max(w,h)

灰度尺寸区域矩阵

 灰度尺寸区域矩阵,Gray-Levle size zone martrix (GLSZM),用于描述平面上相连延续灰度值序列的出现频次。这个定义非常类似于灰度游程矩阵,但灰度游程矩阵要求延续序列是在某一方向上排布的,是一种一维的概念;而灰度尺寸区域矩阵则只要求延续序列见构成连通域即可,是一种二维的概念。其数学公式同样为:
p ( x , y ) = ∑ I { ( i , j ) ∣ ∀ k ∈ [ 0 , 1 , . . , y − 1 ] , i m g ( f ( i , j , k ) ) = x , i = 1 , 2... h , j = 1 , 2 , . . , w } p(x,y)=\sum I\{(i,j)\ |\ \forall k\in[0,1,..,y-1],img(f(i,j,k))=x ,i=1,2...h,j=1,2,..,w\} p(x,y)=∑I{(i,j) ∣ ∀k∈[0,1,..,y−1],img(f(i,j,k))=x,i=1,2...h,j=1,2,..,w}
只不过 f ( i , j , k ) f(i,j,k) f(i,j,k)现在描述了一个面积为 y y y的二维连通域而非一维的线段(连通域的概念可参见opencvn中的漫水填充算法),给出案例如下:

原图中 I I I中由灰阶3组成的连通域有3个,大小分别为3,5,1(这里的连通域认定是8连通域,因此右侧斜向和竖向的3共同构成大小为5的连通域),对应 P P P中第三行为[1,0,1,0,1]。
细节:矩阵的大小为:灰度阶数*最大连通域大小

灰度依赖矩阵

 灰度依赖矩阵,Gray-Level dependence matrix (GLDM) ,用于描述某一灰阶的周边区域某类灰度值分布的出现频次,矩阵 ( x , y ) (x,y) (x,y)处的值表示原图中灰度值为 x x x的点满足:以该点为中心一定范围内灰度值与 x x x的差小于阈值 δ \delta δ的点有 y y y个,这一条件的出现频次。用数学公式表示如下:
p ( x , y ) = ∑ I { ( i , j ) ∣ δ ≥ ∣ i m g ( f ( i , j ) ) − i m g ( i , j ) ∣ , i = 1 , 2... h , j = 1 , 2 , . . , w } p(x,y)=\sum I\{(i,j)\ |\ \delta\geq |img(f(i,j))-img(i,j)| ,i=1,2...h,j=1,2,..,w\} p(x,y)=∑I{(i,j) ∣ δ≥∣img(f(i,j))−img(i,j)∣,i=1,2...h,j=1,2,..,w}
其中 f ( i , j ) f(i,j) f(i,j)用于定义这一范围,通常就是八领域,而 δ \delta δ则是可以容忍的差异阈值。给出 δ = 0 \delta=0 δ=0时案例如下:

原图中灰度值为3的点共有9个,八邻域范围内拥有1个灰度值为3的邻居的点有4个,拥有2个灰度值为3的邻居的点有4个,没有灰度值为3的邻居的点有1个,则 P P P中第三行为[1,4,4,0]。
细节:矩阵大小为:灰度阶数*最大邻居数+1。加1是因为存在邻居数为0的情况。

相邻灰度差分矩阵

 相邻灰度差分矩阵,Neighboring gray tone difference matrix (NGTDM),用于描述某灰阶和它周边范围内平均灰度值差异,和前面几个矩阵不同,相邻灰度差分矩阵的每列所代表的含义并不相同,先给出案例再分别叙述:

第一张为原图,第二张给出对应NGTDM。NGTDM有三列,第一列给出了不同灰阶在原图中出现频次,第二列给出不同灰阶在原图中的出现频率,第三列最为重要,给出某个灰阶在原图所有位置与其周边范围内平均灰度差异之和。通常周边范围就定义为八邻域,以 s 5 s_5 s5​为例,原图中共有4个5, ( 0 , 2 ) (0,2) (0,2)处的5八邻域范围内均值为 2 + 5 + 1 + 3 + 2 5 = 2.6 \frac{2+5+1+3+2}{5}=2.6 52+5+1+3+2​=2.6,与5的差异为 ∣ 5 − 2.6 ∣ = 2.4 |5-2.6|=2.4 ∣5−2.6∣=2.4,同理得到其他位置处的差异为2.375、2.5、2.8,共计10.075。

灰度特征矩阵分析归纳

 统一起来看的的话,其实灰度尺寸区域矩阵可以看作是灰度游程矩阵的整合延申,将多个一维层面的的统计量扩张到了二位层面,都是在描述某个灰阶值的延续情况;而相邻灰度差分矩阵和灰度依赖矩阵则是一体两面得刻画了某个灰阶与它领域的关系,前者描述相似性,后者描述相异性;灰度共生矩阵则意图描述图中灰阶的分布状况。这些值都是在描述图像的纹理特征,如果原始图像的纹理越粗糙则越趋近于出现大块的延续灰度值,从而灰度共生矩阵非零值出现在对角线附近;灰度游程矩阵和灰度尺寸区域矩阵的非零元素大都集中在右侧;灰度依赖矩阵的非零元素主要分布在矩阵右侧;相邻灰度差分矩阵的最后一列的值会较小。
 值得注意的是,所有的灰度特征矩阵的大小和灰度阶数有关,通常我们使用的图片大小都是256阶的,再加上矩阵计算时的复杂程度于输入图片的大小成正比,直接在原始图像上计算将是极其耗费时间,储存结果也是极其耗费资源的。

  • 针对计算耗时问题,我们可以调整原图的量化等级,降低灰度阶数,通过np.digitize()函数实现3
  • 针对计算结果过大的问题,我们通常不直接使用计算出的灰度特征矩阵当作最终的特征,而是依此计算出一系列统计量来描述,此处不再展开,详见pyrandiomics4的文档。

编程实现

 目前囊括了这些纹理特征的python库较少,skimage中包含了计算灰度共生矩阵和相关特征的函数,但没有其他矩阵的计算方式;pyradiomics包含计算上述所有特征的方法,并且注释中拥有详细的理论解释,但它只针对于医学图像,常规输入图片的特征无法进行求取(也可能是我没找到方法)。以下给出灰度游程矩阵代码,改写自5

def getGrayLevelRumatrix( array, theta):'''计算给定图像的灰度游程矩阵参数:array: 输入,需要计算的图像theta: 输入,计算灰度游程矩阵时采用的角度,list类型,可包含字段:['deg0', 'deg45', 'deg90', 'deg135']glrlm: 输出,灰度游程矩阵的计算结果'''P = arrayx, y = P.shapemin_pixels = np.min(P)   # 图像中最小的像素值run_length = max(x, y)   # 像素的最大游行长度num_level = np.max(P) - np.min(P) + 1   # 图像的灰度级数deg0 = [val.tolist() for sublist in np.vsplit(P, x) for val in sublist]   # 原图分解按水平方向分解为多个序列deg90 = [val.tolist() for sublist in np.split(np.transpose(P), y) for val in sublist]   # 原图分解按竖直方向分解为多个序列diags = [P[::-1, :].diagonal(i) for i in range(-P.shape[0]+1, P.shape[1])]   # 使用diag函数获取45°方向序列deg45 = [n.tolist() for n in diags]Pt = np.rot90(P, 3)   # 旋转后重复前一操作获取135°序列diags = [Pt[::-1, :].diagonal(i) for i in range(-Pt.shape[0]+1, Pt.shape[1])]deg135 = [n.tolist() for n in diags]seqs={'deg0':deg0,'deg45':deg45,'deg90':deg90,'deg135':deg135}glrlm = np.zeros((num_level, run_length, len(theta)))  for angle in theta:for splitvec in range(0, len(seqs)):flattened =seqs[angle][splitvec] # 获取某一方向上的某个序列answer = []for key, iter in groupby(flattened):   # 使用itertools.groupby()获取延续灰度值长度answer.append((key, len(list(iter))))for ansIndex in range(0, len(answer)):glrlm[int(answer[ansIndex][0]-min_pixels), int(answer[ansIndex][1]-1), theta.index(angle)] += 1   # 每次将统计像素值减去最小值就可以填入GLRLM矩阵中return glrlm

更新:在github上找到一个非常强大的包叫做pyfeat6,里面囊括了大部分基于上述灰度特征矩阵计算的统计量的函数,如果有需要的话也可以直接导入源文件计算原始的灰度特征矩阵。以灰度共生矩阵为例,调用pyfeats.glcm_features(img)就可以输出原图在0°、45°、90°、135°方向上的灰度共生矩阵计算出的14个统计量的均值。但pyfeat默认是不计算灰度值为0对应矩阵元素,并且有时候这一设置不能在features计算时显式修改,比如计算基于GLRLM特征时就没有给出可选项,需要自行去源文件pyfeats\textural\glrm.py中修改.

参考


  1. 图解医学影像纹理特征 ↩︎

  2. 基于Python探究灰度共生矩阵(GLCM)那点事儿 ↩︎

  3. 灰度共生矩阵 ↩︎

  4. Radiomic Features ↩︎

  5. 特征提取之灰度游程(行程)矩阵-GLRLM ↩︎

  6. pyfeats 0.0.11 ↩︎

图像纹理特征(灰度共生矩阵等)解析和编程调用相关推荐

  1. 图像中的灰度共生矩阵

    1.图像共生矩阵的用途 纹理特征提取的一种有效方法是以灰度级的空间相关矩阵及共生矩阵为基础的.因为图像中相距(△x,△y)的两个灰度像素同时出现联合频率分布可以用灰度共生矩阵来表示.若图像的灰度定为N ...

  2. Gabor滤波进行目标图像纹理特征的提取

    1.傅里叶变换 1) 简介 数字图像处理的方法主要分成两大部分:空域分析法和频域分析法.空域分析法就是对图像矩阵进行处理:频域分析法是通过图像变换将图像从空域变换到频域,从另外一个角度来分析图像的特征 ...

  3. 模式识别作业,基于python提取图像纹理特征

    其中的直方图的绘画部分要注意,只写了部分的直方图代码###直接调用skimag库中的函数BLP提取纹理 from skimage import dataimport matplotlib.pyplot ...

  4. python统计图片的纹理信息_python实现LBP方法提取图像纹理特征实现分类

    题目描述 这篇博文是数字图像处理的大作业. 题目描述:给定40张不同风格的纹理图片,大小为512*512,要求将每张图片分为大小相同的9块,利用其中的5块作为训练集,剩余的4块作为测试集,构建适当的模 ...

  5. 二维特征分类的基础_纹理特征1:灰度共生矩阵(GLCM)

    GLCM复习备用: 纹理分析是对图像灰度(浓淡)空间分布模式的提取和分析.纹理分析在遥感图像.X射线照片.细胞图像判读和处理方面有广泛的应用.关于纹理,还没有一个统一的数学模型.它起源于表征纺织品表面 ...

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

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 灰度共生矩阵 灰度共生矩阵(Gray Level CO-Occur ...

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

    纹理通常被定义为图像的某种局部特征,或是对局部区域中像素之间关系的一种度量. 纹理的标志有三要素:①某种局部的序列性,在该序列更大的区域内不断重复:②序列是由基本部分非随机排列组成的:③各部分大致都是 ...

  8. MATLAB 在图像处理和机器视觉的应用举例01 - 官网培训视频笔记(下)分类/灰度共生矩阵/纹理分类学习

    前言: 本节继续讨论Matlab的机器视觉工具集举例,这次为分类的综合实现:该例子,用到了图像处理,统计,并行计算等方法. 1 分类的难度: [计算机视觉里面,分类的精髓在选取适当的数据集和算法,这一 ...

  9. 图像特征提取(纹理特征)

    图像纹理特征总体简述 纹理是一种反映图像中同质现象的视觉特征,它体现了物体表面的具有缓慢变化或者周期性变化的表面结构组织排列属性 纹理具有三大标志: 某种局部序列性不断重复 非随机排列 纹理区域内大致 ...

最新文章

  1. C++ 容器1 vector
  2. 算法笔记-桶排序代码与原理、非比较排序、计数排序、基数排序、C#代码
  3. 软件之最大全电子书免费版
  4. odata.publish = true的CDS view激活之后,后台发生了什么事情
  5. python画函数图像要用到的模块_教你如何绘制数学函数图像——numpy和matplotlib的简单应用...
  6. [html] 实现一个页面锁屏的功能
  7. MySQL报错 Packet for query is too large,server向mysql发送的数据包大小超过mysql限制
  8. python文件管不了_Python对文件和文件路径的管理
  9. 【SpringCloud】Spring cloud Alibaba Nacos 服务注册与配置中心
  10. xcode 不值钱的动画UIButton
  11. 协鑫集成等四家公司被退出欧盟MIP协议
  12. 如何用ASP读写TXT文本文件中的内容
  13. vmrc安装出现:未能安装 HCmon 驱动程序 (Failed to install the HCmon driver)
  14. 强行进入加密QQ空间
  15. html文件怎么传到服务器上,如何把html文件上传到云服务器
  16. 别看 DNS 污染闹得欢,现在我用 CoreDNS 将它拉清单
  17. layui表格宽度自适应
  18. Package pdftex.def Error: PDF mode expected, but DVI mode detected!
  19. 南京大学计算机考研考试大纲,南京大学计算机技术(专业学位)研究生考试科目和考研参考书目...
  20. 几何光学学习笔记(17)- 4.6光学材料

热门文章

  1. Java Bean解析。什么是Javabean?
  2. shell循环语句及实验
  3. 元道经纬相机:现场拍照助力全行业巡检进入2.0时代!
  4. 二维码生成细节和原理
  5. java获取origin,java – 通过环境变量指定@CrossOrigin orgins
  6. [博应用软件]wps文档如何设置文字双行合一
  7. 软件测试培训哪里好,培训出来的工资一般是多少?
  8. Shell 获取函数返回值(函数返回值)
  9. word中“居中”,“标准”不能解决(公式/图片)和文字不在一行的处理办法
  10. 甘肃皇城唐代数据矢量化