使用python和opencv检测图像中的部分圆

时间:2014-10-24 07:36:04

标签: python opencv

我今天拍摄了大约220张部分日食的照片,并计划整理一个活动的间隔拍摄动画。正如所料,部分黯然失色的太阳的图像跳了一下,我需要在制作动画之前注册镜头。

以下是示例照片:

http://www.trivalleystargazers.org/gert/sofi_141023/sofi.htm

我想将图像置于太阳上,这显然是日食期间的一段圆圈。我猜月亮会让算法分心(我不想以月球为中心)。我对Python有一些了解,在opencv上没有。

是否有一种简单的方法可以在图像中找到太阳并将其居中到约。 1像素精度? opencv + python是正确的方法吗?是否有特殊的技巧可以达到最佳效果?

谢谢&晴朗的天空, 格特

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

  • 图像阈值
  • 获得最大轮廓
  • 找到包围此轮廓的最小面积圆

一旦找到中心和半径,就会更容易注册。如果快照之间的半径不同,则您必须将所有圆圈的大小调整为预定义大小,并在注册阶段相应地调整中心。

我在OpenCV和C ++中试过这个。

    Mat im = imread(INPUT_FOLDER_PATH + string("SoFi_400_20141023_163450.jpg"));

    Mat gray;
    cvtColor(im, gray, CV_BGR2GRAY);

    Mat bw;
    threshold(gray, bw, 0, 255, CV_THRESH_BINARY|CV_THRESH_OTSU);

    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(bw, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
    /* in actual implementation you'll have to find the largest contour. 
    here i'm just assuming i get one and it's the largest*/
    for(int idx = 0; idx >= 0; idx = hierarchy[idx][0])
    {
        Point2f center;
        float radius;
        minEnclosingCircle(contours[idx], center, radius);
        cout << idx << " (" << center.x << ", " << center.y << ") : " << radius << endl;

        circle(im, Point(center.x, center.y), radius, Scalar(0, 255, 255), 2);
    }

    imshow("", im);
    waitKey();

一些结果:

enter image description here enter image description here