2016-04-21 62 views
0

我有n区域生成的regionprops'BoundingBox''Image'属性。我从一个特定地区(14例)保存的数据([x, y, Δx, Δy]),以bb1,我想要的工作,但首先我需要了解下面的代码:使用BoundingBox生成的特定区域

bb1=floor(Ic(14,1).BoundingBox); 
I1bb1=I1(bb1(2):bb1(2)+bb1(4)-1 , bb1(1):bb1(1)+bb1(3)-1 ,:); 

在那之后,我也想了解下一个代码,它是从同一例如:

I2=I1bb1.*repmat( Ic(BB,1).Image , [1 1 3]); 

Ic包含由的BoundingBox

回答

0

哟产生n区域你有一个3D变量I1(我猜RGB图像),你希望从它边界框Ic(14,1).BoundingBox。也就是说,在图像I1中有一个较小的3D数组,对应于边界框内的像素。要做到这一点裁剪你有这些命令:

bb1=floor(Ic(14,1).BoundingBox); 

首先,你要确定的值边框[x, y, w, h]是整数,而不是子像素,这样就可以使用这些值进行索引。然后,你可以索引I1与边框:

I1bb1=I1(bb1(2):bb1(2)+bb1(4)-1 , bb1(1):bb1(1)+bb1(3)-1 ,:); 

对于I1bb1行从bb1(2)y值)y+w-1这是bb1(2)+bb1(4)-1走行。从xx+h-1的列也一样。

对于第三行代码,您有属性Ic(14,1).Image。此属性是

返回与区域的边界框大小相同的二进制图像(逻辑)。开启像素对应于该区域,并且所有其他像素关闭。

现在你要I2是尺寸与边框相同,但在boundingBox的不属于对象的所有像素都设置为[0 0 0](所有RGB值为零)。因此,你从2D二进制掩码转换Ic(14,1).Image为3D掩模在三个信道:

repmat( Ic(BB,1).Image , [1 1 3]) 

最后你逐元素相乘的“膨胀”掩模与所述裁剪的图像I1bb1

I2=I1bb1.*repmat( Ic(BB,1).Image , [1 1 3]); 

您可以通过稍微更具可读性的代码获得相同的结果:

Ibb1 = imcrop(I1, bb1); %// crop a bounding box from image 
I2 = bsxfun(@times, Ibb1, Ic(14,1).Image); %// no need for repmat 
+0

下面是一个例子w-up问题:http://stackoverflow.com/questions/37558409/working-with-erosion-and-dilatation – Matt