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
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');