Detecting Circles without using Hough Circles

2019-04-07 17:03发布

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 from white to black as I don't know the x and y coordinates in the circle. What other methods are there, or how can I make that approach work?

This is my test image:

enter image description here

2条回答
干净又极端
2楼-- · 2019-04-07 17:40

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

Output of threshold:

Output of Canny:

Re-plotted pixels:

查看更多
smile是对你的礼貌
3楼-- · 2019-04-07 17:40

Another approach (that is useful for more than just circles) would be to find the image contours and do image moment analysis on the circle to find it's centre of mass:

enter image description here

enter image description here

I recommend learning them if you'e going to move forward with image processing. They're pretty helpful approaches that transform images into more useful structures.

查看更多
登录 后发表回答