读取原始图像 Img = imread7-1jpg; 将图像转化为灰度图像 Img_gray = rgb2grayImg; 将灰度图像进行二值化操作 Img_bw = imbinarizeImg_gray; 对二值化图像进行骨架化操作 Img_sk = bwmorphImg_bwskelInf; 去除分支条纹 Img_clean = bwmorphImg_skspur3; 计算条纹长度
% 读取原始图像 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 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('条纹长度分布');
原文地址: https://www.cveoy.top/t/topic/bBsa 著作权归作者所有。请勿转载和采集!