2014-10-24 4 views
3

Я принял около 220 изображений частичного солнечного затмения сегодня и планирую собрать анимацию события по времени. Как и ожидалось, изображение частично затмившегося Солнца скачет немного, и мне нужно зарегистрировать снимки, прежде чем делать анимацию.Обнаружение частичных кругов в изображении с использованием python и opencv

Здесь приведены примеры фотографий:

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

Я хотел бы центрирования изображения на Солнце, которое, очевидно, является сегментом круга во время затмения. Думаю, Луна была бы отвлечением для алгоритма (я не хочу сосредотачиваться на Луне). У меня есть некоторые знания о Python и нет на opencv.

Есть ли простой способ найти Солнце в изображениях и сосредоточить его на ок. 1 пиксельная точность? Является ли opencv + python правильным подходом? Есть ли какие-то трюки, чтобы найти лучший результат?

Благодаря & ясном небе, Герт

+1

Похожий вопрос здесь: http://stackoverflow.com/questions/20698613/detect-semi-circle-in-opencv –

+0

Вы можете попробовать определить круги с помощью метода HoughCircle? Возможно, вы можете выбрать самый большой/наиболее центрированный круг в качестве эвристики вместо того, чтобы явно обращаться к части «полукруга». – Micka

+0

Я предполагаю, что выполнение этого вручную сэкономит ваше время в этом случае. –

ответ

0

Вы можете попробовать это:

  • порог изображения
  • получить наибольший контур
  • найти минимальную площадь круга, который окружает этот контур

Как только вы найдете cen тер и радиус, будет легче зарегистрироваться. Если радиус отличается между моментальными снимками, вам придется изменить размер всех кругов на предопределенный размер и соответственно отрегулировать центр на этапе регистрации.

Я пробовал это в 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

 Смежные вопросы

  • Нет связанных вопросов^_^