Code covered by the BSD License  

Highlights from
Detect circles with various radii in grayscale image via Hough Transform

4.70455
4.7 | 44 ratings Rate this file 160 Downloads (last 30 days) File Size: 113 KB File ID: #9168 Version: 1.1
image thumbnail

Detect circles with various radii in grayscale image via Hough Transform

by

Tao Peng (view profile)

 

27 Nov 2005 (Updated )

Detect circular shapes in a grayscale image. Resolve their center positions and radii.

Editor's Notes:

This file was selected as MATLAB Central Pick of the Week

| Watch this File

File Information
Description

Circular Hough transform based on the gradient field of an image.
1. Operates on grayscale images, NOT B/W bitmaps.
2. NO loops in the implementation of Circular Hough transform, which means faster operation but at the same time larger memory consumption.
3. Detection of radii works for concentric circles as well.

Acknowledgements

This file inspired Coin Segmentation and Spherical Hough Transform For 3 D Images.

Required Products Image Processing Toolbox
Signal Processing Toolbox
MATLAB release MATLAB 7.0.4 (R14SP2)
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (67)
24 Jul 2015 Dipali Murudkar

reply plz

Comment only
23 Jul 2015 Dipali Murudkar

Thanks a lot for this code!!!!!!!!
But I really need your help. I'm trying to detect the circle center of those breast cancer images but I can't find the correct parameters to make CircularHough_Grd to work. Thank you in advance, it's very urgent. It used to work perfectly on 250x250 images but now that those are 640x480 it fails.

plz reply asap..........

19 Feb 2015 dharani R

pls rectify this error:
img = imread('img.png'); %Reads image from directory
red = img(:,:,2); %Use first (red) color plane
red = adapthisteq(red); %Use adaptive histogram equalization
tic
[accum,circen,cirrad] = CircularHough_Grd(red,[15 75],20,13,1);
toc
if any(cirrad <= 0) %Eliminate zero radii
inds = find(cirrad>0);
cirrad = cirrad(inds);
circen = circen(inds,:);
end
imshow(red);
hold on;
plot(circen(:,1), circen(:,2), 'r+');
for ii = 1 : size(circen, 1)
rectangle('Position',[circen(ii,1) - cirrad(ii), circen(ii,2) - cirrad(ii), 2*cirrad(ii), 2*cirrad(ii)],...
'Curvature', [1,1], 'edgecolor', 'b', 'linewidth', 1.5);
end
hold off;
Undefined function or variable 'cirrad'.

Error in priya1 (line 18)
if any(cirrad >= 0)

Comment only
20 Oct 2014 Meghana Dinesh

Are the (x,y) co-ordinates of detected circles stored? If so, how can i access them?

Comment only
18 Oct 2014 Meghana Dinesh

Hello, I want to know if there's a similar algorithm to detect ellipse in an image.
I want to detect the edge of a vehicle wheel's rim when it has been rotated on all the three axes (in 3D). This algorithm by Mr. Tao Peng (CircularHough_Grd) works very well when the rim looks like a circle. But when it resembles an ellipse, due to rotation about all the three axes, it fails to detect the rim.
Kindly help.

Comment only
17 Oct 2014 Meghana Dinesh

Thanks loads! This is of great help =)

29 Sep 2014 Bruno

Bruno (view profile)

Great! I will proved this, i was need something like this!

25 Sep 2014 Yuming

Yuming (view profile)

 
08 May 2014 Pappu Murthy

I applied this to a micrograph containing circular fibers. The program recognized every single one of the fibers and marked its centers correctly. However, some of those fibers have zero radius which is obviously incorrect. Why?

22 Jun 2013 Theo Walker  
25 Feb 2013 math works gowroju

???Attempted to access SgnCv_LMPos(0); index must be a
positive integer or logical.
what to do with this error?

Comment only
06 Jul 2012 Yashasvi Purwar

Why I am getting zero radii despite of providing radii range greater than zero. Thanks

28 May 2012 Shubham  
22 May 2012 Amalia adiba

Dear Mr Taopeng

would you please give me a reason, why while i compile from any example on your program, i got this error

??? Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N)
to change the limit. Be aware that exceeding your available stack space can
crash MATLAB and/or your computer.

Error in ==> imbmpinfo>decodeCompression

I'm using matlab 7.8 (2009a)
there's no problem while i try to call

rawimg = imread('TestImg_CHT_a3.bmp');

Thank you for yor reply

Comment only
22 May 2012 Amalia adiba  
01 Mar 2012 Daniel Delgado

Hello, I really need your help. I'm trying to detect the circle center of those red ball images but I can't find the correct parameters to make CircularHough_Grd to work. Thank you in advance, it's kinda urgent. It used to work perfectly on 160x120 images but now that those are 640x480 it fails.

Here is my code:

x = 90;

%% Read images
%images[];
for n=1:(numel(x)/3)
images{n} = imread(sprintf('%d.jpg',n));
end

Temp = imfinfo('1.jpg');
width =Temp.Width;
height = Temp.Height;

%% Detect circles centers
tic;
for n=1:length(images)
img = images{n};
img2 = imadjust(img, [0 .7], [0 .5]);
%img = imresize(img, 2);
red = img2(:,:,1);
% red = img(:,:,1);
%red = adapthisteq(red);
fltr4img = [1 1 1 1 1; 1 2 2 2 1; 1 2 4 2 1; 1 2 2 2 1; 1 1 1 1 1];
% fltr4img = [1 1 1 1 1; 1 4 4 4 1; 1 4 12 4 1; 1 4 4 4 1; 1 1 1 1 1];
% fltr4img = [1 1 1 1 1; 1 4 8 4 1; 1 4 8 4 1; 1 4 8 4 1; 1 1 1 1 1];
% fltr4img = fltr4img / sum(fltr4img(:));
% imgfltrd = filter2( fltr4img , red );
% imgfltrd = filter2( fltr4img , img2(:,:,1) );
imgfltrd = filter2( fltr4img , red );
% imgfltrd = red;

%tic;
% [accum, circen, cirrad] = CircularHough_Grd(imgfltrd, [15 80], 8, 10);
% [accum, circen, cirrad] = CircularHough_Grd(imgfltrd, [0 26], 3, 4, 1);
% [accum, circen, cirrad] = CircularHough_Grd(red, [11 50], 20, 13, 1);
[accum, circen, cirrad] = CircularHough_Grd(imgfltrd, [90 120], 50, 5, 1);
%toc

if(length(circen)==2)
%circenaccum {n} = circen(1,:)';
circenaccum{n} = [circen(1,1);circen(1,2)];
%circenaccum{n} = [(circen(1,1)-(width/2));(circen(1,2))-(height/2)];
else
circenaccum{n} = [0;0];
end

% if any(cirrad <= 0)
% inds = find(cirrad>0);
% cirrad = cirrad(inds);
% circen = circen(inds,:);
% end

%imshow(img);
figure(1); imagesc(accum); axis image;
title('Accumulation Array from Circular Hough Transform');
% figure(2); imagesc(img2); colormap('gray'); axis image;
% figure(2); imagesc(img); colormap('gray'); axis image;
figure(2); imagesc(imgfltrd); colormap('gray'); axis image;
% figure(9); surf(accum, 'EdgeColor', 'none'); axis ij;
% title('3-D View of the Accumulation Array');
hold on;
plot(circen(:,1), circen(:,2), 'r+');
% for ii = 1 : size(circen, 1)
% rectangle('Position',[circen(ii,1) - cirrad(ii), circen(ii,2) - cirrad(ii), 2*cirrad(ii), 2*cirrad(ii)],...
% 'Curvature', [1,1], 'edgecolor', 'b', 'linewidth', 1.5);
% end
for k = 1 : size(circen, 1),
DrawCircle(circen(k,1), circen(k,2), cirrad(k), 32, 'b-');
end
hold off;
title(['Raw Image with Circles Detected ', ...
'(center positions and radii marked)']);
% pause;
end
toc

%% Draw center points
figure
circenaccummat = cell2mat(circenaccum);
scatter(circenaccummat(1,:),circenaccummat(2,:))
% plot(circenaccummat(1,:), circenaccummat(2,:),'*b');
axis ij;

10 Feb 2012 Fer

Fer (view profile)

 
14 Dec 2011 ketan patil

I didn't understand following part in code
.
rr_4linaccum = double( prm_r_range ); %prm_r_range contain all the sort values of radius in ascending order
linaccum_dr = [ (-rr_4linaccum(2) + 0.5) : -rr_4linaccum(1) , ...
(rr_4linaccum(1) + 0.5) : rr_4linaccum(2) ];

lin2accum_aJ = floor( ...
double(grdx(grdmasklin)./grdmag(grdmasklin)) * linaccum_dr + ...
repmat( double(grdmask_IdxJ)+0.5 , [1,length(linaccum_dr)] ) ...
);
lin2accum_aI = floor( ...
double(grdy(grdmasklin)./grdmag(grdmasklin)) * linaccum_dr + ...
repmat( double(grdmask_IdxI)+0.5 , [1,length(linaccum_dr)] ) ...
);
plese tell me

Comment only
19 Nov 2011 Vilém Rechtacek

Hello,

function CircularHough_Grd works very well for images, but I need to process video stream (for example from web camera). I want to detect eyes in video stream. I want to use CircularHough Tansform for detection of iris, becouse iris have circular shape. I assume, that the face fills the entire scanned image space, so I do not need to detect face.

Can anyone help me? When you send me the complete code, it would be best for me.

Thank you.
Vilem Rechtacek

Comment only
17 Nov 2011 Vince

Vince (view profile)

I'm fairly new to image processing, but I can follow your code halfway decent.

However, I am capturing an image from a webcam, and cant seem to get the function to work. What format should the image be in? I've tried to save it as several formats, but either get a lime green image as the result, or an error saying the image must be 2-dimensional. Any suggestions?

Comment only
17 Nov 2011 Serena

Serena (view profile)

 
26 Sep 2011 Ralvin Kumar

For my application I am using this CircularHough_Grd function to detect COLORED circles.It works fine for red,green,blue,however, it does not get yellow circles or lighter circles.
Here is the image i'am working on:
http://i.imgur.com/OOrmZ.png

And this is what i get with my current codes:
http://i.imgur.com/tP1BY.jpg

My code is :

rgb = imread('capture4.bmp');
rawimg = rgb2gray(rgb);

% rawimg = rgb(:,:,1);

fltr4img = [1 1 1 1 1; 1 2 2 2 1; 1 2 4 2 1; 1 2 2 2 1; 1 1 1 1 1];
fltr4img = fltr4img / sum(fltr4img(:));
imgfltrd = filter2( fltr4img , rawimg);
tic;
[accum, circen, cirrad] = CircularHough_Grd(imgfltrd, [2 20], 0, 3, 0.1);
toc;
figure(1); imagesc(accum); axis image;

figure(2); imagesc(rgb); colormap('gray'); axis image;
hold on;

plot(circen(:,1), circen(:,2), 'r+');axis image;
impixelinfo;
for k = 1 : size(circen, 1),
DrawCircle(circen(k,1), circen(k,2), cirrad(k), 32, 'r-');
end
hold off;
title(['Raw Image with Circles Detected ', ...
'(center positions and radii marked)']);

Comment only
26 Sep 2011 Sarah

Sarah (view profile)

 
24 Aug 2011 Paulo

Paulo (view profile)

nice! thanks!

08 Aug 2011 Kfir

Kfir (view profile)

For some reason, I can't get this to work. I can get the 'accum' matrix and can visually find the local maxima, but the 'circen' and 'cirrad' remain empty.
Any suggestions as to what I should do or which parameters I need to experiment with?
(and I get an error message many times:
"??? Undefined function or method 'filtfilt' for input arguments of type 'double'.

Error in ==> CircularHough_Grd at 606
SgnCv = filtfilt( fltr4SgnCv , [1] , SgnCv );"

Comment only
07 Aug 2011 Joseph Corcoran

For my application I am trying to identify circles that have different radii but similar (but not the same) centre points- They are sufficiently different that I would of thought that it would be possible to seperate them.
Anyone know of a way that I can differentiate the two circles?

15 Jul 2011 Julie

Julie (view profile)

I keep getting fewer circles when I increase the radius range
example
range =[1 30] # of circles=10
range =[1 50] # of circles=2

I am changing nothing else, is this a bug or am I doing something wrong?

Comment only
16 May 2011 Karen ortega

help error :S

Comment only
06 May 2011 Valentin Romanov

same problem with Angelo too =((
please if someone knows how avid this - help!

Comment only
24 Feb 2011 scholar fathi

excellent job!!
Thanks a lot!!

23 Feb 2011 White Apple

same problem with Angelo. What does the error message means?

Comment only
17 Feb 2011 Nagaraju Annamdevula  
04 Jan 2011 Yassine

Good work! Thanks a lot!

18 Nov 2010 Pascal

Pascal (view profile)

this is great work.

However, circle detection has been investigated to perfusion. Ellipse detection is crucial, especially ellipses oriented at specific angles.....

Comment only
17 Nov 2010 Brett Shoelson

Brett Shoelson (view profile)

PLEASE NOTE: As written, this code requires the Signal Processing Toolbox in addition to the Image Processing Toolbox noted as a requirement above. (There's a single call to FILTFILT, which one may be able to replace with a couple calls to MATLAB's FILTER function.)

Comment only
08 Sep 2010 Angelo

Angelo (view profile)

Hi! why do i get this error message?

??? Maximum recursion limit of 500
reached. Use set(0,'RecursionLimit',N)
to change the limit. Be aware that
exceeding your available stack space
can
crash MATLAB and/or your computer.

Error in ==>
imbmpinfo>decodeCompression

Comment only
14 Jul 2010 bass sawet

Excellent code!! THX isn t enough

05 May 2010 Fredrik

Very well written code with extremely good examples and very well commented. Can't thank you enough!

Comment only
05 May 2010 Fredrik  
17 Apr 2010 Truc Phan

Excellent and easy-to-use code with very useful documentation.
Works well in detecting small circles, but less robust for larger ones.
Thanks a lot for the great work.

12 Oct 2009 Samuele Lilliu  
05 Oct 2009 Pavithra

thanks for sharing

11 Aug 2009 Ken Jarman

Excellent code and helpful comments on test cases. If you don't have IPToolbox or SPToolbox, you can still use this if you create or pick up a third-party version of bwlabel.m (labels blobs of dark/light pixels) and filtfilt.m (fwd/bkwd filter).

08 Jul 2009 Artesis

Great work, excellent performance and good results. The algorithm is perfectly customizable by its number of parameters. Thanks, this was the important part of a solution for a problem of weeks.

15 Apr 2009 Roxy

Roxy (view profile)

I have been getting an error on one of your files when i try running it, there is no function name filtfilt.

08 Jan 2009 Lee Borland

Hi all. This may seem like a silly question, but how does one run an add on file such as this? I am attempting to detect circles in images. So far, the only code I have in matlab is open/close code to enhance my edges, then blob analysis to detect my circles and finally convex hull code to fill in my circles. So I now have a BW image containing 4 white circles, very much like the images in the examples.

Can someone advise as to how i now implement this file for radius calculations? I attempted to copy and paste but got the error: Error: Function definitions are not permitted at the prompt or in scripts.

Obviously missing something silly here, can anyone help??

Comment only
05 Jun 2008 Ohil K

I tried out this code, and I dont know if this problem can be solved. When I run the code on an image that has some straight lines too, all along the edge of the straight line, circles are detected. Is there a way to prevent this? I tried changing the threshold but to no avail.

04 May 2008 Vinh Nguyen  
25 Apr 2008 Joan Wang

Excellent performance!

13 Nov 2007 Nat Angarita

Very good code, robust,...the only downside...it provides the values of the estimated radious as whole integers...could not see where I could change this in the code!

21 Sep 2007 Slobodan Vrhovac

This code can be of great help in my project on disk recognition in experiments with granular materials.

20 Sep 2007 Martin Ohmes

Excellent code with great documentation - this code saved my butt. It is a little memory intensive but with a few tweaks I got it working great for some detailed image analysis.

13 Jun 2007 Robert Keck

Note that this also requires the Signal Processing Toolbox since it uses the filtfilt function.

03 Jun 2007 Dr Samir badawy

it straightforward. easy to follow and operate. not tested the programs on the MATLAB yet.

25 Apr 2007 hani ali

good article

Comment only
30 Mar 2007 Paul Premakumar

Kudos to you!Your program is amazing. Your examples were great.
Thanks!

08 Mar 2007 Sander L

I've solved it by changing the code around line 650 into this:

% Save the detected radii
if (length(SgnCv_LMPos) ~= 0)
cirrad(k) = SgnCv_LMPos(end);
for i_radii = (length(SgnCv_LMPos) - 1) : -1 : 1,
circen = [ circen; circen(k,:) ];
cirrad = [ cirrad; SgnCv_LMPos(i_radii) ];
end
end

Comment only
07 Mar 2007 Tao Peng

Hi, Sander and Erinc: The problem you have experienced is a bug in the code and it has been fixed (at least I think so :)). The revised version (March 7, 2007) will soon be posted by Matlab Central. Thank you for pointing out the problem.
Although I have requested that all user comments to be forwarded to my email, a couple of messages here seemed to have slipped. Therefore I would appreciate everyone who has questions about the code does send me emails. I can't guarantee a timely and satisfactory response but I'll do my best.

Comment only
04 Mar 2007 Erinc D

Thanks for sharing this file, it helps a lot!
However, I'm having the same strange problem too (see below). I understand that this is an issue about radius range selection, but I cannot predict which values would make it work.

15 Jan 2007 Sander L

This code can be of great help in my project on pollen recognition in microscopic images. Thanks!

There is one problem however. For some(!) images I get the error message:
-----------------------------
??? Attempted to access SgnCv_LMPos(0); index must be a positive integer or logical.

Error in ==> CircularHough_Grd at 630
cirrad(k) = SgnCv_LMPos(end);
-----------------------------
Can anyone help?

09 Jan 2007 Dany Simard

Clear and efficient

06 May 2006 veli birol

clearly and fast.

29 Apr 2006 Nurettin Senyer

Thank you for EXCELLENT work. Surely, well document and easy to use.

02 Mar 2006 ali volkan

Perfect

30 Jan 2006 Iftach Nachman

Excellent! Works amazingly well in detecting yeast cells in microscopy images.

20 Dec 2005 Gijs H

Excellent work, well documented, easy to use.
Thanks!

20 Dec 2005 e d  
Updates
06 Dec 2005

Updated on Dec. 04, 2005.
A couple of minor changed were made. Algorithm remains untouched.

13 Feb 2006

Added the functionality of detecting the radii of circles.

17 Nov 2010 1.1

Added Signal Processing Toolbox as additional product requirement

Contact us