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(double(skel_img)); % 修改:将类型转换为double
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');
代码解释:
-
图像读取与预处理:
imread('7-1.tif'): 读取名为'7-1.tif'的图像文件。rgb2gray(img): 将彩色图像转换为灰度图像。imbinarize(gray_img): 对灰度图像进行二值化处理,将像素值转换为0或1。
-
骨架化操作:
bwmorph(bw_img, 'skel', Inf): 使用bwmorph函数对二值图像进行骨架化处理,将每个连通区域简化为单像素宽的骨架。
-
条纹提取和长度计算:
bwconncomp(skel_img): 使用bwconncomp函数获取骨架图像中连通区域的属性,包括每个区域的像素索引列表、像素坐标列表和面积。regionprops(cc, 'PixelIdxList', 'PixelList', 'Area'): 使用regionprops函数计算每个连通区域的属性,包括像素索引列表、像素坐标列表和面积。- 使用面积和像素长度计算每个条纹的长度。
-
统计数据和图像展示:
disp函数用于显示统计结果,包括条纹总数、总长度、长条纹数和长条纹总长度。imshow函数用于显示原始图像和骨架化后的条纹。histogram函数用于绘制长条纹长度的直方图。
代码修改:
- 将第11行的
skel_img_diag = diag(skel_img);修改为skel_img_diag = diag(double(skel_img));,因为diag函数需要输入一个数字矩阵。
总结:
本代码提供了一个使用MATLAB进行条纹检测和长度分析的示例。通过读取图像、进行预处理、骨架化、提取条纹和计算长度,可以分析图像中的条纹特征。代码中还包括统计数据和图像展示的功能,方便对结果进行观察和分析。
原文地址: https://www.cveoy.top/t/topic/m1hd 著作权归作者所有。请勿转载和采集!