How can I clean the data that bwconncomp provides?

조회 수: 5 (최근 30일)
Hannah Faustyn
Hannah Faustyn 2021년 5월 24일
편집: Hannah Faustyn 2021년 5월 31일
I am trying to use bwconncomp to find the number of particles in an image, but sometimes the output from bwconncomp is totally wrong (I get results both significantly higher and lower than what the actual values should be). Is there a way to fine tune this, such as take into consideration the area of the particles?
Other attempts I've used include using the regionprops image property, but this doesn't account for the shape of the objects. I know that changing the connectivity from 8-connected to 4-connected would help when the output is too low, but this doesn't solve the issue of when Matlab counts more objects than should actually exist in the image.
  댓글 수: 2
Matt J
Matt J 2021년 5월 27일
I suggest attaching an example image and the code you are using that gives the wrong result for that image.
Image Analyst
Image Analyst 2021년 5월 27일
Hannah: Here is another chance for you to read the posting guidelines you blew past when you've been posting so far:
Make it easy for us to help you, not hard. We really can't do anything with what you've told us, and given us (no posted image or code).

댓글을 달려면 로그인하십시오.

채택된 답변

Uday Pradhan
Uday Pradhan 2021년 5월 27일
Hi Hannah,
I believe you could uitilize the PixelIdxList information that bwconncomp outputs as part of a struct. This list is a 1-by-N cell array where the k-th element in the cell array is a vector containing the linear indices of the pixels in the k-th object. You can use this to choose those objects whose size satisfy a certain threshold. A small example is given below which shows how to remove objects that have number of pixels less than a set threshold:
a= zeros(3,3,3); %Initialize a 3-D array with zeros.
a(1,1,1) = 1; % Set values to 1 to demonstrate connected components
a(1,1,2) = 1;
a(3,3,2) = 1;
CC6 = bwconncomp(a,6); %Compute the connected components. This will have 2 elements including the isolated 1.
res = cellfun(@size,CC6.PixelIdxList,'UniformOutput',false);
% Remove the elements from the cell array which have size lesser than 2.
res( cellfun(@ (x) length(x) <2, CC6.PixelIdxList) ) = [ ];
Hope this helps!
  댓글 수: 4
Hannah Faustyn
Hannah Faustyn 2021년 5월 27일
In the case of my code, I am trying to get each object to represent one particle. However, I think some particles are so close together that they are considered one object in Matlab. I would like to break up clusters of particles, if that makes sense.
Uday Pradhan
Uday Pradhan 2021년 5월 27일
Just a guess, but you might need to look up some morphological operators like imopen <https://www.mathworks.com/help/images/ref/imopen.html imopen > to prepare your image before you apply area thresholding functions. You could try asking a separate question with your real image or a part of it, that way you might get better responses. Let me know here when you post the question with your image. I will definitely check it out.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 3-D Volumetric Image Processing에 대해 자세히 알아보기

제품


릴리스

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by