matlab - How to remove connected components from an image while retaining some -


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 ith 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 ith 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