我今天拍了大约 220 张日偏食的照片,并计划制作该事件的延时动画。正如预期的那样,日偏食的图像会跳来跳去,我需要在制作动画之前对镜头进行配准。
以下是示例照片:
http://www.trivalleystargazers.org/gert/sofi_141023/sofi.htm
我想将图像集中在太阳上,这在 eclipse 期间显然是圆的一部分。我猜月亮会分散算法的注意力(我不想以月亮为中心)。我对 Python 有一些了解,但对 opencv 没有任何了解。
有没有一种简单的方法可以在图像中找到太阳并将其居中到大约。 1像素精度? opencv + python 是正确的方法吗?是否有特定的技巧可以达到最佳效果?
谢谢 & 晴朗的天空,
格特
你可以试试这个:
- 阈值图像
- 得到最大的轮廓
- 找到包围该轮廓的最小面积圆
找到中心和半径后,注册起来会更容易。如果快照之间的半径不同,您必须将所有圆圈的大小调整为预定义的大小,并在配准阶段相应地调整中心。
我在 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();
一些结果: