MATLAB 图像处理:条纹识别与长度测量
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('条纹长度分布');
代码说明:
- 读取图像:
Img = imread('7-1.jpg');读取名为 '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;定义像素分辨率,单位为 nm。Img_label = bwlabel(Img_clean);标记连接的像素区域。Img_stats = regionprops(Img_label,'Area','PixelList');获取每个标记区域的面积和像素位置信息。- 使用循环遍历每个标记区域,计算每个条纹的长度。
- 过滤短条纹:
min_length = 0.483;设置条纹长度阈值。- 使用循环遍历每个标记区域,将长度小于阈值的条纹从图像中去除。
- 展示结果: 使用
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 进行图像处理!
原文地址: https://www.cveoy.top/t/topic/m5Ii 著作权归作者所有。请勿转载和采集!