MATLAB代码:使用regionprops计算图像中条纹之间的距离
这段代码使用 MATLAB 的 regionprops 函数计算图像中条纹之间的距离。
首先,代码读取并二值化图像:
img_stripes = imread('7.bmp');
img_stripes = imbinarize(img_stripes);
img_stripes = img_stripes(:,:,1);
然后,代码使用 regionprops 函数计算每个条纹的方向和像素索引:
stats = regionprops(img_stripes, 'Orientation', 'PixelIdxList');
接下来,代码计算每个条纹之间的距离,并过滤掉距离小于 0.02 或大于 0.6 的条纹:
distances = [];
for i = 1:length(stats)
for j = i+1:length(stats)
if abs(stats(i).Orientation - stats(j).Orientation) < 30
pixels1 = stats(i).PixelIdxList;
pixels2 = stats(j).PixelIdxList;
if abs(stats(i).Orientation) > 45
pixels1 = fliplr(pixels1);
end
if abs(stats(j).Orientation) > 45
pixels2 = fliplr(pixels2);
end
level1 = unique(floor((pixels1-1)/size(img_stripes, 1))+1);
level2 = unique(floor((pixels2-1)/size(img_stripes, 1))+1);
levels = intersect(level1, level2);
pixels1 = pixels1(ismember(floor((pixels1-1)/size(img_stripes, 1))+1, levels), :);
pixels2 = pixels2(ismember(floor((pixels2-1)/size(img_stripes, 1))+1, levels), :);
d = pdist2(pixels1, pixels2);
distances = [distances; min(d(:))];
end
end
end
idx = find(distances > 0.02 & distances < 0.6);
distances = distances(idx);
最后,代码绘制条纹和距离:
figure;
imshow(img_stripes);
hold on;
for i = 1:length(stats)
plot(stats(i).PixelIdxList, 'r.');
end
for i = 1:length(idx)
[m, n] = ind2sub([length(stats), length(stats)], idx(i));
plot([stats(m).PixelIdxList(1), stats(n).PixelIdxList(1)], [stats(m).PixelIdxList(2), stats(n).PixelIdxList(2)], 'b-');
end
hold off;
title('Stripes and Distances');
代码中需要注意的是,regionprops 函数在 MATLAB 版本不同时,输出结果可能会有所差异。本代码使用的是较新的版本,其输出结果包含 PixelIdxList 属性,而不是旧版本中的 PixelList 属性。如果使用旧版本,需要将代码中所有 PixelIdxList 替换为 PixelList。
此外,代码中的 fliplr 函数用于将像素按照方向排序,以便计算正确的距离。
这段代码可以作为计算图像中条纹之间距离的参考,并可根据需要进行修改。
原文地址: https://www.cveoy.top/t/topic/mTEW 著作权归作者所有。请勿转载和采集!