我正在尝试从看起来具有很好清晰度的图像中检测出圆形。我确实意识到圈子的一部分丢失了,但是从我读到的有关霍夫变换的内容来看,这似乎并不会导致我遇到的问题。
输入:
输出:
码:
// 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到几乎无限变化的数千幅图像之一。
最佳答案
如果您正确设置了minRadius
和maxRadius
参数,它会给您带来良好的效果。
对于您的图片,我尝试了以下参数。
method - CV_HOUGH_GRADIENT
minDist - 100
dp - 1
param1 - 80
param2 - 10
minRadius - 250
maxRadius - 300
我得到以下输出