图像条纹分析:骨架化、长度测量及统计
该代码使用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);
代码解释:
- 读取图像: 使用
imread
函数读取原始图像。 - 图像二值化: 使用
imbinarize
函数将图像二值化,将图像转换为黑白图像。 - 骨架化操作: 使用
bwmorph
函数进行骨架化操作,将图像转换为细线条。 - 消除分支条纹: 使用
bwmorph
函数消除骨架中的分支条纹,确保只保留主干条纹。 - 计算条纹长度: 使用
regionprops
函数获取骨架中每个条纹的像素坐标,并计算条纹长度。 - 统计数据和图像展示: 计算并输出条纹长度的平均值、最大值、最小值和总条纹数量,并显示原始图像和骨架化图像。
错误原因:
错误信息 “错误使用 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 著作权归作者所有。请勿转载和采集!