let's have 5 connected components (labelled objects) in image called labelledimage
bwlabel
. how can manipulate labelledimage
objects labelled 1 , 4 display, while removing objects labelled 2, 3 , 5. then, how can manipulate original rgb image connected components labelled 1 , 4 display.
i know how retain single connected component using line of code below. however, don't know how multiple labelled regions.
works.
connectedcomponent1 = (labelledimage == 1); imshow(connectedcomponent1)
doesn't work.
connectedcomponent1and4 = (labelledimage == [1 4]); imshow(connectedcomponent1and4)
you can't logical
indexing way. simplest way perhaps use boolean statements combine things.
connectedcompoonent1and4 = labelledimage == 1 | labelledimage == 4;
in general, supposing had vector of elements denote components want keep, use bsxfun
, permute
, any
that. should work:
components = [1 4]; connected = any(bsxfun(@eq, labelledimage, permute(components, [1 3 2])), 3);
the above code uses matrix broadcasting create temporary 3d matrix each slice i
contains i
th value of vector components
contain desired labels want keep. labelledimage
replicated in third dimension result using bsxfun
creates 3d matrix each slice i
segments out i
th object want keep. combine of objects using any
, looking in third dimension.
if don't one-liners, use simple for
loop:
components = [1 4]; connected = false(size(labelledimage, 1), size(labelledimage, 2)); ind = 1 : numel(components) connected = connected | labelledimage == components(ind); end
this creates output image false
, loop through each value in vector of components want keep , append results on top of result. end give of components want keep.
lastly, use use ismember
, determine values in matrix can found between label matrix , components vector , create mask way:
connected = ismember(labelledimage, components);
now have mask of objects want extract out, use on original image, multiply each channel mask. use of bsxfun
can you. assuming image in rgb called img
, following:
outimg = bsxfun(@times, img, cast(connected, class(img)));
to perform element-wise multiplication, must ensure both matrices being multiplied have same type. convert mask same class whatever input image , perform multiplication.
Comments
Post a Comment