demo.m
上传用户:cz_hongli
上传日期:2015-05-14
资源大小:1613k
文件大小:5k
源码类别:

分形几何

开发平台:

Matlab

  1. %% 1D, 2D and 3D Box-counting
  2. % F. Moisy, 22 nov 2006
  3. % FAST, Univ. Paris Sud, CNRS UMR 7608
  4. %% About boxcount
  5. % This file illustrates how to use the function 'boxcount' to compute the
  6. % fractal dimension of 1D, 2D or 3D sets, using the 'box-counting' method
  7. % (Minkowski-Bouligand dimension, or Kolmogorov capacity, or Kolmogorov
  8. % dimension, or simply box-counting dimension).
  9. %
  10. % Three sample images are provided in the directory,  and an additional
  11. % function 'randcantor' to generate 1D, 2D and 3D generalized random Cantor
  12. % sets.
  13. %
  14. % Type 'help boxcount' or 'help randcantor' for more details.
  15. %
  16. % To learn more about box-counting, fractals and fractal dimensions:
  17. % - http://en.wikipedia.org/wiki/Fractal 
  18. % - http://en.wikipedia.org/wiki/Box_counting_dimension
  19. % - http://mathworld.wolfram.com/Fractal.html
  20. % - http://mathworld.wolfram.com/CapacityDimension.html
  21. %% Box-counting of a 2D image
  22. % Let's start with the image 'dla.gif', a 800x800 logical array (i.e., it
  23. % contains only 0 and 1). It originates from a numerical simulation of a
  24. % "Diffusion Limited Aggregation" process, in which particles move randomly
  25. % until they hit a central seed.
  26. % (see P. Bourke, http://local.wasp.uwa.edu.au/~pbourke/fractals/dla/)
  27. c = imread('dla.gif');
  28. imagesc(~c)
  29. colormap gray
  30. axis square
  31. %%
  32. % Calling boxcount without output arguments simply displays N (the number
  33. % of boxes needed to cover the set) as a function of R (the size of the
  34. % boxes). If the set is a fractal, then a power-law  N = N0 * R^(-DF)
  35. % should appear, with DF the fractal dimension (Kolmogorov capacity).
  36. boxcount(c)
  37. %%
  38. % The result of the box count can be obtained using:
  39. [n, r] = boxcount(c)
  40. loglog(r, n,'bo-', r, (r/r(end)).^(-2), 'r--')
  41. xlabel('r')
  42. ylabel('n(r)')
  43. legend('actual box-count','space-filling box-count');
  44. %%
  45. % The red dotted line shows the scaling N(R) = R^-2 for comparision,
  46. % expected for a space-filling 2D image. The discrepancy between the two
  47. % curves indicates a possible fractal behaviour.
  48. %% Local scaling exponent
  49. % If the set has some fractal properties over a limited range of box size
  50. % R, this may be appreciated by plotting the local exponent,
  51. % D(R) = - d ln N / ln R.  For this, use the option 'slope':
  52. boxcount(c, 'slope')
  53. %%
  54. % Strictly speaking, the local exponent is not constant, but lies in the
  55. % range [1.6 1.8].
  56. %%
  57. % Let's try now with another image, the so-called Apollonian gasket
  58. % (Wikipedia, http://en.wikipedia.org/wiki/Image:Apollonian_gasket.gif).
  59. % The background level is 198 for this image, so this value is used to
  60. % binarize the image:
  61. c = imread('Apollonian_gasket.gif');
  62. c = (c<198);
  63. imagesc(~c)
  64. colormap gray
  65. axis square
  66. figure
  67. boxcount(c)
  68. figure
  69. boxcount(c,'slope')
  70. %%
  71. % The local slope shows that the image is indeed approximately fractal,
  72. % with a fractal dimension DF = 1.4 +/- 0.1 for scales R < 100.
  73. %% Box-counting of a natural image.
  74. % Consider now this RGB (2272x1704) picture of a tree (J.A. Adam,
  75. % http://epod.usra.edu/archive/images/fractal_tree.jpg):
  76. c = imread('fractal_tree.jpg');
  77. image(c)
  78. axis image
  79. %%
  80. % Let's extract a rectangle in the blue (3rd) plane, and binarize the
  81. % image for levels < 80 (white pixels are logical 'true'):
  82. i = c(1:1200, 120:2150, 3);
  83. bi = (i<80);
  84. imagesc(bi)
  85. colormap gray
  86. axis image
  87. %%
  88. [n,r] = boxcount(bi,'slope');
  89. %%
  90. % The boxcount shows that the local exponent is approximately constant for
  91. % less than one decade, in the range 8 < R < 128 (the 'exact' value of Df
  92. % depends on the threshold, 80 gray levels here):
  93. df = -diff(log(n))./diff(log(r));
  94. disp(['Fractal dimension, Df = ' num2str(mean(df(4:8))) ' +/- ' num2str(std(df(4:8)))]);
  95. %% Generalized random Cantor sets
  96. % Fractal sets may be obtained from an IFS (iterated function system).
  97. % For example, the function 'randcantor' generates a 1D, 2D or 3D
  98. % generalized random Cantor set. This set is obtained by iteratively
  99. % dividing an initial set filled with 1 into 2^D subsets, and setting each
  100. % subset to 0 with probability P. The result is a fractal set (or "fractal
  101. % dust") of dimension DF = D + log(P)/log(2) < D.
  102. %%
  103. % The following example generates a 2048x2048 image with probability P=0.8,
  104. % i.e. fractal dimension DF = 1.678.
  105. c = randcantor(0.8, 2048, 2);
  106. imagesc(~c)
  107. colormap gray
  108. axis image
  109. %%
  110. % Let's see its box-count and local exponent
  111. boxcount(c)
  112. figure
  113. boxcount(c, 'slope')
  114. %%
  115. % For such set generated by an iterated scheme, the local slope shows as
  116. % expected a well defined plateau, around DF = 1.68.
  117. %% 1D random Cantor set
  118. % 1D random Cantor sets may also be generated. Here, a 2^18 = 262144 long
  119. % set with P = 0.9 and expected fractal dimension DF = 1 + log(P)/log(2) =
  120. % 0.848:
  121. tic
  122. c = randcantor(0.9, 2^18, 1, 'show');
  123. figure
  124. boxcount(c, 'slope');
  125. toc
  126. %% 3D random Cantor set
  127. % Now a 3D random Cantor set of size (2^7)^3 = 128^3 with P = 0.7 and
  128. % expected fractal dimension DF = 3 + log(P)/log(2) = 2.485 (no display
  129. % for 3D sets):
  130. tic
  131. c = randcantor(0.7, 2^7, 3);
  132. toc
  133. tic
  134. boxcount(c, 'slope');
  135. toc