理论内容引自https://blog.csdn.net/qq_37059483/article/details/78292869

最近在研究机器学习相关内容,后面会尽量花时间整理成一个系列的博客,然后朋友让我帮他实现一种基于SVR支持向量回归的图像质量评价方法,然而在文章的开头竟然发现
灰度共生矩阵这个陌生的家伙,于是便有此文。

主要参考博客1:http://blog.csdn.net/jialeheyeshu/article/details/51337225
主要参考博客2:http://blog.csdn.net/guanyuqiu/article/details/53117507
主要参考博客3:http://www.cnblogs.com/rong86/p/3695621.html
主要参考博客4:http://blog.csdn.net/lingtianyulong/article/details/53032034

1.灰度共生矩阵生成原理
  灰度共生矩阵(GLDM)的统计方法是20世纪70年代初由R.Haralick等人提出的,它是在假定图像中各像素间的空间分布关系包含了图像纹理信息的前提下,提出的具有广泛性的纹理分析方法。

   灰度共生矩阵被定义为从灰度为i的像素点出发,离开某个固定位置(相隔距离为d,方位为)的点上灰度值为的概率,即,所有估计的值可以表示成一个矩阵的形式,以此被称为灰度共生矩阵。对于纹理变化缓慢的图像,其灰度共生矩阵对角线上的数值较大;而对于纹理变化较快的图像,其灰度共生矩阵对角线上的数值较小,对角线两侧的值较大。由于灰度共生矩阵的数据量较大,一般不直接作为区分纹理的特征,而是基于它构建的一些统计量作为纹理分类特征。Haralick曾提出了14种基于灰度共生矩阵计算出来的统计量:即:能量、熵、对比度、均匀性、相关性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相关信息测度以及最大相关系数。

  在网上看了很多灰度共生矩阵生成的例子感觉都没有说明白,要不就直接上结果要不就给一堆看不懂的代码和公式,后来看了matlab中的介绍就明白了,其实很简单,仔细把下面的看三遍就理解怎么来的了!(我是第三篇看明白的,当时很紧张,相信你们没问题)
  下图显示了如何求解灰度共生矩阵,以(1,1)点为例,GLCM(1,1)值为1说明只有一对灰度为1的像素水平相邻。GLCM(1,2)值为2,是因为有两对灰度为1和2的像素水平相邻。(MatLab说明文档)

GLCM表其实就是所有像素可能的组合,比如,GLCM(1,1)就是I中像素值为1和1的组合,GLCM(4,5)就是I中像素4和像素5的组合,GLCM(i,j)的值呢就是I中像素为i,像素为j的有有多少和相邻的成对点。这个相邻有个规则:就是f(x,y),f(x+a,y+b)相邻,就是只有x相隔a的单位,y相隔b个单位,我们认为是相邻的。
平时我们说相邻:B点在A点右边,其实就是这里的a=1,b=0,也就是f(x,y)和f(x+1,y+0)相邻。
于是就有了:
a=1,b=0 时我们就说水平相邻:也就是0度的时候
a=1,b=1 时我们就说对角相邻,也就是45度的时候
a=-1,b=1时 即135度
其他角度类似。
在a=1,b=0时:GLCM(1,1)=1;其实就是I中有几个1和1相邻(1个)(按上面的规则)GLCM(1,2)=2,几个1和2相邻(2个)。ok!
后面好多的性质,都是在把这个矩阵计算出来之后再在这个基础上运算的,那些就不难了!

附加理解2:
共生矩阵用两个位置的像素的联合概率密度来定义,它不仅反映亮度的分布特征,也反映具有同样亮度或者接近亮度的像素之间的位置分布特性,是有关图像亮度变化的二阶统计特征。它是定义一组纹理特征的基础。

由于纹理是由灰度在空间位置上反复出现而形成的,因而在图像空间中像个某距离的两像素之间会存在一定的灰度关系,即图像中灰度的空间相关特性。灰度共生矩阵就是一种通过研究灰度的空间相关特性来描述纹理的常用方法。

灰度直方图是对图像上单个像素具有某个灰度进行统计的结果,

而灰度共生矩阵是对图像上保持某距离的两像素分别具有某灰度的状况进行统计得到的。

取图像(N×N)中任意一点 (x,y)及偏离它的另一点 (x+a,y+b),设该点对的灰度值为(g1,g2)。令点(x,y) 在整个画面上移动,则会得到各种 (g1,g2)值,设灰度值的级数为 k,则(g1,g2) 的组合共有 k^2;种。对于整个画面,统计出每一种(g1,g2)值出现的次数,然后排列成一个方阵,在用(g1,g2) 出现的总次数将它们归一化为出现的概率P(g1,g2),这样的方阵称为灰度共生矩阵。距离差分值(a,b) 取不同的数值组合,可以得到不同情况下的联合概率矩阵。(a,b)取值要根据纹理周期分布的特性来选择,对于较细的纹理,选取(1,0)、(1,1)、(2,0)等小的差分值。  当 a=1,b=0时,像素对是水平的,即0度扫描;当a=0,b=1 时,像素对是垂直的,即90度扫描;当 a=1,b=1时,像素对是右对角线的,即45度扫描;当 a=-1,b=-1时,像素对是左对角线,即135度扫描。
这样,两个象素灰度级同时发生的概率,就将 (x,y)的空间坐标转化为“灰度对” (g1,g2)的描述,形成了灰度共生矩阵。(百度百科)
一幅图象的灰度共生矩阵能反映出图象灰度关于方向、相邻间隔、变化幅度的综合信息,它是分析图象的局部模式和它们排列规则的基础。

感觉差不多了吧!

2.灰度共生矩阵特征量(字写的不好,请见谅)

2.1对比度

度量 矩阵的值是如何分布和图像中局部变化的多少,反应了图像的清晰度和纹理的沟纹深浅。纹理的沟纹越深,反差越大,效果越清晰;反之,对比值小,则沟纹浅,效果模糊。

2.2 能量

能量变换反映了图像灰度分布均匀程度和纹理粗细度。若灰度共生矩阵的元素值相近,则能量较小,表示纹理细致;若其中一些值大,而其它值小,则能量值较大。能量值大表明一种较均一和规则变化的纹理模式。

2.3 熵

图像包含信息量的随机性度量。当共生矩阵中所有值均相等或者像素值表现出最大的随机性时,熵最大;因此熵值表明了图像灰度分布的复杂程度,熵值越大,图像越复杂。

2.4 逆方差

逆方差反映了图像纹理局部变化的大小,若图像纹理的不同区域间较均匀,变化缓慢,逆方差会较大,反之较小。

2.5相关性

用来度量图像的灰度级在行或列方向上的相似程度,因此值得大小反应了局部灰度相关性,值越大,相关性也越大。


3、代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import cv2
import math#定义最大灰度级数
gray_level = 16def maxGrayLevel(img):max_gray_level=0(height,width)=img.shapeprint ("图像的高宽分别为:height,width",height,width)for y in range(height):for x in range(width):if img[y][x] > max_gray_level:max_gray_level = img[y][x]print("max_gray_level:",max_gray_level)return max_gray_level+1def getGlcm(input,d_x,d_y):srcdata=input.copy()ret=[[0.0 for i in range(gray_level)] for j in range(gray_level)](height,width) = input.shapemax_gray_level=maxGrayLevel(input)#若灰度级数大于gray_level,则将图像的灰度级缩小至gray_level,减小灰度共生矩阵的大小if max_gray_level > gray_level:for j in range(height):for i in range(width):srcdata[j][i] = srcdata[j][i]*gray_level / max_gray_levelfor j in range(height-d_y):for i in range(width-d_x):rows = srcdata[j][i]cols = srcdata[j + d_y][i+d_x]ret[rows][cols]+=1.0for i in range(gray_level):for j in range(gray_level):ret[i][j]/=float(height*width)return retdef feature_computer(p):#con:对比度反应了图像的清晰度和纹理的沟纹深浅。纹理越清晰反差越大对比度也就越大。#eng:熵(Entropy, ENT)度量了图像包含信息量的随机性,表现了图像的复杂程度。当共生矩阵中所有值均相等或者像素值表现出最大的随机性时,熵最大。#agm:角二阶矩(能量),图像灰度分布均匀程度和纹理粗细的度量。当图像纹理均一规则时,能量值较大;反之灰度共生矩阵的元素值相近,能量值较小。#idm:反差分矩阵又称逆方差,反映了纹理的清晰程度和规则程度,纹理清晰、规律性较强、易于描述的,值较大。Con=0.0Eng=0.0Asm=0.0Idm=0.0for i in range(gray_level):for j in range(gray_level):Con+=(i-j)*(i-j)*p[i][j]Asm+=p[i][j]*p[i][j]Idm+=p[i][j]/(1+(i-j)*(i-j))if p[i][j]>0.0:Eng+=p[i][j]*math.log(p[i][j])return Asm,Con,-Eng,Idmdef test(image_name):img = cv2.imread(image_name)try:img_shape=img.shapeexcept:print ('imread error')return#这里如果用‘/’会报错TypeError: integer argument expected, got float#其实主要的错误是因为 因为cv2.resize内的参数是要求为整数img=cv2.resize(img,(img_shape[1]//2,img_shape[0]//2),interpolation=cv2.INTER_CUBIC)img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)glcm_0=getGlcm(img_gray, 1,0)#glcm_1=getGlcm(src_gray, 0,1)#glcm_2=getGlcm(src_gray, 1,1)#glcm_3=getGlcm(src_gray, -1,1)print(glcm_0)asm,con,eng,idm=feature_computer(glcm_0)return [asm,con,eng,idm]if __name__=='__main__':result = test("/home/images/2019-05-27/8/20190527_17_29_03_X1_Y2.jpg")print(result)

灰度共生矩阵(附python代码)相关推荐

  1. 教程 | 理解和实现自然语言处理终极指南(附Python代码)

     教程 | 理解和实现自然语言处理终极指南(附Python代码) 时间 2017-02-16 14:41:39 机器之心 原文  http://www.jiqizhixin.com/article ...

  2. 基于TextRank算法的文本摘要(附Python代码)

    基于TextRank算法的文本摘要(附Python代码): https://www.jiqizhixin.com/articles/2018-12-28-18

  3. python 合并工作簿_Excel:快速合并多张表格或多个文件(工作簿)的数据(附Python代码)...

    Excel:快速合并多张表格或多个文件(工作簿)的数据(附Python代码) 现实工作中经常遇到将零散的原始数据合并统计的工作要求,如月度统计或年度统计等.原始数据的收集大多是按时间(如日期或小时)进 ...

  4. XGBoost参数调优完全指南(附Python代码)

    XGBoost参数调优完全指南(附Python代码) 译注:文内提供的代码和运行结果有一定差异,可以从这里下载完整代码对照参考.另外,我自己跟着教程做的时候,发现我的库无法解析字符串类型的特征,所以只 ...

  5. python随机森林变量重要性_推荐 :一文读懂随机森林的解释和实现(附python代码)...

    原标题:推荐 :一文读懂随机森林的解释和实现(附python代码) 作者:WilliamKoehrsen:翻译:和中华:校对:李润嘉 本文约6000字,建议阅读15分钟. 本文从单棵决策树讲起,然后逐 ...

  6. Excel:快速合并多张表格或多个文件(工作簿)的数据(附Python代码)

    Excel:快速合并多张表格或多个文件(工作簿)的数据(附Python代码) 现实工作中经常遇到将零散的原始数据合并统计的工作要求,如月度统计或年度统计等.原始数据的收集大多是按时间(如日期或小时)进 ...

  7. 利用OpenSearch API检索和下载数据 附Python代码实例

    利用OpenSearch API检索和下载数据 附Python代码实例 在数据下载过程中,我们常常会需要下载非常多的数据文件,这时我们可以利用wget等软件或者编写数据下载脚本来实现数据下载的批处理. ...

  8. 基于ANFIS的股票价格预测附Python代码

    基于ANFIS的股票价格预测附Python代码 在金融领域,股票价格预测一直是一个重要的问题.随着机器学习技术的发展,人们开始尝试使用神经网络等方法进行股票价格的预测. ANFIS(自适应网络基石推理 ...

  9. 机器学习系列(12)_XGBoost参数调优完全指南(附Python代码)

    机器学习系列(12)_XGBoost参数调优完全指南(附Python代码) 原文链接:http://blog.csdn.net/han_xiaoyang/article/details/5266539 ...

  10. python重点知识归纳_一文了解机器学习知识点及其算法(附python代码)

    一文了解机器学习知识点及其算法(附python代码) 来源:数据城堡 时间:2016-09-09 14:05:50 作者: 机器学习发展到现在,已经形成较为完善的知识体系,同时大量的数据科学家的研究成 ...

最新文章

  1. Apache Traffic Server管理工具
  2. 发布e表 for Java版
  3. Python的函数名作为参数传入调用以及map、reduce、filter
  4. 2018.5.18信息安全铁人三项赛数据赛复现
  5. 简单记线程安全的集合类
  6. VirtualBox安装MACOSX 10.13虚拟机
  7. 数据结构与算法 - 图论
  8. Java Web应用开发实用教程_Java Web应用开发实用教程
  9. 演化博弈论----gyy参考总结
  10. Ubuntu下.tar.bz2和.tar.gz文件的解压命令
  11. ANSYS入门例程笔记
  12. google搜索自己博客文章小记
  13. PostgreSQL下载与安装
  14. 网页前往小程序指定页面
  15. Epoll的本质(内部实现原理)
  16. SparkShell创建表
  17. Windows Sever2016磁盘分区
  18. 项目可行性的研究内容
  19. java毕业设计大学生体测数据管理系统Mybatis+系统+数据库+调试部署
  20. 控温设备的PID参数选定的个人方法(真实有效)

热门文章

  1. uni-app中利用eacycom机制快速创建复用组件
  2. 《图算法》第七章 图算法实践-2
  3. 搜狗微信反爬虫,让自媒体内容更安全
  4. 向量表示 运动抛物线_高考真题,向量在抛物线中的妙用,向量优势,你还愁圆锥曲线吗?...
  5. 【智能助理】智能助理:数据驱动 + 深度学习实现人工智能新突破
  6. lol12月25服务器维护,英雄联盟12月25日更新到几点 LOL更新维护公告
  7. 学计算机联锁有哪些论坛,动车论坛计算机联锁设备如何进行联锁试验A.docx
  8. 干脆大大方方的以前高
  9. Windows MFC编程入门——应用程序框架
  10. (3.6)Case用法