我正在尝试从看起来具有很好清晰度的图像中检测出圆形。我确实意识到圈子的一部分丢失了,但是从我读到的有关霍夫变换的内容来看,这似乎并不会导致我遇到的问题。

输入:

输出:

码:

// 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);

我把高斯模糊注释掉了,因为(直觉上反),这极大地增加了发现同样不准确的圆的数量。

我的输入图像有什么问题会导致Hough无法正常工作吗?我的参数有问题吗?

编辑:第一个答案带来了一个关于霍夫最小/最大半径提示的好点。我拒绝添加这些参数,因为本文中的示例图像只是半径从20到几乎无限变化的数千幅图像之一。

最佳答案

如果您正确设置了minRadiusmaxRadius参数,它会给您带来良好的效果。

对于您的图片,我尝试了以下参数。

method - CV_HOUGH_GRADIENT
minDist - 100
dp - 1
param1 - 80
param2 - 10
minRadius - 250
maxRadius - 300

我得到以下输出

  • 注意:我在C++中尝试过此操作。
  • 09-05 23:16