如何通过matlab中的regionprops控制检测到的对象的顺序?

时间:2017-03-28 18:03:16

标签: matlab image-processing

我正在开发一个MATLAB项目,用户将上传类似椭圆形物体的扫描图像,程序必须计算图像中每个物体的测量值(高度,宽度,面积等等)。 / p>

我开始使用阈值处理产生二进制图像(黑色背景和白色独立对象)。这是阈值处理后的BW图像:

BW image

之后,我使用regionprops因为它返回了我需要的大部分测量值,并且它完美地工作。

问题是功能“识别/检测”对象的顺序不一致。我添加了一个代码来显示每个对象的数量,这样我就可以知道哪个对象被regionprops视为第一个,哪一个是第二个..等等。

代码:

% read image
rgb=imread('bw');

s = regionprops(bw,'Area', 'BoundingBox', 'Eccentricity', 'MajorAxisLength', 'MinorAxisLength', 'Orientation', 'Perimeter','Centroid');


% show the number of each object

imshow(bw)
hold on;

for k = 1:numel(s)
    c = s(k).Centroid;
    text(c(1), c(2), sprintf('%d', k), ...
        'HorizontalAlignment', 'center', ...
        'VerticalAlignment', 'middle', 'color', 'r');
end

hold off;

这是显示对象顺序后的图像:

BW image with numbered objects

我需要订单从左上角到右下角。 (第一行对象的编号从1到6, 第二排从7到12 ......等等。 这可能吗?

非常感谢。

1 个答案:

答案 0 :(得分:3)

使用Suever's suggestion工作以使用Centroid数据,并假设s仅包含示例中的18个感兴趣区域,这是排序s的一种方法从左到右,从上到下使用histcountssortrows

coords = vertcat(s.Centroid);  % 2-by-18 matrix of centroid data
[~, ~, coords(:, 2)] = histcounts(coords(:, 2), 3);  % Bin the "y" data
[~, sortIndex] = sortrows(coords, [2 1]);  % Sort by "y" ascending, then "x" ascending
s = s(sortIndex);  % Apply sort index to s

这是一张显示每个区域标签的图片(正如您在代码示例中所做的那样):

enter image description here

“y”数据的分箱首先允许我们将对象分组为3行6. sortrows函数在按此bin值排序后,然后能够对所有“ x“每个唯一分箱组的值。