转载--灰度共生矩阵(GLCM)及其统计量使用

文章转载于:https://blog.csdn.net/qq_30024069/article/details/80866923

本篇博客主要讲如何使用灰度共生矩阵统计量。Haralick等人定义了14个纹理分析的灰度共生矩阵特征参数。Ulaby等人研究发现:在基GLCM的14个纹理特征中,仅有4个特征是不相关的,这4个特征即便于计算又能给出较高的分类精度,一般采用这四种特征。

1.纹理特征值的计算

  • a. 'Contrast' : 对比度。返回整幅图像中像素和它相邻像素之间的亮度反差。取值范围:[0,(GLCM行数-1)^2]。灰度一致的图 像,对比度为0。
  • b. 'Correlation' : 相关。返回整幅图像中像素与其相邻像素是如何相关的度量值。取值范围:[-1,1]。灰度一致的图像,相关性为NaN。
  • c. 'Energy' : 能量。返回GLCM中元素的平方和。取值范围:[0 1]。灰度一致的图像能量为1。
  • d. 'Homogemeity' : 同质性。返回度量GLCM中元素的分布到对角线紧密程度。取值范围:[0 1]。对角矩阵的同质性为1。

     取步长为1,对0,45,90,135方向求统计量。对上诉指标进行归一化(特征),可以送到神经网络或支持向量机进行相关学习(分类,识别等任务)。经常看到分类纺织品、木材纹路等。提取纹理特征时主要存在两方面的缺陷:1.缺乏移动不变性,输入信号很小的位移会造成能量分布的很大变化。2. 较差的方向选择性,图像的微小改变会造成识别效果的降低。

 2.纹理特征影像的生成

       其主要思想:用5*5或7*7滑动窗口遍历图像,计算窗口内的对比度、相关性、能量、同质性值,然后替换该像素的像素值。生成的纹理特征影像图可以认识是边缘图。下图是5*5滑动窗口,步长为1,0方向生成的结果图。论文“基于灰度共生矩阵提取纹理特征图像的研究”冯建辉,说纹理特征影像可以提高分类效果,但是每个小窗口都要计算灰度共生矩阵,然后计算统计量。计算过于复杂,耗费时间。目前有很多种方法提高分类效果,所以这种方法目前并不常用了。

        

                                    原图                                                                                           对比度


         

                                  相关性                                                                                          能量

        我学习灰度共生矩阵,主要想计算图像复杂度,应用到其他图像处理其他方面。但是对比度、相关、能量、同质之间的权重不同很合理的定义。映射到的灰度级不同,会导致对比度有较大的变化,所以在和其他统计量加权求和时,最好归一化。 只要复杂度,与目测结果一致就可。比如a图看着比b图复杂,a图的复杂度比b图的复杂度高即可。

附件:


 
 
 
  1. #include <algorithm>
  2. #include <opencv2/opencv.hpp>
  3. #include <vector>
  4. using namespace std;
  5. using namespace cv;
  6. // 0°灰度共生矩阵
  7. void getGLCM0(Mat& src, Mat& dst, int gray_level)// 0度灰度共生矩阵
  8. {
  9. CV_Assert(1 == src.channels());
  10. int height = src.rows;
  11. int width = src.cols;
  12. dst.create(gray_level, gray_level, CV_32SC1);
  13. dst = Scalar::all(0);
  14. for (int i = 0; i < height; i++)
  15. {
  16. uchar *srcdata = src.ptr<uchar>(i);
  17. for (int j = 0; j < width - 1; j++)
  18. {
  19. // 同样的像素对,水平相邻
  20. int rows = srcdata[j] * gray_level/256;
  21. int cols = srcdata[j + 1] * gray_level / 256;
  22. dst.at<int>(rows, cols)++;
  23. }
  24. }
  25. }
  26. // 90°灰度共生矩阵
  27. void getGLCM90(Mat& src, Mat& dst, int gray_level)
  28. {
  29. CV_Assert(1 == src.channels());
  30. int height = src.rows;
  31. int width = src.cols;
  32. dst = Mat(gray_level, gray_level, CV_32SC1, Scalar(0));
  33. for (int i = 0; i < height - 1; i++)
  34. {
  35. uchar*srcdata = src.ptr<uchar>(i) ;
  36. uchar*srcdata1 = src.ptr <uchar>(i + 1);
  37. for (int j = 0; j < width; j++)
  38. {
  39. // 同样的像素对,垂直相邻
  40. int rows = srcdata[j] / 256;
  41. int cols = srcdata1[j] / 256;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值