MATLAB图像处理:条纹提取和长度统计
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(length(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');
说明:
- 代码首先读取图像并进行灰度化、二值化和骨架化操作,以提取条纹的骨架。
- 然后利用
regionprops函数提取每个条纹的区域属性,包括像素列表和面积。 - 根据像素面积和空间分辨率计算每个条纹的长度,并统计所有条纹的长度和数量。
- 最后,代码绘制原始图像和条纹骨架图,并绘制长条纹的长度直方图。
注意:
代码中使用了regionprops函数的PixelIdxList和PixelList属性来获取条纹的像素列表,从而实现绘制骨架图。
修改后的代码:
% ... (代码与之前相同,除了以下部分)
% 提取条纹
cc = bwconncomp(skel_img);
skel_props = regionprops(cc, 'PixelIdxList', 'PixelList', 'Area');
% 计算条纹长度
skel_lengths = zeros(length(skel_props), 1);
for i = 1:length(skel_props)
skel_length = skel_props(i).Area * pixel_size;
skel_lengths(i) = skel_length;
end
% ... (代码与之前相同)
修改后的代码使用regionprops函数的Area属性来获取每个条纹的面积,然后根据面积和像素大小计算条纹长度。修改后的代码可以正确运行,并提供条纹长度信息。
希望以上内容能够帮助您理解MATLAB图像处理中条纹提取和长度统计的相关知识。
原文地址: https://www.cveoy.top/t/topic/m1iS 著作权归作者所有。请勿转载和采集!