Detecting Circles without using Hough Circles

后端 未结 2 463
轻奢々
轻奢々 2021-02-10 05:56

I have an image of a circle, I want to find the circle but not using hough circles.

I found a way, linked here.

But I can\'t find the transition coordinates fro

2条回答
  •  情深已故
    2021-02-10 06:08

    One possible approach is to first threshold the image to get rid of some of the noise around the circle. Then you can extract the edge of the circle using Canny edge detection. Finally, findNonZero to get a list of pixel coordinates.


    I first did a quick prototype with 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)])
    

    And then ported it to C++, adding some extra code to save all the intermediate images and plot the found pixels.

    #include 
    
    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 points;
        cv::findNonZero(edges, points);
    
        cv::Mat output(cv::Mat::zeros(edges.size(), CV_8UC3));
        for (auto const& p : points) {
            output.at(p) = cv::Vec3b(127, 255, 127);
        }
        cv::imwrite("circle_3.png", output);
    }
    

    Output of threshold:

    Output of Canny:

    Re-plotted pixels:

提交回复
热议问题