La vie nocturne du ciel ou à la recherche des Perséides - traitement

Récemment sur Habré un article a été publié avec le tournage du ciel nocturne "La vie nocturne du ciel ou à la recherche des Perséides" . Mais les auteurs eux-mêmes n'ont pas pu détecter les météores eux-mêmes en raison du grand nombre de satellites, qui dans ce cas sont de faux objets. Je ne pouvais pas passer, j'ai décidé de traiter la vidéo et de voir s'il y avait des perséides dessus ou non.

Pour commencer, j'ai construit une vidéo sans arrière-plan en étoile à l'aide de l'outil BackgroundCubtractorMOG2 d'OpenCV. Pour supprimer les réponses de «bruit» causées par la compression vidéo, j'ai appliqué un filtre de moyenne avec une fenêtre 3x3 à chaque image, et appliqué l'opération d' ouverture à l'image des objets en mouvement pour supprimer les petites réponses. Sans filtrage préalable, les «dames» étaient clairement visibles sur la carte des mouvements. J'ai supprimé les trois premières images du traitement, car l'algorithme BackgroundSubtractorMOG2 sur eux n'a pas encore accumulé d'informations sur le trafic.

code
int generate_meteor_lines() { cv::VideoCapture cap; cap.open(videoname); if(!cap.isOpened()) { printf("can not open video file\n"); return -1; } cv::namedWindow("foreground image", cv::WINDOW_NORMAL); cv::BackgroundSubtractorMOG2 bg_model; double learning_rate = 0.1; bg_model.setBool("detectShadows", false); bg_model.setDouble("backgroundRatio", 0.95); bg_model.setInt("history", 5); bg_model.setInt("fVarInit", 20); cv::Mat img, fgmask, fgimg; std::cerr << "\n"; for(int frames_count = 0;; ++frames_count) { cap >> img; if(img.empty()) { break; } cv::blur(img, img, cv::Size(3, 3)); if(fgimg.empty()) { fgimg.create(img.size(), img.type()); } bg_model(img, fgmask, learning_rate); fgimg = cv::Scalar::all(0); img.copyTo(fgimg, fgmask); cv::threshold(fgimg, fgimg, 20, 255, cv::THRESH_BINARY); cv::Mat mask(cv::Mat::ones(3, 3, CV_8UC1)); mask.at<char>(0, 0) = 0; mask.at<char>(2, 0) = 0; mask.at<char>(0, 2) = 0; mask.at<char>(2, 2) = 0; cv::erode(fgimg, fgimg, mask); cv::dilate(fgimg, fgimg, mask); if(frames_count > 3) { detect_lines(fgimg); } imshow("foreground image", fgimg); std::cerr << "Frame ##" << frames_count << "\n"; char k = (char)cv::waitKey(30); if(k == 27) { break; } } return 0; } 


Vidéo après avoir soustrait l'arrière-plan


Après avoir visionné, il est devenu clair qu'il y a des météores sur la vidéo, mais leur vitesse est beaucoup plus élevée (selon Wikipedia , la vitesse apparente du météore Perséide est d'environ 59 km / s) que la vitesse des satellites, et ils apparaissent sur une ou deux images consécutives sous la forme d'une courte ligne. Ainsi, l'œil n'a tout simplement pas le temps de réagir à eux sur fond d'étoiles brillantes.

Meteor après avoir soustrait l'arrière-plan
Meteor


De plus, afin de faciliter la recherche de météores, j'ai créé un simple détecteur basé sur la transformée de Hough, qui a mis en évidence les météores dans la vidéo originale.

Code
 std::vector<cv::Vec4i> detect_lines(cv::Mat& img) { cv::Mat coi; std::vector<cv::Vec4i> lines; cv::extractChannel(img, coi, 0); double rho_res = 1; double theta_res = CV_PI / 180; double ithreshold = 50; double minLinLength = 50; double maxLineGap = 2; cv::HoughLinesP(coi, lines, rho_res, theta_res, ithreshold, minLinLength, maxLineGap); draw_line_circles(lines, img); return lines; } 



Et même avec un rétro-éclairage, il est difficile de voir s'il y avait un météore ou non. Uniquement si affiché en mode arrêt sur image. Mais après avoir appliqué toutes les traces de météores à l'image d'arrière-plan, nous avons une image plus holistique. On voit que la plupart des objets "volent" en bas à droite de l'image.

Tous les météores détectés



Mais y a-t-il vraiment la constellation de Persée?
Je ne suis pas un grand connaisseur du ciel étoilé, j'ai donc pris une capture d'écran du programme Stellarium avec les Perséides au centre. J'ai sélectionné manuellement un certain nombre d'étoiles que je pouvais faire correspondre sur l'image d'arrière-plan «moyenne» de la vidéo et une capture d'écran du Stellarium. Sur la base des coordonnées des points de liaison, j'ai construit un polynôme bidimensionnel du troisième degré et compté la position de la source perséide de l'image de référence à l'arrière-plan de la vidéo. À ma grande surprise, la source perséide s'est avérée être dans le coin inférieur droit.

«Ciel de référence» avec des étiquettes d'étoiles



Image de Perséide avec des étiquettes étoiles



Les auteurs de l'article n'ont donc pas été en vain recherchés. Les Perséides l'étaient!

Source: https://habr.com/ru/post/fr421463/


All Articles