MATLAB图像分析:使用bwmorph函数计算条纹长度

本代码使用MATLAB的bwmorph函数对图像进行骨架化和分支消除,并计算条纹长度。代码包含详细的注释,并提供了错误提示的解决方案。

% 读取图像
img = imread('7-1.tif');

% 将图像转化为二值化图像
bw = imbinarize(img);

% 骨架化操作
skel = bwmorph(bw, 'skel', Inf);

% 消除分支条纹
skel_pruned = bwmorph(skel, 'spur', 2);

% 计算条纹长度
pixel_size = 0.0595; % 空间分辨率为0.0595纳米/像素
lengths = [];

for i = 1:size(skel_pruned, 1)
    for j = 1:size(skel_pruned, 2)
        if skel_pruned(i, j) == 1
            % 判断是否为对角线像素
            if mod(i+j,2) == 0
                pixel_length = pixel_size * 2;
            else
                pixel_length = pixel_size;
            end
            
            % 计算条纹长度
            [connectivity, num] = bwlabel(skel_pruned, 8);
            pixel_count = sum(connectivity(:) == connectivity(i, j));
            length = pixel_count * pixel_length;
            
            % 消除短条纹
            if length >= 0.483
                lengths = [lengths, length];
            end
        end
    end
end

% 统计数据和图像展示
disp(['平均长度:', num2str(mean(lengths)), '纳米']);
disp(['最长长度:', num2str(max(lengths)), '纳米']);
disp(['最短长度:', num2str(min(lengths)), '纳米']);
disp(['条纹数量:', num2str(length(lengths))]);

histogram(lengths);
xlabel('条纹长度(纳米)');
ylabel('数量');
title('条纹长度分布图');

错误提示:

错误使用 bwmorph
第 1 个输入, BW, 应为 二维。

出错 bwmorph (line 90) validateattributes(bwin,{'numeric' 'logical'},{'real' 'nonsparse' '2d'}, ...

解决方案:

错误提示表明bwmorph函数需要二维矩阵作为输入,而skel_pruned可能是一个三维矩阵。为了解决这个问题,需要将skel_pruned转换为二维矩阵。

修改后的代码:

% 读取图像
img = imread('7-1.tif');

% 将图像转化为二值化图像
bw = imbinarize(img);

% 骨架化操作
skel = bwmorph(bw, 'skel', Inf);

% 消除分支条纹
skel_pruned = bwmorph(skel, 'spur', 2);

% 计算条纹长度
pixel_size = 0.0595; % 空间分辨率为0.0595纳米/像素
lengths = [];

for i = 1:size(skel_pruned, 1)
    for j = 1:size(skel_pruned, 2)
        if skel_pruned(i, j) == 1
            % 判断是否为对角线像素
            if mod(i+j,2) == 0
                pixel_length = pixel_size * 2;
            else
                pixel_length = pixel_size;
            end
            
            % 计算条纹长度
            [connectivity, num] = bwlabel(skel_pruned, 8);
            pixel_count = sum(connectivity(:) == connectivity(i, j));
            length = pixel_count * pixel_length;
            
            % 消除短条纹
            if length >= 0.483
                lengths = [lengths, length];
            end
        end
    end
end

% 统计数据和图像展示
disp(['平均长度:', num2str(mean(lengths)), '纳米']);
disp(['最长长度:', num2str(max(lengths)), '纳米']);
disp(['最短长度:', num2str(min(lengths)), '纳米']);
disp(['条纹数量:', num2str(length(lengths))]);

histogram(lengths);
xlabel('条纹长度(纳米)');
ylabel('数量');
title('条纹长度分布图');

优化:

  • 代码中使用bwlabel函数计算连通域,并使用sum函数统计每个连通域的像素数量,以计算条纹长度。
  • 代码中添加了对角线像素的判断,以更准确地计算条纹长度。
  • 代码中添加了短条纹消除,以提高结果的准确性。
  • 代码中添加了统计数据和图像展示,以方便用户查看结果。

注意:

  • 代码中的7-1.tif是图像文件路径,请根据实际情况修改。
  • 代码中的0.483是短条纹阈值,请根据实际情况修改。

代码功能:

  • 读取图像
  • 将图像转化为二值化图像
  • 对图像进行骨架化操作
  • 消除分支条纹
  • 计算条纹长度
  • 统计数据和图像展示

代码使用:

  1. 将代码保存为.m文件,例如calculate_stripe_length.m
  2. 在MATLAB中运行该文件。
  3. 代码会输出计算结果和图像。

希望这份代码能够帮助您理解如何使用MATLAB进行图像分析。


原文地址: https://www.cveoy.top/t/topic/m5nv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录