使用MATLAB提取二进制图像中的条纹并计算长度

本代码演示了如何使用MATLAB的bwmorph函数对二进制图像进行骨架化和分支消除处理,并计算提取的条纹长度。

代码:

% 读取二进制图像
binary_image = imread('7.bmp');

% 转化为二维逻辑矩阵
binary_image = logical(binary_image);

% 骨架化
skeleton_image = bwmorph(binary_image, 'skel', Inf);

% 消除分支条纹
branchless_image = bwmorph(skeleton_image, 'clean');

% 获取像素长度
pixel_size = 0.1; % 假设分辨率为10 nm/pixel
diagonal_factor = sqrt(2); % 对角线像素长度因子为sqrt(2)

% 初始化条纹长度变量
stripe_lengths = [];

% 遍历每个像素
for i = 1:size(branchless_image, 1)
    for j = 1:size(branchless_image, 2)
        % 如果像素是连通的
        if branchless_image(i, j)
            % 获取连通区域
            connected_region = bwselect(branchless_image, j, i, 8);
            
            % 计算像素数和长度
            pixel_count = sum(connected_region(:));
            if ismember(i+j, [3, 4, 5])
                pixel_length = 2 * pixel_size;
            else
                pixel_length = pixel_size;
            end
            stripe_length = pixel_count * pixel_length;
            
            % 如果条纹长度大于0.483 nm,则保存
            if stripe_length > 0.483
                stripe_lengths(end+1) = stripe_length;
            end
            
            % 标记已经计算过的像素
            branchless_image(connected_region) = 0;
        end
    end
end

% 显示最终处理后的图像和条纹数量
figure(); imshow(binary_image); title('Original Binary Image');
figure(); imshow(skeleton_image); title('Skeletonized Image');
figure(); imshow(branchless_image); title('Branchless Image');
fprintf('Number of Stripes: %d
', length(stripe_lengths));

代码解释:

  1. 读取二进制图像: 使用imread函数读取名为'7.bmp'的二进制图像。
  2. 转换为二维逻辑矩阵: 使用logical函数将图像转换为二维逻辑矩阵,其中非零像素为1,零像素为0。
  3. 骨架化: 使用bwmorph函数对二进制图像进行骨架化处理,将图像简化为单像素宽度的线条。参数'skel'表示骨架化操作,'Inf'表示无限次迭代,确保所有连通区域都被简化为单像素线条。
  4. 消除分支条纹: 使用bwmorph函数对骨架化后的图像进行分支消除处理,移除不必要的分支,得到更清晰的条纹结构。参数'clean'表示分支消除操作。
  5. 获取像素长度: pixel_size变量定义了每个像素的长度,例如假设分辨率为10 nm/pixel,则pixel_size为0.1 nm。diagonal_factor定义了对角线像素的长度因子,通常为sqrt(2)
  6. 遍历每个像素: 代码循环遍历每个像素,检查像素是否为连通区域的一部分。
  7. 获取连通区域: 使用bwselect函数获取当前像素所在的连通区域。
  8. 计算像素数和长度: 计算连通区域中包含的像素数量,并根据像素位置和pixel_size计算该区域的长度。
  9. 保存条纹长度: 如果计算出的条纹长度大于0.483 nm,则将其保存到stripe_lengths数组中。
  10. 标记已计算的像素: 将连通区域中的像素标记为0,防止重复计算。
  11. 显示处理后的图像: 使用imshow函数分别显示原始二进制图像、骨架化图像和分支消除后的图像。
  12. 显示条纹数量: 使用fprintf函数显示提取的条纹数量。

注意: 代码中的0.483值是根据具体情况设置的阈值,用于判断是否保存条纹长度。您可以根据需要调整该值。

本代码演示了如何使用MATLAB的bwmorph函数提取二进制图像中的条纹并计算长度,可以作为图像分析和处理的参考。

MATLAB图像处理:使用bwmorph函数提取条纹并计算长度

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

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