6

我在较大的图像中识别出一些粒子,需要为每个粒子解析成较小的图像。我使用了 regionprops 'BoundingBox' 功能,但还没有成功。我现在如何使用 BoundingBox 制作图像的矩形子图像?我可以使用 BoundingBox 在原始图像上绘制一个矩形,但是 BoundingBox 返回的参数似乎不是像素尺寸(x,y,宽度,高度),(x1,y1,x2,y2)等,我会期望一个边界框返回。我已经使用coins.png 编写了一些示例代码,以使任何人都更容易理解。你能帮我解决这个问题吗?谢谢!

figure(1);
I = imread('coins.png');
bw = im2bw(I, graythresh(I));
bw2 = imfill(bw,'holes');
imshow(bw2);


figure(2);
L = bwlabel(bw2);
imshow(label2rgb(L, @jet, [.7 .7 .7]))

figure(3);
imshow(I);
s = regionprops(L, 'BoundingBox');
rectangle('Position', s(1).BoundingBox);
4

2 回答 2

13

根据REGIONPROPS的文档:

BoundingBox[ul_corner width],其中:

  • ul_corner:在表单中[x y z ...],指定边界框的左上角

  • width:在表单中[x_width y_width ...],指定边界框沿每个维度的宽度

现在您可以在以下位置使用IMCROP函数imcrop(I, rect)

rect是一个四元素位置向量[xmin ymin width height],用于指定裁剪矩形的大小和位置。

因此:

s = regionprops(L, 'BoundingBox');

subImage = imcrop(I, s(1).BoundingBox);
imshow(subImage)
于 2011-10-30T07:25:17.750 回答
7

regionprops 返回的参数[y,x,width,height]位于矩阵坐标中(另请参见“unexpected Matlab”

因此,要提取矩形,您可以编写:

subImage = I(round(s(1).BoundingBox(2):s(1).BoundingBox(2)+s(1).BoundingBox(4)),...
       round(s(1).BoundingBox(1):s(1).BoundingBox(1)+s(1).BoundingBox(3)));
于 2011-10-29T17:18:46.540 回答