因为最近要在OpenCV上试试各种图像分割算法的效果,其中灰度共生算法没有办法直接调用库函数实现,看了很多文章,其中有一篇博文讲的很清楚。博主有提供原理和源码,大家可以直接看原博。
原文地址:纹理特征提取方法:LBP, 灰度共生矩阵
我现在按照自己的理解以代码逻辑再复盘一遍算法过程,详细推导一遍,有一些是上面那个博文搬过来的,本文只是学习笔记,以便日后查询使用。
// 在计算灰度共生矩阵前需要确定一些参数:
- 灰度共生矩阵灰度级,与灰度共生矩阵的阶数相同,即当灰度图像灰度级为N时,灰度共生矩阵为N × N的矩阵。一般一幅图的灰度级有256级,0-255,但由于计算量大,一般选取4、8、16作为灰度级;
- 滑动窗口尺寸,即每次计算特征值所选用的窗口矩阵大小,一般选取5×5或7×7;
- 方向选择:计算灰度共生矩阵的方向一般为0°,45°,90°,135°四个方向;求出四个方向矩阵的特征值后,可以通过计算四个特征值的平均值作为最终特征值共生矩阵;
- 步距d:一般选择d = 1,即中心像素直接与其相邻像素点做比较运算;
- 为了解释说明方便,用N=4个灰度级,7*7窗口矩阵作为示例。
// 具体步骤如下:
1. 将原图灰度量化
A. d=1,求0°方向矩阵A的共生矩阵

则按照0°方向(即水平方向从左向右,从右向左两个方向),共有以下几种情况:
1/ 统计矩阵值(0, 1),则如下图所示:

此时满足矩阵值(0,1)统计条件的值,共有10个,所以该窗口对应的GLCM统计矩阵的(0, 1)和(1, 0)位置元素的值即为10。
4/ 统计矩阵值( 3,0),则如下图所示:

此时满足矩阵值(3,0)统计条件的值,共有10个,所以该窗口对应的GLCM统计矩阵的(3, 0)和(0, 3)位置元素的值即为10。
B. d=1,求45°方向矩阵A的共生矩阵

则按照45°方向(即45°方向从右上向左下,从左下向右上两个方向),共需统计以下4种情况:统计矩阵值(0,0)(1, 1),(2,2)(3,3)。
具体分析如A同理,最后的GLCM 4 × 4统计矩阵结果如下:

C. d=1,求90°方向矩阵A的共生矩阵

计算方法类似上述。

D. d=1,求135°方向矩阵A的共生矩阵

计算方法类似上述。

3. 矩阵的归一化
将矩阵所有元素与矩阵中所有元素之和作除运算,得到概率矩阵。
5. 计算单窗口所有统计方向对应的特征值后平均化
6. 计算整幅图像,重复步骤2-5
一个滑动窗口计算结束后,该窗口就可以移动一个像素点,形成另一个小窗口图像,重复进行上一步的计算,生成新窗口图像的共生矩阵和纹理特征值; 以此类推,滑动窗口遍历完所有的图像像素点后,整个图像就形成了一个由纹理特征值构成的一个纹理特征值矩阵。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225226.html原文链接:https://javaforall.net
