读取图像 img = imread7-1tif; 将图像转为二值化矩阵 bw = im2bwimg; 骨架化操作 skel = bwmorphbw skel Inf; 消除分支条纹 skel_pruned = bwmorphskel spur 2; 计算条纹长度 pixel_size = 00595; 空间分辨率为00595纳米像素 lengths = ; for i = 1sizesk
以下是修改后的代码和解释:
% 读取图像 img = imread('7-1.tif');
% 将图像转为二值化矩阵 bw = im2bw(img);
% 骨架化操作 skel = bwmorph(bw, 'skel', Inf);
% 消除分支条纹 skel_pruned = bwmorph(skel, 'spur', 2);
% 计算条纹长度 pixel_size = 0.0595; % 空间分辨率为0.0595纳米/像素 lengths = [];
for i = 2:size(skel_pruned, 1)-1 % 修改1:限制 i 和 j 的取值范围,避免越界 for j = 2:size(skel_pruned, 2)-1 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('条纹长度分布图');
修改1:由于骨架化操作和消除分支条纹操作会使图像边缘产生一圈宽度为1的黑色像素,因此在计算条纹长度时,需要限制 i 和 j 的取值范围,避免越界。
修改2:在计算条纹长度时,需要先用 bwlabel 函数对骨架化后的图像进行连通域标记,找出当前像素所在的连通域,并计算连通域中的像素数量。
修改3:在计算条纹长度时,需判断当前像素是否为对角线像素。如果是,则条纹长度为空间分辨率的两倍;否则,条纹长度为空间分辨率的一倍。
修改4:为了消除短条纹,只有当条纹长度大于等于0.483纳米时,才将其加入长度数组 lengths 中。
原文地址: https://www.cveoy.top/t/topic/bBiU 著作权归作者所有。请勿转载和采集!