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

# 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

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)
24 Jul 2015 Dipali Murudkar

### Dipali Murudkar (view profile)

Comment only
23 Jul 2015 Dipali Murudkar

### Dipali Murudkar (view profile)

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.

19 Feb 2015 dharani R

### dharani R (view profile)

pls rectify this error:
red = img(:,:,2); %Use first (red) color plane
tic
toc
circen = circen(inds,:);
end
imshow(red);
hold on;
plot(circen(:,1), circen(:,2), 'r+');
for ii = 1 : size(circen, 1)
'Curvature', [1,1], 'edgecolor', 'b', 'linewidth', 1.5);
end
hold off;

Error in priya1 (line 18)

Comment only
20 Oct 2014 Meghana Dinesh

### Meghana Dinesh (view profile)

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

Comment only
18 Oct 2014 Meghana Dinesh

### Meghana Dinesh (view profile)

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

### Meghana Dinesh (view profile)

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

### Pappu Murthy (view profile)

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

### Theo Walker (view profile)

25 Feb 2013 math works gowroju

### math works gowroju (view profile)

???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

### Yashasvi Purwar (view profile)

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

28 May 2012 Shubham

### Shubham (view profile)

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

Error in ==> imbmpinfo>decodeCompression

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

Comment only

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;

%images[];
for n=1:(numel(x)/3)
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);
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

% 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)
% 'Curvature', [1,1], 'edgecolor', 'b', 'linewidth', 1.5);
% end
for k = 1 : size(circen, 1),
end
hold off;
title(['Raw Image with Circles Detected ', ...
% 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

### ketan patil (view profile)

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( ...
repmat( double(grdmask_IdxJ)+0.5 , [1,length(linaccum_dr)] ) ...
);
lin2accum_aI = floor( ...
repmat( double(grdmask_IdxI)+0.5 , [1,length(linaccum_dr)] ) ...
);
plese tell me

Comment only
19 Nov 2011 Vilém Rechtacek

### Vilém Rechtacek (view profile)

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

### Ralvin Kumar (view profile)

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 :

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),
end
hold off;
title(['Raw Image with Circles Detected ', ...

Comment only
26 Sep 2011 Sarah

### Sarah (view profile)

24 Aug 2011 Paulo

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

### Joseph Corcoran (view profile)

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

### Karen ortega (view profile)

help error :S

Comment only
06 May 2011 Valentin Romanov

### Valentin Romanov (view profile)

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

Comment only
24 Feb 2011 scholar fathi

### scholar fathi (view profile)

excellent job!!
Thanks a lot!!

23 Feb 2011 White Apple

### White Apple (view profile)

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

Comment only
17 Feb 2011 Nagaraju Annamdevula

### Nagaraju Annamdevula (view profile)

04 Jan 2011 Yassine

### Yassine (view profile)

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
can

Error in ==>
imbmpinfo>decodeCompression

Comment only
14 Jul 2010 bass sawet

### bass sawet (view profile)

Excellent code!! THX isn t enough

05 May 2010 Fredrik

### Fredrik (view profile)

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

Comment only
05 May 2010 Fredrik

### Fredrik (view profile)

17 Apr 2010 Truc Phan

### Truc Phan (view profile)

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

### Samuele Lilliu (view profile)

05 Oct 2009 Pavithra

### Pavithra (view profile)

thanks for sharing

11 Aug 2009 Ken Jarman

### Ken Jarman (view profile)

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

### Artesis (view profile)

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

### Lee Borland (view profile)

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

Thanks!

08 Mar 2007 Sander L

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

if (length(SgnCv_LMPos) ~= 0)
for i_radii = (length(SgnCv_LMPos) - 1) : -1 : 1,
circen = [ circen; circen(k,:) ];
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
-----------------------------
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
06 Dec 2005

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

13 Feb 2006