我今天拍摄了大约220张部分日食的照片,并计划整理一个活动的间隔拍摄动画。正如所料,部分黯然失色的太阳的图像跳了一下,我需要在制作动画之前注册镜头。
以下是示例照片:
http://www.trivalleystargazers.org/gert/sofi_141023/sofi.htm
我想将图像置于太阳上,这显然是日食期间的一段圆圈。我猜月亮会让算法分心(我不想以月球为中心)。我对Python有一些了解,在opencv上没有。
是否有一种简单的方法可以在图像中找到太阳并将其居中到约。 1像素精度? opencv + python是正确的方法吗?是否有特殊的技巧可以达到最佳效果?
谢谢&晴朗的天空, 格特
答案 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();
一些结果: