Circle detection in CTscan

Dear specialists, Currently, I have to detect some circles from CT scan images. The sample is as below
The radius range is from 5-110, so I tried to divide this range into several smaller intervals. However, the results is not adequate. Could anybody please help me to detect them ? Thank you very much.

2 Comments

Sorry, I forget to mention that I use imfindcircles command. This command advices rmax <3*rmin and rmax-rmin <100.
Did you try changing the Sensitivity parameter in imfindcircles? Can you show the code you used?

Sign in to comment.

 Accepted Answer

Image Analyst
Image Analyst on 7 Apr 2014
Did you try imfindcircles()?

11 Comments

As I mentioned in my comment, I used imfindcircles, but the results wasn't good. I have tried to play with parameters, but no improvement gained. I was surprised because I thought those circles should be easy to be detected.
Sorry - I must not have seen your comment. If you can't get imfindcircles to work, then you can draw them manually with imellipse - let me know if you need a demo.
Or else you should try to do a background correction to brighten the center and dim the outside. Take the centroid and then take the average intensity profile radially from the centroid. Fit a quadratic to it and use it to create a model background then divide the image by it.
Then use a noise reduction filter, maybe start simple, like with medfilt2(). If that doesn't work, then try more sophisticated ones like mean shift, non-local means, or things like that.
Then try to use an edge detector like imgradient or a texture filter like entropyfilt() or stdfilt(). It will definitely take some experimentation.
@Image Analyst: Thank you very much for your reply. Because I have thousands of images like this to analyse, I think I prefer an automatic solution with imfindcircles or something similar. I also had tried to correct the contrast, but the noise became more clear that reduced the accuracy of imfindcircles. Therefore, I tried to reduce the noise first. I haven't used non-local means but I used medfilt2 and wiener2. However, both of them do not increase the accuracy of detection. Maybe I did not use the right parameters, but I don't know how because I have tried several values in vain. As I mentioned above, I tried to divide the radius range into several small interval with different sensitivity. However, the big circles can be detected with only very high sensitivity 0.98, which makes some fake circles. It surprised me because I thought the big circles are very easy to be detected.
Can you average several slices together to reduce noise, then use the same circles for each slice?
Peter To
Peter To on 9 Apr 2014
Edited: Peter To on 9 Apr 2014
@ Image Analyst: Yes, I did it. I tried to read 5 slices at once, and correlated the images. When a point had its grayscale values more than 150 in 4 slices, I set the value to 255. However, it did not improved the results. Do you have any suggestion ?
Have you tried averaging them together? Maybe try texture segmentation. Check out standard ISO 25178 on Surface Texture.
@Image Analyst: The radius of circles should change by slices, so the averaging process can make some extra difficulties for the circle detection. I have no idea about the texture segmentation. Could you please tell me more precisely?
Try entropyfilt() and stdfilt() and see what you get.
I tried, and both of them give me ugly results like
The standard deviation filter did a pretty good job on the bigger circles. See attached m-file.
It is awesome, I will study your code right now. Although this code cannot detect the small circles, it helps me to start over. Thank you very much.

Sign in to comment.

More Answers (1)

Julia
Julia on 15 Apr 2015
This code looks really useful. I tried to use it for the detection of pores in the attached picture. As you can see, especially in the center, the pore spaces are widely connected, so a distinction would be needed. Basically i would like to fit in circles into the pore spaces to get a pore size distribution. Using your proposed code as it is does not help in this case. Could you suggest which parameters to play with in order to make it fit better for less obvious cases like mine?

2 Comments

There is no picture attached. I suggest you start a new question with it. You can reference this one if you want.
Julia
Julia on 16 Apr 2015
Edited: Julia on 16 Apr 2015
I attached the picture. I will also start a new question. Thanks. http://www.mathworks.com/matlabcentral/answers/203771-detect-highly-connected-pores-in-a-ct-scan

Sign in to comment.

Asked:

on 7 Apr 2014

Edited:

on 16 Apr 2015

Community Treasure Hunt

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

Start Hunting!