哟产生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
走行。从x
到x+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
下面是一个例子w-up问题:http://stackoverflow.com/questions/37558409/working-with-erosion-and-dilatation – Matt