MATLAB图像处理:条纹检测与长度过滤

本文将使用MATLAB代码演示如何对图像进行处理,包括灰度化、二值化、骨架化、去除分支,并对条纹进行长度过滤,最终得到长度大于0.483nm的条纹。

% 读取原始图像
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(length(Img_stats),1);
for i = 1:length(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)
        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:length(Img_stats)
    if stripe_length(i) < min_length
        pixel_list = Img_stats(i).PixelList;
        for j = 1:size(pixel_list,1)
            Img_filtered(pixel_list(j,2), pixel_list(j,1)) = 0;
        end
    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. 读取图像: 使用 imread 函数读取图像文件 '7-1.jpg' 并将其存储在 Img 变量中。
  2. 灰度化: 使用 rgb2gray 函数将彩色图像转换为灰度图像,存储在 Img_gray 变量中。
  3. 二值化: 使用 imbinarize 函数将灰度图像转换为二值图像,存储在 Img_bw 变量中。
  4. 骨架化: 使用 bwmorph 函数对二值图像进行骨架化操作,存储在 Img_sk 变量中。
  5. 去除分支: 使用 bwmorph 函数去除骨架化图像中的分支,存储在 Img_clean 变量中。
  6. 计算条纹长度:
    • 首先定义空间分辨率 resolution
    • 使用 bwlabel 函数对 Img_clean 进行标记,并使用 regionprops 函数获取每个标记区域的面积和像素坐标列表。
    • 循环遍历每个标记区域,计算其长度并存储在 stripe_length 数组中。
  7. 过滤条纹长度:
    • 定义最小长度阈值 min_length
    • 循环遍历每个条纹,如果其长度小于 min_length,则将其对应的像素点在 Img_filtered 中设置为 0。
  8. 展示结果:
    • 使用 imshow 函数分别展示原始图像、骨架化图像、去除分支后的图像、过滤后的图像和条纹长度分布直方图。

代码修改:

  • 将第17行的代码修改为:
if Img_stats(i).Area < 3 % 只保留三个以上连接的像素
    continue;
end
  • 将第27行的代码修改为:
if stripe_length(i) < min_length
    pixel_list = Img_stats(i).PixelList;
    for j = 1:size(pixel_list,1)
        Img_filtered(pixel_list(j,2), pixel_list(j,1)) = 0;
    end
end

注意:

  • 代码中的 '7-1.jpg' 是示例图像文件名,需要根据实际情况进行修改。
  • 代码中的空间分辨率 resolution 和最小长度阈值 min_length 需要根据实际情况进行调整。
  • 代码中的 Img_filtered 变量用于存储过滤后的图像,可以根据实际需要修改变量名。

希望本文能够帮助你理解如何使用MATLAB进行图像处理,并对条纹进行检测和长度过滤。如果你有任何问题,欢迎在评论区留言。

MATLAB图像处理:条纹检测与长度过滤

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

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