霍夫圆检测精度很低
我正在尝试从看起来具有非常好的清晰度的图像中检测圆形.我确实意识到圆圈的一部分丢失了,但从我读到的关于霍夫变换的内容来看,这似乎不会导致我遇到的问题.
I am trying to detect a circular shape from an image which appears to have very good definition. I do realize that part of the circle is missing but from what I've read about the Hough transform it doesn't seem like that should cause the problem I'm experiencing.
输入:
输出:
代码:
// Read the image
Mat src = Highgui.imread("input.png");
// Convert it to gray
Mat src_gray = new Mat();
Imgproc.cvtColor(src, src_gray, Imgproc.COLOR_BGR2GRAY);
// Reduce the noise so we avoid false circle detection
//Imgproc.GaussianBlur( src_gray, src_gray, new Size(9, 9), 2, 2 );
Mat circles = new Mat();
/// Apply the Hough Transform to find the circles
Imgproc.HoughCircles(src_gray, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 1, 160, 25, 0, 0);
// Draw the circles detected
for( int i = 0; i < circles.cols(); i++ ) {
double[] vCircle = circles.get(0, i);
Point center = new Point(vCircle[0], vCircle[1]);
int radius = (int) Math.round(vCircle[2]);
// circle center
Core.circle(src, center, 3, new Scalar(0, 255, 0), -1, 8, 0);
// circle outline
Core.circle(src, center, radius, new Scalar(0, 0, 255), 3, 8, 0);
}
// Save the visualized detection.
String filename = "output.png";
System.out.println(String.format("Writing %s", filename));
Highgui.imwrite(filename, src);
我已将高斯模糊注释掉,因为(直觉上相反)它大大增加了找到的同样不准确的圆圈的数量.
I have Gaussian blur commented out because (counter intuitively) it was greatly increasing the number of equally inaccurate circles found.
我的输入图像有什么问题会导致 Hough 不能像我预期的那样工作吗?我的参数有问题吗?
Is there anything wrong with my input image that would cause Hough to not work as well as I expect? Are my parameters way off?
第一个答案提出了一个关于 Hough 的最小/最大半径提示的好点.我拒绝添加这些参数,因为这篇文章中的示例图像只是数千张图像中的一张,这些图像的半径从大约 20 到几乎无穷大不等.
first answer brought up a good point about the min/max radius hint for Hough. I resisted adding those parameters as the example image in this post is just one of thousands of images all with varying radii from ~20 to almost infinity.
推荐答案
如果你能正确设置 minRadius
和 maxRadius
参数,它会给你很好的结果.
If you'd set minRadius
and maxRadius
paramaeters properly, it'd give you good results.
对于您的图像,我尝试了以下参数.
For your image, I tried following parameters.
method - CV_HOUGH_GRADIENT
minDist - 100
dp - 1
param1 - 80
param2 - 10
minRadius - 250
maxRadius - 300
我得到以下输出
- 注意:我在 C++ 中尝试过.
相关文章