差分盒维数的计算方法

差分盒维数(differential box-counting,DBC),可以作为图像表面纹理粗糙程度的度量,因为它有很好的精确性和适用性,而且能满足计算效率和动态特性的要求。

 

处理流程:

对于一个M*M大小的图像,在三维空间中,(x,y)代表空间的位置,z代表其对应点的灰度值gray(x,y)

1、 图像分块,s*sr = s/M

2、 在每一个s*s的分块中,都有一个盒子柱s*s*s’。如果最大灰度值为G,通常为256,G/s’ = M/s

3、 计算每个分块的最大灰度值和最小灰度值,它们分别落在盒子kl中,则

nr = k-l+1

4、 Nr = sum(nr) d = log(Nr) / log(1/r)

5、 对图像进行不同的分块,将最后结果进行最小二乘拟合。

 

QUESTION

1、 s’怎么理解?

s’表示需要多少个盒子覆盖整个灰度曲面。

2、 怎么理解灰度最大值和最小值落在盒子kl中?

对图像进行分块,可能看成是对其按一定比例缩小的过程,对于灰度也要按照相同的比例缩小。比如分块大小为2*2,图像大小为256*256,则k = maxgray/(256/2),同样,l = mingray /(256/2)

 

代码实现:

function fd=box_frac_dem(X); 
% 差分盒维数 
% Example: 
%    X=double(imread('rice.tif')); 
%    fd=box_frac_dem(X); 

if size(X,1)~=size(X,2);  %M*N维图像,检查M和N是否相等
   error('The size of X must NxN.'); 
end 
B=size(X,1); 
if mod(log2(B),1)>0; 
   error('The size of X must 2^n'); %图像的大小必须是2的N次方
end 
t=log2(B); %假设图像大小为256*256,则t = 8
s=2.^(1:t); % s = 2,4,8,16,32,64,128,256 求2的幂
Nr=zeros(1,t); % nr = 0     0     0     0     0     0     0     0
for k=1:t; 
   d=s(k);   %设定不同的窗口大小
   h=256/d; % Let B instead of 256 for the size [2^nX2^n] 
   for m=1:h; 
       for n=1:h; 
           A=X(d*(m-1)+[1:d],d*(n-1)+[1:d]);  %分块,存储到A 
           mn=min(A(1:end));   %最小灰度值
           mx=max(A(1:end));  %最大灰度值
           nr=fix(mx/d)-fix(mn/d)+1;  %取整运算
           Nr(k)=Nr(k)+nr; 
       end 
   end 
end 
r=B./s; 
p=polyfit(log10(r),log10(Nr),1); %最小二乘拟合
fd=p(1); 

一维空间的分数维大于1.0小于2.0,二维空间的分数为大于2.0小于3.0。

参考文献:

An efficient differential box-counting approach to compute fractal dimension of image

你可能感兴趣的:(机器视觉)