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);
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('条纹长度分布图');
代码说明:
- 读取图像: 使用
imread()
函数读取名为 '7-1.tif' 的图像文件。 - 二值化: 使用
imbinarize()
函数将图像转换为二值图像,以便进行后续处理。 - 骨架化: 使用
bwmorph()
函数对二值图像进行骨架化操作,将图像简化为一个单像素宽的骨架。 - 消除分支条纹: 使用
bwmorph()
函数消除骨架中的短分支条纹,从而得到更清晰的条纹结构。 - 计算条纹长度: 遍历骨架化后的图像,计算每个像素所在的条纹长度。
- 统计数据和图像展示: 计算并显示条纹的平均长度、最长长度、最短长度和数量,并绘制条纹长度分布直方图。
代码中的错误:
原始代码中错误使用 bwmorph()
函数,导致出现 出错 bwmorph (line 90) validateattributes(bwin,{'numeric' 'logical'},{'real' 'nonsparse' '2d'}, ...
错误。这是因为 bwmorph()
函数要求输入必须是二维矩阵,而原始代码中 bwlabel()
函数的返回值 connectivity
是一个三维矩阵,导致错误。
代码修改:
将 bwlabel()
函数的返回值 connectivity
改为 connectivity(:)
,将其转换为一维向量,即可解决问题。
完整代码:
% 读取图像
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);
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('条纹长度分布图');
原文地址: http://www.cveoy.top/t/topic/m5k6 著作权归作者所有。请勿转载和采集!