使用Python和OpenCV在图像中检测部分圆形

3

我今天拍摄了大约220张部分日食的图片,并计划制作一个时间轴动画来展示这一事件。如预期,部分遮蔽的太阳图像有些跳动,因此在制作动画之前需要对拍摄的照片进行注册。

以下是样例照片:

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

我想把图像居中放置于太阳上,而太阳显然在日食期间呈圆弧状。我猜月球会影响算法(我不想以月球为中心)。我对Python有一些了解,但对opencv一无所知。

有没有一种简单的方法来找到图像中的太阳并将其居中到大约1个像素的精度?opencv + python是否是适当的方法?是否有特定的技巧可供实现最佳结果?

感谢您的帮助,祝天空清澈明朗!


1
类似的问题在这里:https://dev59.com/yWIj5IYBdhLWcg3wCg_X - Andrey Smorodov
你可以尝试使用HoughCircle方法来检测圆吗?也许你可以选择最大/最中心的圆作为启发式方法,而无需显式地处理“半圆”部分。 - Micka
我猜在这种情况下手动操作会节省你的时间。 - jb.
1个回答

1
您可以尝试以下操作:
  • 对图像进行阈值处理
  • 获取最大轮廓
  • 找到包围此轮廓的最小面积圆

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

我在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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接