multifractal.m
上传用户:zqlong1979
上传日期:2021-08-17
资源大小:1k
文件大小:3k
源码类别:

分形几何

开发平台:

Matlab

  1. %%
  2. % Author: Tegy J. Vadakkan
  3. % Date: 09/08/2009 
  4. % input a binary image
  5. % the multifractal spectra is calculated based on the ideas in the paper by
  6. % Posadas et al., Soil Sci. Soc. Am. J. 67:1361-1369, 2003
  7. clc;
  8. clear all;
  9. close all;
  10. %%
  11. indata=inputdlg({'input filename'});
  12. a = imread(indata{1});
  13. [rows, cols] = size(a);
  14. figure;imshow(a);
  15. npix = sum(sum(a));
  16. %% calculates niL which is the number of pixels in the ith box of size L 
  17. % ideas from boxcount.m by F. Moisy have been borrowed here
  18. width = rows;
  19. p = log(width)/log(2);
  20. max_boxes = power(rows,2)/power(2,2);
  21. nL = double(zeros(max_boxes,p));
  22. for g=(p-1):-1:0
  23.             siz = 2^(p-g);
  24.             sizm1 = siz - 1;
  25.             index = log2(siz);
  26.             count = 0;
  27.             for i=1:siz:(width-siz+1)
  28.                 for j=1:siz:(width-siz+1)
  29.                     count = count + 1;
  30.                     sums = sum(sum(a(i:i+sizm1,j:j+sizm1)));
  31.                     nL(count,index) = sums;
  32.                 end
  33.             end
  34. end
  35. %%
  36. qran = 1;
  37. logl = zeros(p,1);
  38. for l=1:p
  39.     logl(l) = log(power(2,l));
  40. end
  41. %% normalized masses
  42. pL = double(zeros(max_boxes,p));
  43. for l=1:p
  44.     nboxes = power(rows,2)/power(power(2,l),2);
  45.     norm = sum(nL(1:nboxes,l));
  46.     if(norm ~= npix)
  47.         display('error');
  48.     end
  49.     for i=1:nboxes
  50.         pL(i,l) = nL(i,l)/norm;
  51.     end
  52. end
  53. %%
  54. %falpha, alpha
  55. for l=1:p
  56.     
  57.     count = 0;
  58.     nboxes = power(rows,2)/power(power(2,l),2);
  59.     
  60.     for q = -qran:+0.1:qran       
  61.         
  62.         %denominator of muiql
  63.         qsum = 0.0;
  64.         for i=1:nboxes
  65.             if(pL(i,l) ~= 0)
  66.                 qsum = qsum + power(pL(i,l),q);
  67.             end
  68.         end
  69.  
  70.         fqnum = 0.0;
  71.         aqnum = 0.0;
  72.         smuiqL = 0.0;
  73.         for i=1:nboxes
  74.             if(pL(i,l) ~= 0)
  75.                   muiqL = power(pL(i,l),q)/qsum;
  76.                   fqnum = fqnum + (muiqL * log(muiqL));
  77.                   aqnum = aqnum + (muiqL * log(pL(i,l)));
  78.                   smuiqL = smuiqL + muiqL;
  79.             end 
  80.         end
  81.         if(uint8(smuiqL)~=1)
  82.             display('error');
  83.         end
  84.         
  85.         count = count + 1;
  86.         fql(l,count) = fqnum;
  87.         aql(l,count) = aqnum;
  88.         qval(count) = q;
  89.     end
  90. end
  91. %%
  92. % alpha_q
  93. for i=1:count
  94.      line = polyfit(logl,aql(:,i),1);
  95.      aq(i) = line(1);
  96.      yfit = polyval(line,logl);
  97.      sse = sum(power(aql(:,i)-yfit,2));
  98.      sst = sum(power(aql(:,i)-mean(aql(:,i)),2));
  99.      ar2(i) = 1-(sse/sst);
  100. end
  101. % f_q
  102. for i=1:count
  103.      line = polyfit(logl,fql(:,i),1);
  104.      fq(i) = line(1);
  105.      yfit = polyval(line,logl);
  106.      sse = sum(power(fql(:,i)-yfit,2));
  107.      sst = sum(power(fql(:,i)-mean(fql(:,i)),2));
  108.      fr2(i) = 1-(sse/sst);
  109. end
  110. figure;plot(qval,aq,'r:o',qval,fq,'g:o');
  111. h = legend('alpha(q)','f(q)',1); 
  112. xlabel('q','FontSize',14);
  113. figure;plot(aq,fq,'r:o');
  114. xlabel('alpha(q)','FontSize',14);
  115. ylabel('f(q)','FontSize',14);
  116. line=polyfit(aq,fq,2);
  117. pfit = polyval(line,aq);
  118. figure;plot(aq,fq,'r:o',aq,pfit,'g:o');
  119. h = legend('f(q)','Parabolic fit to f(q)',3); 
  120. xlabel('alpha(q)','FontSize',14);