转自https://zhuanlan.zhihu.com/p/37419809
https://zhuanlan.zhihu.com/p/34106431
https://www.zhihu.com/question/22453327/answer/30982004
Chaptina:分形分析软件zhuanlan.zhihu.com
承接上一篇文章,这里讲一下MATLAB工具箱FracLab计算Box-counting维数的方法。
分形维数的Box counting计算方法en.wikipedia.org
FracLab - 2.2project.inria.fr
如何添加MATLAB工具箱jingyan.baidu.com
2.数据预处理把感兴趣区域与背景区分开来以降低噪声干扰,也即是把RGB图像从一个三维的数据转换为一个二值的二维矩阵。
左侧双击你要操作的图片完成数据的导入,可以在右侧工作区看到导入后的矩阵数据
对导入后的矩阵数据进行操作,将其转化为二值数据,这里有一个我自己写的函数进行相应的转换操作:
function z = r2gb( data )
%函数的功能为将一个rgb图像数据转化为灰度数据、二值数据
gray_data = rgb2gray(data);
%把RGB图像(三维矩阵)转化成灰度图像,得到的gray_data是一个八阶灰度的二维矩阵
%这里的gray_data是uint8类型的数据,是不能被fraclab处理的
threshold = graythresh(gray_data);%自动确定二值化阈值
binary_data = im2bw(gray_data,threshold);%对图像进行二值化
%把一个灰度图像转化成二值图像,这里得到的binary_data是一个逻辑型数据,无法被FracLab识别
binary_data_double = double(binary_data);%把逻辑型数据转化成双精度的数值型数据以用于后续的操作
binary_data_reverse_double = double(~binary_data);%对二值数据求反并转换为数值型数据
%%=======================================这里很重要==========================================
%之所以要求反,是因为对于二值图像而言白色区域为1,黑色区域为0
%很多图像的图像特征是用黑色曲线来表征的,这样的图像经过二值化之后数值为1的点对应的是背景
%导致最终计算得到的是背景的分形维数而不是我们想要的曲线的分形维数,这种情况下需要对图像进行求反
%后续的数据操作对象为binary_data_reverse
%如果图像本身就是用白色曲线来表征它的特征,则后续的数据操作对象为binary_data
%%=======================================这里很重要==========================================
figure
subplot(2,2,1);imshow(gray_data);title('Grayscale Image');
subplot(2,2,2);imshow(binary_data_double);title('Binary Image');
subplot(2,2,3);imshow(binary_data_reverse_double);title('Reversal Binary Image');
assignin('base','binary_data_reverse',binary_data_reverse_double)
assignin('base','gray_data',gray_data)
assignin('base','binary_data',binary_data_double)
%将需要的中间变量呈现在工作区
end
这样的图片不需要求反
对输入的图像数据进行操作
r2gb(tri_8_610)%我这里用到的图像是一个迭代了八次的谢尔宾斯基三角形(理论分形维数为lg3/lg2≈1.58)
在工作区会生成如下三个变量
在命令行窗口输入如下命令
fraclab
调出fraclab的交互界面
fraclab界面
点击workspace,选择要处理的数据,这里选择的是binary_data_reverse(数据的选择参考上面程序里的注释),点击上面菜单栏里的Dimensions--Box dimension:box method--Binary Data,出现如下界面:
这里说明一下这里面各个参数的含义:
(1)Box Sizes
max size和min size分别是盒子的大小的上下限,是根据图片大小来自动计算的,这个一般不用修改;
# of box 是在上面那个上下限里选择多少种不同大小的盒子,也即是最后得到的图上的散点数;
progressio 是盒子大小的递进关系,幂律or线性,选择幂律得到的散点之间的间距是均匀的;
Aspect Ratio 选择默认即可;
(2)Regression
Type:散点图曲线拟合方式;
Range:自选或是自动,自选的话(图中的选项)点击“compute”会出来一个折线图由你自己选择拟合曲线的范围,如下图所示:
例如我选择如下图所示的范围,在图形的上部会显示估计得到的维数,相关系数和最大误差:
如果是自动的话,会由程序为你选择一个范围得到分形维数并在右下角显示:
可以看到计算得到的维数值与理论值1.58还是很接近的。