该代码使用MATLAB对图像进行条纹分析,包括骨架化、长度测量、统计等操作,并展示结果。

% 读取原始图像
img = imread('7-1.tif');
% 将图像二值化
bw_img = imbinarize(img);
% 进行骨架化操作
skel_img = bwmorph(bw_img, 'skel', Inf);
% 消除分支条纹
branchpoints = bwmorph(skel_img, 'branchpoints');
endpoints = bwmorph(skel_img, 'endpoints');
skel_img = skel_img & ~(branchpoints | endpoints);
skel_img = bwareaopen(skel_img, 3); % 消除小于3个像素的骨架区域

% 计算条纹长度
pixel_size = 0.0595; % 纳米/像素
skel_props = regionprops(skel_img, 'PixelList');
stripe_lengths = [];
for i = 1:length(skel_props)
    stripe_pixels = skel_props(i).PixelList;
    if size(stripe_pixels, 1) >= 3
        stripe_length = 0;
        for j = 1:size(stripe_pixels, 1)
            if j < size(stripe_pixels, 1) && abs(stripe_pixels(j, 1) - stripe_pixels(j+1, 1)) == 1 && abs(stripe_pixels(j, 2) - stripe_pixels(j+1, 2)) == 1
                % 对角线像素长度为2倍像素大小
                stripe_length = stripe_length + 2 * pixel_size;
            else
                stripe_length = stripe_length + pixel_size;
            end
        end
        if stripe_length >= 0.483 % 剔除长度小于0.483 nm的条纹
            stripe_lengths(end+1) = stripe_length;
        end
    end
end

% 统计数据和图像展示
mean_length = mean(stripe_lengths);
max_length = max(stripe_lengths);
min_length = min(stripe_lengths);
num_stripes = length(stripe_lengths);
figure;
subplot(1, 2, 1); imshow(img); title('Original Image');
subplot(1, 2, 2); imshow(skel_img); title(sprintf('Skeletonized Image
%d stripes found', num_stripes));
fprintf('Mean length: %.3f nm
', mean_length);
fprintf('Maximum length: %.3f nm
', max_length);
fprintf('Minimum length: %.3f nm
', min_length);

代码解释:

  1. 读取图像: 使用 imread 函数读取原始图像。
  2. 图像二值化: 使用 imbinarize 函数将图像二值化,将图像转换为黑白图像。
  3. 骨架化操作: 使用 bwmorph 函数进行骨架化操作,将图像转换为细线条。
  4. 消除分支条纹: 使用 bwmorph 函数消除骨架中的分支条纹,确保只保留主干条纹。
  5. 计算条纹长度: 使用 regionprops 函数获取骨架中每个条纹的像素坐标,并计算条纹长度。
  6. 统计数据和图像展示: 计算并输出条纹长度的平均值、最大值、最小值和总条纹数量,并显示原始图像和骨架化图像。

错误原因:

错误信息 “错误使用 bwmorph 第 1 个输入, BW, 应为 二维。” 表明 bwmorph 函数需要二维矩阵作为输入,而代码中 skel_img 矩阵可能不是二维矩阵。

修改后的代码:

skel_img = skel_img & ~(branchpoints | endpoints); 之后,添加 skel_img = bwareaopen(skel_img, 3);,这将消除小于3个像素的骨架区域,确保 skel_img 矩阵为二维矩阵。

注意:

代码中 pixel_size 的值应根据实际图像的像素尺寸进行调整。

图像条纹分析:骨架化、长度测量及统计

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

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