使用MATLAB提取和分析条纹长度

本教程将演示如何使用MATLAB从图像中提取条纹,计算其长度并绘制条纹长度直方图。

步骤:

  1. 读入图像:

    % 读入原始图像
    img = imread('7-1.tif');
    
  2. 转换为灰度图像:

    % 转换为灰度图像
    gray_img = rgb2gray(img);
    
  3. 二值化图像:

    % 二值化图像
    bw_img = imbinarize(gray_img);
    
  4. 骨架化操作:

    % 骨架化操作
    skel_img = bwmorph(bw_img, 'skel', Inf);
    
  5. 计算像素长度:

    pixel_size = 0.0595; % 空间分辨率为0.0595(纳米/像素)
    
  6. 去除端点和分支点:

    skel_img_diag = diag(skel_img);
    skel_img_diag(skel_img_diag == 1) = 2 * pixel_size;
    skel_img(skel_img_diag == 2 * pixel_size) = 0;
    
    % 消除分支条纹
    branch_points = bwmorph(skel_img, 'branchpoints');
    end_points = bwmorph(skel_img, 'endpoints');
    skel_img(branch_points) = 0;
    skel_img(end_points) = 0;
    
  7. 提取条纹:

    % 提取条纹
    cc = bwconncomp(skel_img);
    skel_props = regionprops(cc, 'PixelIdxList', 'PixelList', 'Area');
    
  8. 计算条纹长度:

    % 计算条纹长度
    skel_lengths = zeros(numel(skel_props), 1);
    for i = 1:numel(skel_props)
        skel_length = skel_props(i).Area * pixel_size;
        skel_lengths(i) = skel_length;
    end
    
  9. 消除短条纹:

    % 消除短条纹
    long_skel_lengths = skel_lengths(skel_lengths >= 0.483,:);
    
  10. 统计数据和图像展示:

% 统计数据和图像展示
disp(['Total number of stripes: ', num2str(numel(skel_props))]);
disp(['Total length of stripes: ', num2str(sum(skel_lengths)), ' nm']);
disp(['Number of long stripes: ', num2str(numel(long_skel_lengths))]);
disp(['Total length of long stripes: ', num2str(sum(long_skel_lengths)), ' nm']);

figure; imshow(img); hold on;
for i = 1:numel(skel_props)
    plot(skel_props(i).PixelList(:, 1), skel_props(i).PixelList(:, 2), 'r');
end
title('Skeletonized Stripes');

figure; histogram(long_skel_lengths, 'BinWidth', 1);
xlabel('Stripe Length (nm)');
ylabel('Frequency');
title('Histogram of Long Stripes');

代码解释:

  • bwmorph(bw_img, 'skel', Inf) 使用形态学操作对二值图像进行骨架化,得到条纹的中心线。
  • regionprops(cc, 'PixelIdxList', 'PixelList', 'Area') 计算每个连通域的面积,像素列表和索引列表,用于确定条纹的长度。
  • skel_lengths(skel_lengths >= 0.483,:) 用于筛选出长度大于0.483纳米的条纹。
  • 最后,使用histogram 函数绘制长条纹的直方图。

注意:

在消除短条纹时,需要确保 skel_lengths 是一个列向量,才能正确地使用索引。

结果:

本代码将显示:

  • 原始图像上叠加的骨架化条纹。
  • 长条纹长度的直方图。
  • 统计信息:条纹总数、总长度、长条纹数量和长条纹总长度。

应用:

本代码可以应用于各种领域,例如材料科学,用于分析材料的纳米结构,或生物学,用于分析细胞内的微管结构。

更多信息:

MATLAB图像处理:提取和分析条纹长度

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

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