Extract Circle Features From Image
-
AFAIK Hough is the best available. When the circles are prominent, i.e. have quite some thickness, you could reduce the resolution of your image so the thickness of the circle(s) becomes say 2 pixels; that should provide quite some performance improvement. And of course image processing is a field where you can efficiently apply multi-threading, as well as gain performance by putting locality of reference first (i.e. deal with bands or small areas, not entire images at once). :)
Luc Pattyn [My Articles] Nil Volentibus Arduum
Thanks for the suggestions :thumbsup: I'll definitely try reducing the resolution and try to utilize more multi-threading (this is for a mobile app, and the benefits of multi-threading aren't THAT great). I've been playing with blur and color changes as well to speed things up.
Be The Noise
-
AFAIK Hough is the best available. When the circles are prominent, i.e. have quite some thickness, you could reduce the resolution of your image so the thickness of the circle(s) becomes say 2 pixels; that should provide quite some performance improvement. And of course image processing is a field where you can efficiently apply multi-threading, as well as gain performance by putting locality of reference first (i.e. deal with bands or small areas, not entire images at once). :)
Luc Pattyn [My Articles] Nil Volentibus Arduum
Just wanted to let you know that I may have found a good alternative for the Hough Transform. I found this and am just passing it along: Fast Circle Detection Using Gradient Pair Vectors http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.121.9956&rep=rep1&type=pdf[^] The limitations are fine for my application, and it claims to provide 80x-700x speed improvements over other popular methods.
Be The Noise
-
So I'm working on a side project at the moment dealing with computer vision, and I find myself needing to identify circles of an unknown size in an image. I've found a lot of information online about using the Hough Transform for circles, and MANY variations of that transform. Is there anything else out there that can be used for this purpose? I'm looking for something else that is quicker than the Hough Transform, and I am willing to sacrifice some accuracy to achieve this. Please note that I am not looking for a library or tool to do this for me (like OpenCV), I've found plenty of them, and they all use the Hough Transform. I'm looking for an actual algorithm or related research.
Be The Noise
The erosion operator (http://en.wikipedia.org/wiki/Erosion_%28morphology%29[^] ) can detect circles faster than the Hough Transform. You have to know the size in advance, though, although you can do N searches for N different diameters. (You'd have to do N searches for different sized circles using the Hough Transform also.) Are the circles drawn as just the circumferences, or are they filled in?
"Microsoft -- Adding unnecessary complexity to your work since 1987!"
-
The erosion operator (http://en.wikipedia.org/wiki/Erosion_%28morphology%29[^] ) can detect circles faster than the Hough Transform. You have to know the size in advance, though, although you can do N searches for N different diameters. (You'd have to do N searches for different sized circles using the Hough Transform also.) Are the circles drawn as just the circumferences, or are they filled in?
"Microsoft -- Adding unnecessary complexity to your work since 1987!"
Very nice, thanks :thumbsup: I'll check it out and let you know if it works out. While the sizes of circles change a bit, it's not too bad to just go through a few diameters. The circles are filled, though I could do an edge detection to get rid of it if needed.
Be The Noise
-
Very nice, thanks :thumbsup: I'll check it out and let you know if it works out. While the sizes of circles change a bit, it's not too bad to just go through a few diameters. The circles are filled, though I could do an edge detection to get rid of it if needed.
Be The Noise
The Wikipedia article makes it look harder than it is. Erosion (binary) can be easily implemented as only shifts and ANDs. To recognize a circle: 1. Take an arc that's half the circle's circumference, and divide it into N segments. Each segment is a short vector. 2. For each vector, shift the image by that vector and AND it with the original image. 3. When you're done, pixels will remain only at the regions that were at the center of (at least) a circle of the original size. 4. Starting at the higher diameters will enable you to remove them first, so you can recognize the smaller diameters later.
"Microsoft -- Adding unnecessary complexity to your work since 1987!"
-
The Wikipedia article makes it look harder than it is. Erosion (binary) can be easily implemented as only shifts and ANDs. To recognize a circle: 1. Take an arc that's half the circle's circumference, and divide it into N segments. Each segment is a short vector. 2. For each vector, shift the image by that vector and AND it with the original image. 3. When you're done, pixels will remain only at the regions that were at the center of (at least) a circle of the original size. 4. Starting at the higher diameters will enable you to remove them first, so you can recognize the smaller diameters later.
"Microsoft -- Adding unnecessary complexity to your work since 1987!"
haha, you must've been reading my mind ;P This makes it much easier to implement. Thanks! :thumbsup:
Be The Noise
-
haha, you must've been reading my mind ;P This makes it much easier to implement. Thanks! :thumbsup:
Be The Noise
Looking at this again, I realized Step 2 could be misinterpreted: "2. For each vector, shift the image by that vector and AND it with the original image." By "original image", I mean the image before the shift. So,
foreach (vector in Vectors)
{
previousImage = image;
image.shiftBy (vector);
image.andWith (previousImage);
}And all remaining pixels in 'image' are contained within (at least) a circle of the given radius.
"Microsoft -- Adding unnecessary complexity to your work since 1987!"
-
Thanks for the suggestions :thumbsup: I'll definitely try reducing the resolution and try to utilize more multi-threading (this is for a mobile app, and the benefits of multi-threading aren't THAT great). I've been playing with blur and color changes as well to speed things up.
Be The Noise
-
So I'm working on a side project at the moment dealing with computer vision, and I find myself needing to identify circles of an unknown size in an image. I've found a lot of information online about using the Hough Transform for circles, and MANY variations of that transform. Is there anything else out there that can be used for this purpose? I'm looking for something else that is quicker than the Hough Transform, and I am willing to sacrifice some accuracy to achieve this. Please note that I am not looking for a library or tool to do this for me (like OpenCV), I've found plenty of them, and they all use the Hough Transform. I'm looking for an actual algorithm or related research.
Be The Noise
Hello, When it comes to image processing tasks, I would say that it is much easier to discuss when there are few sample pictures available (if there are no some confidentiality restrictions of course). Talking about circles ... in some cases you can simplify things a lot by finding stand alone blobs/objects in a picture and then doing further shape analysis of those ...
With best regards, Andrew Kirillov AForge.NET
-
Hello, When it comes to image processing tasks, I would say that it is much easier to discuss when there are few sample pictures available (if there are no some confidentiality restrictions of course). Talking about circles ... in some cases you can simplify things a lot by finding stand alone blobs/objects in a picture and then doing further shape analysis of those ...
With best regards, Andrew Kirillov AForge.NET
Hi Andrew, There is no confidentiality, and I have many samples of the images, but it would probably be easier to get some samples yourself. I'm working on a mobile app to identify traffic lights and tell me what color it is as I drive. I've found a lot of research on the topic, but most of the research methods use extra computers in the trunk of the car, so it doesn't work too well on a consumer smart phone. I've actually been using some of the algorithms in the Aforge library to identify the circles (great work by the way). Reducing the resolution before I use the camera, and some blurring have helped a lot. I also use some color filtering to make sure I'm only looking for the colored lights within a certain threshold (Red, Amber, Green). I've also been toying with the accelerometers to do some course localization so I don't have to scan the entire image. All together, I'm getting some decent results, but I still need to put in a lot more time on the project. This is just something I'm doing for fun, not anything work related. Right now I'm really dealing with false positives due to street lamps, and other car break lights, which is another reason I've been trying to localize the scanning. I'm also working through some instances where if the traffic light is back lit by a street lamp at night, or the sun during the day, it makes it very hard to spot; but I'm thinking some white balance can help with that. Thanks for chiming in! If you have any ideas that you think may help with this, please feel free to pass it along!
Be The Noise
-
Hi Andrew, There is no confidentiality, and I have many samples of the images, but it would probably be easier to get some samples yourself. I'm working on a mobile app to identify traffic lights and tell me what color it is as I drive. I've found a lot of research on the topic, but most of the research methods use extra computers in the trunk of the car, so it doesn't work too well on a consumer smart phone. I've actually been using some of the algorithms in the Aforge library to identify the circles (great work by the way). Reducing the resolution before I use the camera, and some blurring have helped a lot. I also use some color filtering to make sure I'm only looking for the colored lights within a certain threshold (Red, Amber, Green). I've also been toying with the accelerometers to do some course localization so I don't have to scan the entire image. All together, I'm getting some decent results, but I still need to put in a lot more time on the project. This is just something I'm doing for fun, not anything work related. Right now I'm really dealing with false positives due to street lamps, and other car break lights, which is another reason I've been trying to localize the scanning. I'm also working through some instances where if the traffic light is back lit by a street lamp at night, or the sun during the day, it makes it very hard to spot; but I'm thinking some white balance can help with that. Thanks for chiming in! If you have any ideas that you think may help with this, please feel free to pass it along!
Be The Noise