MATLAB图像分析:条纹长度测量与统计

本代码使用MATLAB对图像进行分析,通过骨架化、消除分支条纹等操作,计算图像中条纹的长度并进行统计。代码包含详细解释,并对常见错误进行了修正。

代码实现

% 读取图像
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. 读取图像: 使用 imread 函数读取名为 '7-1.tif' 的图像文件。
  2. 二值化: 使用 im2bw 函数将图像转换为二值化矩阵。
  3. 骨架化: 使用 bwmorph 函数对二值化图像进行骨架化操作,提取出图像中的线条。
  4. 消除分支条纹: 使用 bwmorph 函数对骨架化后的图像进行分支条纹消除操作,只保留主要线条。
  5. 计算条纹长度:
    • 遍历骨架化后的图像,找到所有值为1的像素点。
    • 对每个像素点,判断其是否为对角线像素。如果是,则条纹长度为空间分辨率的两倍;否则,条纹长度为空间分辨率的一倍。
    • 使用 bwlabel 函数对骨架化后的图像进行连通域标记,找出当前像素所在的连通域,并计算连通域中的像素数量。
    • 计算当前像素所在连通域的长度:像素数量乘以像素大小。
    • 将大于等于0.483纳米的条纹长度加入长度数组 lengths 中。
  6. 统计数据: 使用 meanmaxminlength 函数计算条纹长度的平均值、最大值、最小值和数量。
  7. 图像展示: 使用 histogram 函数绘制条纹长度的直方图。

错误修正

  1. 索引越界: 由于骨架化操作和消除分支条纹操作会使图像边缘产生一圈宽度为1的黑色像素,因此在计算条纹长度时,需要限制 i 和 j 的取值范围,避免越界。在代码中,将循环的起始和结束位置分别改为 2 和 size(skel_pruned, 1)-1,size(skel_pruned, 2)-1。
  2. 连通域标记: 在计算条纹长度时,需要先用 bwlabel 函数对骨架化后的图像进行连通域标记,找出当前像素所在的连通域,并计算连通域中的像素数量。
  3. 对角线像素: 在计算条纹长度时,需判断当前像素是否为对角线像素。如果是,则条纹长度为空间分辨率的两倍;否则,条纹长度为空间分辨率的一倍。
  4. 消除短条纹: 为了消除短条纹,只有当条纹长度大于等于0.483纳米时,才将其加入长度数组 lengths 中。

总结

本代码通过骨架化、消除分支条纹、连通域标记等操作,计算了图像中条纹的长度并进行了统计。代码包含详细解释,并对常见错误进行了修正,为图像分析提供了一个实用参考。


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

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