MATLAB图像处理:条纹检测与长度过滤
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('条纹长度分布');
代码解释:
- 读取图像: 使用
imread函数读取图像文件'7-1.jpg'并将其存储在Img变量中。 - 灰度化: 使用
rgb2gray函数将彩色图像转换为灰度图像,存储在Img_gray变量中。 - 二值化: 使用
imbinarize函数将灰度图像转换为二值图像,存储在Img_bw变量中。 - 骨架化: 使用
bwmorph函数对二值图像进行骨架化操作,存储在Img_sk变量中。 - 去除分支: 使用
bwmorph函数去除骨架化图像中的分支,存储在Img_clean变量中。 - 计算条纹长度:
- 首先定义空间分辨率
resolution。 - 使用
bwlabel函数对Img_clean进行标记,并使用regionprops函数获取每个标记区域的面积和像素坐标列表。 - 循环遍历每个标记区域,计算其长度并存储在
stripe_length数组中。
- 首先定义空间分辨率
- 过滤条纹长度:
- 定义最小长度阈值
min_length。 - 循环遍历每个条纹,如果其长度小于
min_length,则将其对应的像素点在Img_filtered中设置为 0。
- 定义最小长度阈值
- 展示结果:
- 使用
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进行图像处理,并对条纹进行检测和长度过滤。如果你有任何问题,欢迎在评论区留言。
原文地址: https://www.cveoy.top/t/topic/m5K2 著作权归作者所有。请勿转载和采集!