take largest connected components in 2D slices and then reconstruct the 3D by stacking them

Hello,
I am doing some morphological image processing. I want to remove the 4 unwanted blobs from the binary object(image below)
If I axially slice the image, I can take the largest connected component and exclude others like the image below:
I have tried the following codes which results binary size mismatch issues.
ind = 1;
sz = size(bi) % bi is the 3D mask with dimension: 170x256x100
final_mask = zeros(sz)
for i = 1:sz(3) %taking the 2D axial slice iterations-> 1:100
cc = bwconncomp(bi(:,:,i));
% disp(cc)
S = regionprops(cc, 'Area', 'PixelIdxList');%'Centroid');
ax_slice = zeros(sz(1), sz(2));
numPixels = cellfun(@numel, cc.PixelIdxList);
% disp(numPixels)
[biggest,idx] = max(numPixels); % taking the largest component number of pixels and their indices
ax_slice(cc.PixelIdxList{idx})= 1;
final_mask(:,:,i) = ax_slice;
end
or
I have shared the bi_copy.mat in the link above.
Please let me know how to deal with it.
Thanks.

 Risposta accettata

  • erode image
  • dilate image
clc % clear command window
cla % clear axes
bi11 = bi; % create copy of 'bi'
bi1 = bi(:,:,170:end); % get top part
R = 2; % radius of structuring element
[x,y,z] = meshgrid(-R:R); % X Y Z 3d matrices
el = x.^2+y.^2+z.^2 <= R^2; % sphere of radius 'R'
bi2 = imerode(bi1, el); % erode image
bi3 = imdilate(bi2, el); % dilate image
bi11(:,:,170:end) = bi3; % replace original top part
isosurface(bi11,.95) % display 3d image
axis vis3d
light

5 Commenti

Hi,
Thanks, the code works great for my problem. But I would like to clarify a bit.
This is the final first axial slice of bi1.
And the dilated one for same slice location misses the skull info:
Is there a way to prevent the 'skull bone erosion'
If I take the first 10 slices from the bi1 and replace them in the final image, It works. But for other subjects 10 slices may not work.
But overall the code removes electrodes pretty well.
How high is the skull? Is it on the same level with electrodes?
Did yo try to reduce radius of structuring element?
@darova,
I reduced the radius R from 2 to 1.5 and found the following image(volumeViewer). This should work as well I take largest connected component in 3D.
Not clear about the first question but the skull lowest slice is nearly 10-20 slices lower than the electrodes. But I have other subjects as well. I want to automate the pipeline rather than manually checking the electrode locations.
Another idea
  • erode/dilate image partially
  • select biggest part
  • restore original size
I think reducing the R value has provided the result close to somewhat I was expecting.
Then I will replace the below electrode slices to the dilated/eroded one.
Thanks a lot!!

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Convert Image Type in Centro assistenza e File Exchange

Richiesto:

il 23 Apr 2020

Commentato:

il 26 Apr 2020

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by