差分盒维数(differential box-counting,DBC),可以作为图像表面纹理粗糙程度的度量,因为它有很好的精确性和适用性,而且能满足计算效率和动态特性的要求。
处理流程:
对于一个M*M大小的图像,在三维空间中,(x,y)代表空间的位置,z代表其对应点的灰度值gray(x,y)。
1、 图像分块,s*s,r = s/M
2、 在每一个s*s的分块中,都有一个盒子柱s*s*s’。如果最大灰度值为G,通常为256,则G/s’ = M/s。
3、 计算每个分块的最大灰度值和最小灰度值,它们分别落在盒子k和l中,则
nr = k-l+1
4、 Nr = sum(nr), d = log(Nr) / log(1/r)
5、 对图像进行不同的分块,将最后结果进行最小二乘拟合。
QUESTION
1、 s’怎么理解?
s’表示需要多少个盒子覆盖整个灰度曲面。
2、 怎么理解灰度最大值和最小值落在盒子k和l中?
对图像进行分块,可能看成是对其按一定比例缩小的过程,对于灰度也要按照相同的比例缩小。比如分块大小为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