分形  盒子维纹理特征

在纹理特征的提取中,纹理的分形维数特征(FD)是对纹理的一种重要描述。图像的纹理越复杂、细腻,则分形维数越大。提取分形维数特征的方法有很多种,理论以及计算的复杂度各有差异。

本文中分形维数的计算方法采用的是 DBC(Differential Box-counting)即 差分盒子计数法。该方法是由Sarkar and Chaudhuri 于1994年前后提出的(An Efficient Differential  Box-Counting Approach to Compute Fractal Dimension of  Image),在前人的分形维数计算方法上做了重要改进,使得FD的计算以及准确度得到了较大的提升。在本文算法的编写过程中还参考了两篇中文综述:[二维灰度图像的分形维数计算.张志],[图像分形维数计算方法的比较.赵海英]。

为节省篇幅,先主要罗列所用到的基本公式,以及Sarkar原著中的论述,其他基本知识点,读者可参阅上述两篇中文综述。

D就是要求的纹理分形维数特征。由于D是Nr、1/r对应直线的斜率,所以需要多次改变r,即网格大小,获得多个样本点,最后通过直线拟合求得最终的D。

这种基于DBC的方法计算出的纹理分形维数特征的值应该介于2~3。这是有理论证明的。在Sarkar的原著中,仅有提及,未给证明:

在[二维灰度图像的分形维数计算.张志]中作者则给出了 FD< 3 的证明。FD>2的证明类似。且在[二维灰度图像的分形维数计算.张志]中,作者提及了Sarkar的DBC方法存在的问题,即DBC方法存在多余的空盒子。所以本文在程序设计时,注意了此问题,排除了空盒子的影响,得到了较好的FD计算效果。

现给出本次设计中分形盒子维的代码。代码经验证,FD值符合纹理复杂程度。理论上,FD值本身还应具有“三不变”特性:平移、旋转、缩放。经验证,在某些图像上,本算法具备缩放不变性,平移、旋转不变形未经验证。

代码之中存在的冗余、不适、bug还望各位读者指正。

(最小二乘法拟合基本原理:http://blog.csdn.net/ice_fire3/article/details/6709929)

  1. //************************//

  2. //计算分形盒子维

  3. //*** yangxin_szu 2013_03_28 ***//

  4. //valarray与 MFC 有一定冲突

  5. //#undef的使用是为了避免问题出现

  6. #ifdef min

  7. #undef min

  8. #endif

  9. #ifdef max

  10. #undef max

  11. #endif

  12. #include <valarray>

  13. using namespace std;

  14. void My_Texture::Calculate_Fractal_Dim(unsigned char* Img_Data ,int Img_size)

  15. {

  16. //*************************************************//

  17. //the width and height of the Image should be the same

  18. //gray level : 256

  19. //points for Least Square method: 20

  20. //*************************************************//

  21. int i=0 ,j=0;

  22. //分形盒子维相关参数

  23. int M = Img_size;//图像尺寸

  24. int G = 256;//图像灰度级

  25. int L_point = 20;//最小二乘法样本点数

  26. valarray<unsigned char> Img_VAL(Img_size*Img_size);

  27. valarray<int> L_VAL(L_point);

  28. valarray<int> h_VAL(L_point);

  29. valarray<double> r_VAL(L_point);

  30. valarray<double> Nr_VAL((double)0,L_point);

  31. valarray<int> Grid_Num(L_point);//网格数目

  32. valarray<double> fractal_D(0.0 ,L_point);

  33. //复制数据

  34. int k = 0;

  35. for (i=0;i<Img_size;i++)

  36. {

  37. for (j=0;j<Img_size;j++)

  38. {

  39. Img_VAL[k] = Img_Data[i*Img_size + j];

  40. k++;

  41. }

  42. }

  43. //网格大小及相关参数

  44. //改进后的约束范围 M^(1/3)<= L <= M/3

  45. int L_min = (int)powf(M ,1/3.0);

  46. //int L_min = M/40;

  47. int L_max = (int)M/2;

  48. int L_step = (int)((L_max - L_min)/(float)L_point);

  49. for(i=0;i<L_point;i++)

  50. {

  51. L_VAL[i] = L_min + i*L_step;//各样本点对应的网格大小 L

  52. h_VAL[i] = (G*L_VAL[i])/M; //各样本点对应的盒子高度 h

  53. r_VAL[i] = log10(1/(L_VAL[i]/(float)M));//各样本点对应的 r

  54. Grid_Num[i] = M/L_VAL[i];//各样本点对应的图像网格数目 Num

  55. }

  56. int m =0,n =0,t=0;

  57. int grid_lt_x =0,grid_lt_y =0,grid_rd_x =0,grid_rd_y =0;

  58. unsigned char grid_I_max =0 ,grid_I_min =0;

  59. int dbc_l =0 ,dbc_k =0 ,nr =0;

  60. int s=0,p =0,q =0 ,box_non_zero =0,box_zero_count = 0;

  61. int gray_k =0,gray_l =0;

  62. //计算 Nr

  63. for (k=0;k<L_point;k++)

  64. {

  65. //临时存储单个网格数据

  66. valarray<unsigned char> grid_img((unsigned char)0,L_VAL[k]*L_VAL[k]);

  67. for (m=0;m<Grid_Num[k];m++)

  68. {

  69. for (n=0;n<Grid_Num[k];n++)

  70. {

  71. //单个网格的坐标范围

  72. grid_lt_x = n*L_VAL[k];

  73. grid_lt_y = m*L_VAL[k];

  74. grid_rd_x = grid_lt_x + L_VAL[k] - 1;

  75. grid_rd_y = grid_lt_y + L_VAL[k] - 1;

  76. //复制数据

  77. t = 0;

  78. for (i=grid_lt_y;i<grid_rd_y;i++)

  79. {

  80. for (j=grid_lt_x;j<grid_rd_x;j++)

  81. {

  82. grid_img[t] = Img_Data[i*M + j];

  83. t++;

  84. }

  85. }

  86. grid_I_min = grid_img.min();

  87. grid_I_max = grid_img.max();

  88. //最小、最大灰度所在的网格高度

  89. dbc_k = grid_I_min/h_VAL[k];

  90. dbc_l = grid_I_max/h_VAL[k];

  91. //*******计算空盒子数目********//

  92. for(s=dbc_k;s<=dbc_l;s++)

  93. {

  94. //灰度上下限

  95. gray_k = s*h_VAL[k];

  96. gray_l = gray_k + h_VAL[k] - 1;

  97. //清零

  98. box_non_zero = 0;

  99. //落在指定盒子内的点数

  100. for(p=0;p<t-1;p++)

  101. {

  102. if((grid_img[p]>=gray_k)&&(grid_img[p]<=gray_l))

  103. box_non_zero++;

  104. }

  105. //空盒子

  106. if(box_non_zero == 0)

  107. box_zero_count++;

  108. }

  109. //Nr累加并剔除空盒子

  110. nr = dbc_l - dbc_k + 1 - box_zero_count;

  111. Nr_VAL[k] = Nr_VAL[k] + nr;

  112. //清零

  113. box_zero_count = 0;

  114. }

  115. }

  116. Nr_VAL[k] = log10(double(Nr_VAL[k]));

  117. grid_img.free();

  118. }

  119. //计算各样本点对应的理论斜率并保存

  120. fractal_D = Nr_VAL/r_VAL;

  121. ofstream outfile("F:\\Fractal_D.txt");//打开文件,准备写入

  122. for (j=0;j<L_point;j++)

  123. {

  124. outfile<<fractal_D[j]<<' '<<endl;//距离

  125. }

  126. outfile<<endl;

  127. outfile.close();//关闭文件,完成写入

  128. //****************************************//

  129. //最小二乘法拟合直线

  130. double A = 0.0;

  131. double B = 0.0;

  132. double C = 0.0;

  133. double D = 0.0;

  134. A = (r_VAL*r_VAL).sum();

  135. B = r_VAL.sum();

  136. C = (r_VAL*Nr_VAL).sum();

  137. D = Nr_VAL.sum();

  138. double fractal_k,fractal_b,tmp =0;

  139. if(tmp=(A*L_point-B*B))

  140. {

  141. fractal_k = (C*L_point-B*D)/tmp;

  142. fractal_b = (A*D-C*B)/tmp;

  143. }

  144. else

  145. {

  146. fractal_k = 1;

  147. fractal_b = 0;

  148. }

  149. //拟合得到的分形盒子维

  150. m_fractal_dim = fractal_k;

  151. m_fractal_shift = fractal_b;

  152. //释放所有 valarray对象

  153. Img_VAL.free();

  154. L_VAL.free();

  155. h_VAL.free();

  156. r_VAL.free();

  157. Nr_VAL.free();

  158. Grid_Num.free();

  159. fractal_D.free();

  160. }

算法效果:

FD = 2.73                           FD = 2.85

FD = 2.14                           FD = 2.16                     FD = 2.886

上图中黑色图像可能由于制图时截图所致,边缘像素以及图像品质变化,图像并非纯黑,且FD是由点拟合而来,所以此时的FD没能等于 2.由以上5幅图像可见,FD与纹理分布的细密、复杂程度符合得较好。

fractal 分形维数 盒子维 纹理特征相关推荐

  1. fractal 分形维数 盒子维 纹理特征

    分形  盒子维纹理特征 在纹理特征的提取中,纹理的分形维数特征(FD)是对纹理的一种重要描述.图像的纹理越复杂.细腻,则分形维数越大.提取分形维数特征的方法有很多种,理论以及计算的复杂度各有差异. 本 ...

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

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

  3. matlab盒子分形维数_分形:盒子维数

    今天主要想说的是,分形中的差分盒子维数的原理,基于分形的基础概念就不在这里说啦. 分形维数可以用于定量描述图像表面的空间复杂程度,能够定量的表现图像的纹理特征. 采用不同的维数进行纹理特征描述时,精度 ...

  4. 图像检索:几种基于纹理特征的图像检索算法

    from:图像检索:几种基于纹理特征的图像检索算法 本文节选自<基于纹理的图像检索算法研究>.描述了几种基于纹理特征的图像检索算法. 第 3 章基于纹理特征的图像检索 3.2 基于灰度共生 ...

  5. 常用的图像特征颜色特征、纹理特征、形状特征、空间关系特征

    http://www.360doc.com/content/10/0601/10/1412027_30625801.shtml 常用的图像特征有颜色特征.纹理特征.形状特征.空间关系特征. 一 颜色特 ...

  6. 颜色,形状,纹理特征

    FROM:http://blog.sina.com.cn/s/blog_661159d50100kij7.html References 1.       MPEG-7 overview(http:/ ...

  7. Glcm 灰度共生矩阵,保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现

    保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现 网络上Glcm的原理很多,但是实现的python代码我确实没找到,讲的也不是很清楚 此文介绍了如何在一张图 ...

  8. python图像纹理提取_提取图像的颜色、纹理特征(传统算法)

    Python-Image-feature-extraction Python实现提取图像的纹理.颜色特征,包含快速灰度共现矩阵(GLCM).LBP特征.颜色矩.颜色直方图.1044197988/Pyt ...

  9. 纹理特征描述及matlab实现

    纹理特征描述图像或图像区域所对应景物的表面性质,是图像中计算出来的一个值,它对区域变化的特征进行量化.纹理分析是通过一定的图像处理技术抽取纹理特征,从而获得纹理的定量或定性描述的处理过程. 灰度差分统 ...

  10. 常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。

    常用的图像特征有颜色特征.纹理特征.形状特征.空间关系特征. 一 颜色特征 (一)特点:颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质.一般颜色特征是基于像素点的特征,此时所有属于 ...

最新文章

  1. 教你如何玩转redis-简单消息队列
  2. Python中字符串的介绍以及常见操作
  3. 服务器系统安装ip配置,配置Win2008系统DNS服务器及主机的IP地址的具体步骤
  4. 如何让整个表格高度固定_Saas产品中,表格设计有哪些要点
  5. 鸿蒙系统还会推出吗,华为明年所有自研设备都升级鸿蒙系统,还会推出基于鸿蒙系统的新机...
  6. 平均年薪30万的深度学习算法工程师,正面临100万的人才缺口
  7. java duplicate parameter e_传递参数[duplicate]时出现问题
  8. ajax servlet怎么接收_【百战程序员从开始到植发】之AJAX
  9. matlab 读取视频出现的问题
  10. 机器学习实战(九)K-means(K-均值)
  11. HTTP缓存策略 304
  12. 新手先学java还是python_2018年,初学者学Java还是Python?统计数据给你答案
  13. mysql中主键数据类型_MySQL系列-详解mysql数据类型
  14. win7取消计算机密码怎么设置,Win7取消开机密码的方法
  15. 基于梯度下降算法求解线性回归
  16. uniapp H5 实现地图选址功能
  17. c++获取系统时间实例2
  18. UEFI版制作U盘启动盘重装系统
  19. 评四女作家的×龙戏凤 (原版)
  20. 给20块钱买可乐,每瓶可乐3块钱,喝完之后退瓶子可以换回1块钱,问最多可以喝到多少瓶可乐?

热门文章

  1. Matlab 官网培训 - 大型项目-风力发电机数据模型构建-Catching the Wind
  2. vue 后台翻译_vue实现在线翻译功能
  3. 联想d30做文件服务器,应对极限运算挑战 联想D30工作站评测
  4. FreeCAD源码分析:FreeCADApp模块
  5. Emmagee--APP性能测试工具的基本使用
  6. 非标自动化PLC编程设计
  7. 高等数学张宇18讲 第三讲 一元函数微分学的概念与计算
  8. 微信公众号获取openid流程
  9. ubuntu18.04安装有道词典等常用软件
  10. jq/js获取屏幕宽度和高度