图像骨架化与条纹长度分析:Matlab代码实现

本代码使用Matlab对图像进行骨架化操作,并计算条纹长度,并绘制条纹长度分布直方图,展示了如何利用图像处理技术分析图像中的条纹特征。

1. 读取图像并转换为二值化图像

I = imread('7-1.jpg'); % 读取图像
I_bw = im2bw(I); % 将图像转换为二值化图像

2. 对二值化图像进行骨架化操作

I_skel = bwmorph(I_bw, 'skel', Inf); % 对二值化图像进行骨架化操作

3. 消除分支条纹

I_skel_pruned = I_skel;
CC = bwconncomp(I_skel);
for i = 1:CC.NumObjects
    if length(CC.PixelIdxList{i}) < 3 % 如果骨架只有1个或2个像素,则忽略
        continue;
    end
    B = bwboundaries(I_skel(CC.PixelIdxList{i})); % 获取当前骨架的边界
    if length(B) > 1 % 如果当前骨架有多个边界,则说明有分支
        I_skel_pruned(CC.PixelIdxList{i}) = 0; % 将该骨架的所有像素都消除
    end
end

4. 计算条纹长度

pixel_size = 0.0595; % 像素大小
I_skel_props = regionprops(I_skel_pruned, 'PixelList');
stripe_lengths = zeros(length(I_skel_props), 1);
for i = 1:length(I_skel_props)
    pixel_list = I_skel_props(i).PixelList;
    if size(pixel_list, 1) < 2 % 如果骨架只有1个像素,则忽略
        continue;
    end
    if pdist(pixel_list([1,end], :)) > sqrt(2)*pixel_size % 如果骨架的两个端点的距离大于像素大小的2倍,则说明是对角线像素
        stripe_lengths(i) = size(pixel_list, 1) * 2 * pixel_size; % 对角线像素长度为像素大小的2倍
    else
        stripe_lengths(i) = size(pixel_list, 1) * pixel_size; % 非对角线像素长度为像素大小
    end
end
stripe_lengths = stripe_lengths(stripe_lengths > 0); % 去除长度为0的条纹
long_stripes = stripe_lengths(stripe_lengths > 0.483); % 只保留长度大于0.483 nm的条纹

5. 展示结果

figure;
subplot(1,2,1); imshow(I); title('原始图像');
subplot(1,2,2); imshow(I_skel_pruned); title('骨架化图像');

if ~isempty(long_stripes) % 判断长条纹数组是否为空
    figure;
    histogram(long_stripes, 'BinWidth', 0.1, 'Normalization', 'probability');
    xlabel('条纹长度 (nm)');
    ylabel('频率');
    title(['条纹长度分布 (平均长度=' num2str(mean(long_stripes)) ' nm)']);
else
    disp('没有找到长度大于0.483 nm的条纹!');
end

本代码使用了 imread 函数读取图像,im2bw 函数将图像转换为二值化图像,bwmorph 函数进行骨架化操作,bwconncomp 函数识别连通区域,bwboundaries 函数获取边界,regionprops 函数获取区域属性,pdist 函数计算两点之间的距离,histogram 函数绘制直方图。最终展示了原始图像、骨架化图像和条纹长度分布直方图。

注意:

  • 代码中需要将 '7-1.jpg' 替换为实际的图像文件名。
  • 代码中的 pixel_size 变量需要根据实际的像素大小进行调整。
  • 代码中的 0.483 变量是用于筛选条纹长度的阈值,可以根据实际情况进行调整。

希望本代码能够帮助你理解图像骨架化与条纹长度分析的基本原理,并应用于你的实际项目中。

图像骨架化与条纹长度分析:Matlab代码实现

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

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