MATLAB 图像处理:条纹识别与长度测量

本代码使用 MATLAB 进行图像处理,识别图像中的条纹并测量其长度。代码首先读取图像并进行灰度化和二值化操作,然后进行骨架化和分支去除。最后计算条纹长度并过滤掉长度小于阈值的条纹。代码还包含结果展示和直方图分析。

% 读取原始图像
Img = imread('7-1.jpg');

% 将图像转化为灰度图像
Img_gray = rgb2gray(Img);

% 将灰度图像进行二值化操作
Img_bw = imbinarize(Img_gray);

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

% 去除分支条纹
Img_clean = bwmorph(Img_sk,'spur',3);

% 计算条纹长度
resolution = 0.0595; % 空间分辨率
Img_label = bwlabel(Img_clean);
Img_stats = regionprops(Img_label,'Area','PixelList');
stripe_length = zeros(numel(Img_stats),1);

for i = 1:numel(Img_stats)
    if Img_stats(i).Area >= 3 % 只保留三个以上连接的像素
        continue;
    end
    pixel_list = Img_stats(i).PixelList;
    length_sum = 0;
    for j = 1:size(pixel_list,1)-1
        if j < size(pixel_list,1) && abs(pixel_list(j,1)-pixel_list(j+1,1)) == 1 && abs(pixel_list(j,2)-pixel_list(j+1,2)) == 1 % 对角线像素
            length_sum = length_sum + 2*resolution;
        else
            length_sum = length_sum + resolution;
        end
    end
    stripe_length(i) = length_sum;
end

% 过滤长度小于0.483nm的条纹
min_length = 0.483;
Img_filtered = Img_clean;
for i = 1:numel(Img_stats)
    if stripe_length(i) < min_length
        Img_filtered(sub2ind(size(Img_filtered),Img_stats(i).PixelList(:,2),Img_stats(i).PixelList(:,1))) = 0;
    end
end

% 展示结果
figure(1);
imshow(Img_bw);
title('原始图像');

figure(2);
imshow(Img_sk);
title('骨架化图像');

figure(3);
imshow(Img_clean);
title('去除分支后的图像');

figure(4);
imshow(Img_filtered);
title('过滤后的图像');

figure(5);
histogram(stripe_length(stripe_length~=0));
title('条纹长度分布');

代码说明:

  1. 读取图像: Img = imread('7-1.jpg'); 读取名为 '7-1.jpg' 的图像文件。
  2. 灰度化: Img_gray = rgb2gray(Img); 将彩色图像转换为灰度图像。
  3. 二值化: Img_bw = imbinarize(Img_gray); 将灰度图像二值化,生成黑白图像。
  4. 骨架化: Img_sk = bwmorph(Img_bw,'skel',Inf); 对二值图像进行骨架化操作,提取出条纹的中心线。
  5. 去除分支: Img_clean = bwmorph(Img_sk,'spur',3); 去除骨架图像中的分支,保留主干部分。
  6. 计算条纹长度:
    • resolution = 0.0595; 定义像素分辨率,单位为 nm。
    • Img_label = bwlabel(Img_clean); 标记连接的像素区域。
    • Img_stats = regionprops(Img_label,'Area','PixelList'); 获取每个标记区域的面积和像素位置信息。
    • 使用循环遍历每个标记区域,计算每个条纹的长度。
  7. 过滤短条纹:
    • min_length = 0.483; 设置条纹长度阈值。
    • 使用循环遍历每个标记区域,将长度小于阈值的条纹从图像中去除。
  8. 展示结果: 使用 imshow 函数显示不同处理步骤的结果图像,并使用 histogram 函数显示条纹长度分布。

代码修改:

由于 MATLAB 中无法直接使用结构体作为索引,因此需要对代码进行以下修改:

  • 将第 12 行的 for i = 1:length(Img_stats) 修改为 for i = 1:numel(Img_stats)
  • 将第 19 行的 stripe_length = zeros(length(Img_stats),1) 修改为 stripe_length = zeros(numel(Img_stats),1)
  • 将第 21 行的 if Img_stats(i).Area >= 3 修改为 if Img_stats(i).Area >= 3
  • 将第 26 行的 for j = 1:size(pixel_list,1) 修改为 for j = 1:size(pixel_list,1)-1
  • 将第 35 行的 for i = 1:length(Img_stats) 修改为 for i = 1:numel(Img_stats)

其他注意事项:

  • 确保代码运行环境中已安装 Image Processing Toolbox。
  • 可以根据实际情况调整像素分辨率和长度阈值。
  • 可以根据需要添加其他处理步骤,例如噪声去除、图像增强等。

希望本代码和说明能够帮助您更好地理解并应用 MATLAB 进行图像处理!

MATLAB 图像处理:条纹识别与长度测量

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

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