問題描述
我正在嘗試從看起來具有非常好的清晰度的圖像中檢測圓形.我確實意識到圓圈的一部分丟失了,但從我讀到的關于霍夫變換的內容來看,這似乎不會導致我遇到的問題.
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++ 中嘗試過.
這篇關于霍夫圓檢測精度很低的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!