【问题标题】:Detecting Circles without using Hough Circles不使用霍夫圆检测圆
【发布时间】:2016-05-23 20:54:53
【问题描述】:

我有一个圆的图像,我想找到这个圆但不使用霍夫圆。

我找到了一个方法,链接here。

但是我找不到从白色到黑色的过渡坐标,因为我不知道圆中的 x 和 y 坐标。还有哪些其他方法,或者我怎样才能使这种方法发挥作用?

这是我的测试图片:

【问题讨论】:

    标签: c++ opencv image-processing geometry


    【解决方案1】:

    另一种方法(不仅仅是对圆圈有用)是找到image contours 并在圆圈上执行image moment analysis 以找到它的质心:

    如果您要继续进行图像处理,我建议您学习它们。它们是非常有用的方法,可以将图像转换为更有用的结构。

    【讨论】:

    • 非常感谢@Lamar Latrell
    • 拉马尔!你的知识很出色!可以发邮件给我吗:muliastudios@gmail.com?我是一名计算机科学专业的学生,​​我真的可以使用快速帮助!非常感谢!
    • @RoiMulia,我建议您使用 StackOverflow 以获得更快的响应:)
    【解决方案2】:

    一种可能的方法是首先threshold 图像以消除圆圈周围的一些噪点。然后您可以使用Canny 边缘检测提取圆的边缘。最后findNonZero得到像素坐标列表。


    我首先用 Python 做了一个快速原型:

    import cv2
    import numpy as np
    
    img = cv2.imread('circle.png', 0)
    mask = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]
    edges = cv2.Canny(mask, 20, 100)
    points = np.array([p[0] for p in cv2.findNonZero(edges)])
    

    然后将其移植到 C++ 中,添加一些额外的代码来保存所有中间图像并绘制找到的像素。

    #include <opencv2/opencv.hpp>
    
    int main()
    {
        cv::Mat img(cv::imread("circle.png", 0));
    
        cv::Mat mask;
        cv::threshold(img, mask, 127, 255, cv::THRESH_BINARY);
    
        cv::imwrite("circle_1.png", mask);
    
        cv::Mat edges;
        cv::Canny(mask, edges, 20, 100);
    
        cv::imwrite("circle_2.png", edges);
    
        std::vector<cv::Point2i> points;
        cv::findNonZero(edges, points);
    
        cv::Mat output(cv::Mat::zeros(edges.size(), CV_8UC3));
        for (auto const& p : points) {
            output.at<cv::Vec3b>(p) = cv::Vec3b(127, 255, 127);
        }
        cv::imwrite("circle_3.png", output);
    }
    

    threshold的输出:

    Canny的输出:

    重新绘制的像素:

    【讨论】:

    • 如果需要圆形参数,可以使用minEnclosingCircle
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多