3

我正在尝试在下图中的白色斑点周围绘制一个边界框:

在此处输入图像描述

我确实喜欢这样:

bw = imread('box.jpg');
bw=im2bw(bw);
imshow(bw)
L = bwlabel(bw);
s = regionprops(L, 'Area', 'BoundingBox');
s(1);
area_values = [s.Area];
idx = find((100 <= area_values) & (area_values <= 1000)); % list of all the objects   

%whose area is between 100 and 1000

bw2 = ismember(L, idx); %construct a binary image containing all the objects whose 

%area is between 100 and 1000 by passing L and idx to ismember. 

imshow(bw2)

到目前为止,输出 bw2 是: 在此处输入图像描述

有人能告诉我如何在这个斑点(白色)周围画一个边界框吗?

更新 Wajih 的答案实际上准确地解决了这个问题。

4

4 回答 4

3

伪 -

  • 在 blob 中选择最大的 y、最大的 x、最小的 x、最小的 y。也就是说,斑点上的点。这些是您可以用来构建边界框的坐标。

假设图像的左上角为 (0,0)

(smallestX,smallestY)-----------------(largestX,smallestY)    
      |                                      |
      |                                      |          
      |                                      | 
      |                                      |
(smallestX,largestY)------------------(largestX,largestY)    

并用于查找最小/最大值和索引。

[r,c]=find(img==min(min(img)))
[r,c]=find(img==max(max(img)))

r,c 表示 img 矩阵中的行和列。

  • 我已在您的图像上标记了可用于创建边界框的点。
  • 放大图像以获得更好的视图。 马克雷德 放大
于 2012-04-13T11:42:19.430 回答
3

作为这个问题的第 20,000 位观众,我将回答我认为提问者实际提出的问题。

要在页面上呈现矩形,您只需要正确解释形状的边界框。你已经计算过了s(idx).BoundingBox

因此,将这两行添加到您的脚本中:

bb = s(idx).BoundingBox;
rectangle('Position',[bb(1) bb(2) bb(3) bb(4)],'EdgeColor','green');

你会得到:

在此处输入图像描述

于 2016-08-10T13:37:28.447 回答
2

您是否尝试过 Image Toolbox 中的 regionprops?

于 2012-06-21T16:58:00.843 回答
0

我认为您可以尝试使用bwboundries

boundaries = bwboundaries(blob);

numberOfBoundaries = size(boundaries);

for k = 1 : numberOfBoundaries

    thisBoundary = boundaries{k};

    plot(thisBoundary(:,2), thisBoundary(:,1), 'g', 'LineWidth', 2);

end
于 2013-02-10T16:39:49.250 回答