MATLAB 代码:条纹图像分析 - 骨架提取、长度统计和过滤
% 读取二进制图像 binaryImage = imread('7-1.bmp');
% 获得骨架 skeletonImage = bwmorph(binaryImage, 'skel', Inf);
% 获得像素连接性 connectivity = bwconncomp(skeletonImage);
% 消除分支条纹 for i = 1:connectivity.NumObjects if numel(connectivity.PixelIdxList{i}) >= 3 skeletonImage(connectivity.PixelIdxList{i}) = 0; end end
% 计算条纹长度 pixelSize = 0.0595; % 空间分辨率 stripeLengths = []; for i = 1:connectivity.NumObjects if numel(connectivity.PixelIdxList{i}) < 3 % 忽略短条纹 continue; end stripePixels = skeletonImage(connectivity.PixelIdxList{i}); stripeLength = sum(stripePixels) * pixelSize; % 对角线像素长度计算为像素大小的 2 倍 stripeLength = stripeLength + (sqrt(2) - 1) * sum(stripePixels(:)==2) * 2 * pixelSize; stripeLengths(end+1) = stripeLength; end
% 保存剩余的长条纹 maxLength = round(0.483 / pixelSize); % 最短的条纹长度 longStripePixels = zeros(size(skeletonImage)); for i = 1:connectivity.NumObjects if numel(connectivity.PixelIdxList{i}) < maxLength continue; end longStripePixels(connectivity.PixelIdxList{i}) = skeletonImage(connectivity.PixelIdxList{i}); end imwrite(longStripePixels, 'longStripePixels.png');
% 统计条纹长度 histogram(stripeLengths); % 绘制长度直方图 meanLength = mean(stripeLengths); % 平均长度 maxLength = max(stripeLengths); % 最大长度 minLength = min(stripeLengths); % 最小长度
原文地址: https://www.cveoy.top/t/topic/m00K 著作权归作者所有。请勿转载和采集!