这段代码使用 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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录