使用MATLAB提取和分析图像中的条纹长度

本文将介绍使用MATLAB对图像中的条纹进行提取和分析,包括骨架化、长度计算、条纹统计等操作。

代码示例:

% 读入原始图像
img = imread('7-1.tif');

% 转换为灰度图像
gray_img = rgb2gray(img);

% 二值化图像
bw_img = imbinarize(gray_img);

% 骨架化操作
skel_img = bwmorph(bw_img, 'skel', Inf);

% 计算像素长度
pixel_size = 0.0595; % 空间分辨率为0.0595(纳米/像素)

skel_img_diag = diag(skel_img);
skel_img_diag(skel_img_diag == 1) = 2 * pixel_size;
skel_img(skel_img_diag == 2 * pixel_size) = 0;

% 消除分支条纹
branch_points = bwmorph(skel_img, 'branchpoints');
end_points = bwmorph(skel_img, 'endpoints');
skel_img(branch_points) = 0;
skel_img(end_points) = 0;

% 提取条纹
cc = bwconncomp(skel_img);
skel_props = regionprops(cc, 'PixelIdxList', 'PixelList', 'Area');

% 计算条纹长度
skel_lengths = zeros(numel(skel_props), 1); % 修正后的代码
for i = 1:length(skel_props)
skel_length = skel_props(i).Area * pixel_size;
skel_lengths(i) = skel_length;
end

% 消除短条纹
long_skel_lengths = skel_lengths(skel_lengths >= 0.483);

% 统计数据和图像展示
disp(['Total number of stripes: ', num2str(length(skel_props))]);
disp(['Total length of stripes: ', num2str(sum(skel_lengths)), ' nm']);
disp(['Number of long stripes: ', num2str(length(long_skel_lengths))]);
disp(['Total length of long stripes: ', num2str(sum(long_skel_lengths)), ' nm']);

figure; imshow(img);
hold on;
for i = 1:length(skel_props)
plot(skel_props(i).PixelList(:, 1), skel_props(i).PixelList(:, 2), 'r');
end
title('Skeletonized Stripes');

figure; histogram(long_skel_lengths, 'BinWidth', 1);
xlabel('Stripe Length (nm)');
ylabel('Frequency');
title('Histogram of Long Stripes');

代码说明:

  1. 读入和预处理图像: 读取原始图像,将其转换为灰度图像并进行二值化处理。
  2. 骨架化操作: 使用bwmorph函数对二值化图像进行骨架化,提取出条纹的中心线。
  3. 消除分支条纹: 使用bwmorph函数识别并去除骨架中的分支点和端点,得到更清晰的条纹。
  4. 提取条纹: 使用bwconncomp函数识别图像中的连通区域,并使用regionprops函数获取每个连通区域的属性,包括像素列表和面积。
  5. 计算条纹长度: 使用每个连通区域的面积和像素长度计算对应的条纹长度。
  6. 过滤短条纹: 设定阈值,将长度小于阈值的条纹去除。
  7. 统计和展示结果: 打印条纹数量、总长度、长条纹数量和总长度等信息,并绘制原始图像和长条纹直方图。

代码修正:

代码中 skel_lengths = zeros(length(skel_props), 1); 的错误是由于 length() 函数无法用于获取结构体中的元素数量,应该使用 numel() 函数。修正后的代码为:skel_lengths = zeros(numel(skel_props), 1);

结论:

通过上述代码,我们成功地从图像中提取出条纹并计算其长度,并统计了相关数据。此方法可应用于各种图像分析任务,例如材料科学、生物学等。

注意: 此代码仅为示例,具体参数设置和操作流程需要根据实际应用进行调整。

MATLAB图像处理:提取和分析条纹长度

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

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