MATLAB用豪斯道夫维数算一张图片的维数

在分形维数中利用豪斯道夫维数用MATLAB编程,算一张图片的维数

豪斯道夫维数(Hausdorff dimension)是一种分形维数的计算方法,它可以通过在图像上覆盖一系列的正方形或圆形来计算。具体来说,假设对于长度为l的正方形或圆形,需要n(l)个这样的正方形或圆形才能完全覆盖整个图像,那么该图像的豪斯道夫维数就可以通过以下公式计算:

$d_H = \lim_{l\to0} \frac{\log(n(l))}{\log(1/l)}$

其中,$d_H$ 表示豪斯道夫维数。

下面给出一个简单的 MATLAB 实现代码:

% 读入图像
img = imread('test.png');

% 将图像转换为二值图像
bw_img = im2bw(img);

% 选择正方形边长范围
ls = 1:1:30;

% 计算每个边长下的覆盖数量
n = arrayfun(@(l) coverCount(bw_img, l), ls);

% 计算豪斯道夫维数
dh = polyfit(log(ls), log(n), 1);
dh = dh(1);

% 显示结果
disp(['豪斯道夫维数: ' num2str(dh)]);

% 绘制 log-log 图像
plot(log(ls), log(n), 'o');
xlabel('log(l)');
ylabel('log(n)');
title(['Hausdorff dimension: ' num2str(dh)]);

function n = coverCount(img, l)
    % 计算每个边长下的覆盖数量
    [h, w] = size(img);
    n = 0;
    for x = 1:l:w-l+1
        for y = 1:l:h-l+1
            if any(any(img(y:y+l-1, x:x+l-1)))
                n = n + 1;
            end
        end
    end
end

该代码读入一张图像(假设为 test.png),将其转换为二值图像,然后选择正方形边长范围,并计算每个边长下的覆盖数量。最后,通过线性拟合计算豪斯道夫维数,并在 log-log 图像上绘制出结果。

需要注意的是,在实际操作中,覆盖数量的计算需要消耗大量计算资源,因此需要选择合适的正方形边长范围,并通过并行计算等方法提高计算效率。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/263215
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:MATLAB 如何在二维矩阵中快速找到最大值的位置
  • 除此之外, 这篇博客: MATLAB张正友标记法对双目摄像头进行标定中的 第七步、使用MATLAB中的标定工具 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在这里插入图片描述
    在这里插入图片描述

    一次性导入20张左目的照片

    在这里插入图片描述

    这里填棋盘的宽度,我是A4纸打印的是24mm(尺子量的)
    具体需要你们去亲自量一下啦

    在这里插入图片描述

    等待MATLAB计算好就行啦

    在这里插入图片描述

    标点计算完了就会告诉你有多少个是可以用的,有多少个是无效的图像

    在这里插入图片描述

  • 您还可以看一下 苏金明老师的MATLAB数据可视化实现课程中的 半对数坐标图小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    我理解您的问题是想使用MATLAB中的豪斯道夫维数计算一张图片的分形维数,您希望得到一个详细的解决方案。

    解决方案如下:

    Step 1: 导入图片和豪斯道夫维数函数 首先需要将要处理的图片导入到MATLAB中,可以使用imread函数。然后我们需要使用MATLAB自带的豪斯道夫维数函数"HausdorffDimension"来计算分形维数,请确保该函数已经被成功导入。可以在MATLAB命令窗口中输入doc HausdorffDimension来查看有关该函数的详细信息。

    % 读入图片
    img = imread("your_image_path.jpg");
    % 导入豪斯道夫维数函数
    addpath(genpath("your_HausdorffDimension_function_path"));
    

    Step 2: 生成二值图像 豪斯道夫维数函数要求输入的图像为二值图像,即只有黑和白两种颜色。因此我们需要将导入的彩色图像转换成二值图像。可以使用MATLAB自带的rgb2gray函数将彩色图像转换为灰度图像,并使用imbinarize函数将灰度图像转换为二值图像。

    % 转换为灰度图像
    gray_img = rgb2gray(img);
    % 转换为二值图像
    bin_img = imbinarize(gray_img);
    

    Step 3: 计算分形维数 使用豪斯道夫维数函数计算分形维数。该函数输入的是二值图像的像素坐标,然后计算包覆该图像的最小矩形的边长的对数。可以使用MATLAB自带的find函数来寻找二值图像中的像素坐标。

    % 计算分形维数
    [hd,~,~]=HausdorffDimension(find(bin_img));
    disp(hd);
    

    Step 4: 可视化分形维数 最后可以使用MATLAB自带的imshow函数将二值图像和分形维数可视化。

    % 可视化分形维数和二值图像
    figure;
    subplot(1,2,1); imshow(bin_img); title('Binary image');
    subplot(1,2,2); imshow(img); title(sprintf('Fractal Dimension=%.2f',hd));
    

    关于该问题的prompt,可以提供以下信息:

    • 使用MATLAB中自带的豪斯道夫维数函数来计算分形维数。
    • 图片需要转换为二值图像。
    • 可以使用MATLAB自带的函数来将彩色图像转换为灰度图像和二值图像。
    • 最后可以使用MATLAB自带的imshow函数来可视化结果。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^