Hi, is there a way to detect irregular shapes, then select the ones that are closest to circles and use those for analysis?

6 views (last 30 days)
My problem can be seen in the figure attached. I am looking to detect dark circular objects that are flowing in an experiment surrounded by fluorescent material (bright). Due to the flow, they can get distorted and elongated. I need to determine the intensity in their centers, and measure the radius (and center position).
I have been using imfindcircles as follows (I load a tif stack into FinalImage):
for i=3:NumberImages
I= FinalImage(:,:,i);
Ibg= FinalImage(:,:,i-2);
It=imadjust(I);
I1= Ibg-I; %so now my dark circles are bright
I2= imadjust(I1);
level= graythresh(I2);
bw= im2bw(I2,level);
bw= bwareaopen(bw,5);
BWdfill = imfill(bw,4, 'holes');
BWnobord = imclearborder(BWdfill, 4);
seD = strel('diamond',1);
BWfinal = imerode(BWnobord,seD);
BWfinal = imerode(BWfinal,seD);
test=sum(BWfinal(:));
if test>500 %this is my condition for event detection
Rmin = 15;
Rmax = 45;
[centersBright, radiiBright] = imfindcircles(BWfinal,[Rmin Rmax],'ObjectPolarity','bright','Sensitivity',0.9);
if numel(centersBright)~=0
imshow(I2);
circ=viscircles(centersBright, radiiBright,'EdgeColor','b');
f = getframe(gcf);
imwrite(f.cdata, outputFileName1, 'WriteMode', 'append', 'Compression','none'); %this is the part that I'm showing you in the image
I have a more sophisticated background subtraction loop as well, but that is irrelevant here.
The image on the RHS is an acceptable detection for me, but the one on the LHS is not. Is there a way for me to detect all these events, whatever their shape, and then select the ones closest to circles and use only those for analysis?
I'm rather new to Matlab, so any help would be much appreciated.
Thanks and regards Jehangir

Accepted Answer

Image Analyst
Image Analyst on 6 Nov 2013
Then I would not use imfindcircles. Just threshold and find the blobs. Then ask regionprops to give you the area and perimeter. Then calculate the circularities and keep the ones that you think are round enough. Here's some untested code just off the top of my head.
binaryImage = grayImage > 128; % or whatever.
labeledImage = bwlabel(binaryImage);
measurements = regionprops(labeledImage, 'Area', 'Perimeter');
allAreas = [measurements.Area];
allPerimeters = [measurements.Perimeter];
circularities = (allPerimeters .^ 2) ./ (4 * pi * allAreas);
isRoundEnough = circularities < 4; % or whatever value you want.
% Get new labeled image with only the round blobs.
keeperLabels = find(isRoundEnough);
labeledImage = ismember(labeledImage, keeperLabels);
% Re-measure only the round blobs.
measurements = regionprops(labeledImage, 'Area', 'Perimeter');
  3 Comments
Image Analyst
Image Analyst on 6 Nov 2013
It thresholds to give a binary image - foreground and background - so that you can get the area and perimeter of the foreground.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!