2011-10-29 148 views
6

我有一些粒子,我已经在更大的图像中识别出来,并且需要为每个粒子解析出更小的图像。我已经使用了regionprops的BoundingBox函数,但尚未成功。我现在如何使用BoundingBox制作图像的矩形子图像?我可以使用BoundingBox在原始图像上绘制一个矩形,但由BoundingBox返回的参数似乎不是像素尺寸(x,y,宽度,高度),(x1,y1,x2,y2)等,我会期望一个边界框返回。我使用coins.png编写了一些示例代码,以方便任何人理解。你能帮助我吗?谢谢! 。如何在Matlab中从regionprops(Image,'BoundingBox')获取矩形子图像?

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); 

回答

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))); 
+1

是啊,你也可以遍历's.NumObjects',迭代器更换乔纳斯'1'。 –

12

据的文件REGIONPROPS

BoundingBox[ul_corner width],其中:

  • ul_corner:在形式[x y z ...]并指定边界框

  • 宽度的左上角:在形式[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) 
+0

我不知道这种'imcrop'的用法,它比直接索引图像更可读。 FWIW,这些文档说Joncon在他的回答中做出了“无形”轮。 –

+0

@reve_etrange:了解表达图像位置的不同方法很重要:http://www.mathworks.com/help/toolbox/images/brcu_al-1.html – Amro

+0

上述链接更改为:http:// www .mathworks.com/help/images/image-coordinate-systems.html。图像处理工具箱还引入了新的空间参照类:'imref2d'和'imref3d' – Amro