我需要从太空天空中探测太阳。
以下是输入图像的示例:
经过形态学滤波(两次“开”运算)之后,我得到了以下结果:
这是该处理的算法代码:
以下是输入图像的示例:
![](https://istack.dev59.com/b2gUH.webp)
![](https://istack.dev59.com/A6Mvf.webp)
![](https://istack.dev59.com/Nquaz.webp)
![](https://istack.dev59.com/35cFH.webp)
// Color to Gray
cvCvtColor(image, gray, CV_RGB2GRAY);
// color threshold
cvThreshold(gray,gray,150,255,CV_THRESH_BINARY);
// Morphologic open for 2 times
cvMorphologyEx( gray, dst, NULL, CV_SHAPE_RECT, CV_MOP_OPEN, 2);
对于这样简单的任务来说,处理负担是否太重了?如何找到太阳的中心?如果我找到白点,那么我就可以找到大地(第一个示例图像左上角)的白点。
请建议我进一步采取什么行动来侦测太阳。
更新1:
尝试通过公式获得质心
的算法:{x,y} = {M10 / M00,M01 / M00}
CvMoments moments;
cvMoments(dst, &moments, 1);
double m00, m10, m01;
m00 = cvGetSpatialMoment(&moments, 0,0);
m10 = cvGetSpatialMoment(&moments, 1,0);
m01 = cvGetSpatialMoment(&moments, 0,1);
// calculating centroid
float centroid_x = m10/m00;
float centroid_y = m01/m00;
cvCircle( image,
cvPoint(cvRound(centroid_x), cvRound(centroid_y)),
50, CV_RGB(125,125,0), 4, 8,0);
当我在照片中找到地球时,得到了这样的结果:
因此,重心在地球上。:(
更新2:
尝试使用cvHoughCircles
:
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* circles = cvHoughCircles(dst, storage, CV_HOUGH_GRADIENT, 12,
dst->width/2, 255, 100, 0, 35);
if ( circles->total > 0 ) {
// getting first found circle
float* circle = (float*)cvGetSeqElem( circles, 0 );
// Drawing:
// green center dot
cvCircle( image, cvPoint(cvRound(circle[0]),cvRound(circle[1])),
3, CV_RGB(0,255,0), -1, 8, 0 );
// wrapping red circle
cvCircle( image, cvPoint(cvRound(circle[0]),cvRound(circle[1])),
cvRound(circle[2]), CV_RGB(255,0,0), 3, 8, 0 );
}
第一个例子:bingo,但是第二个例子 - 不行;(
我尝试了不同的cvHoughCircles()
配置 - 无法找到适合每个示例照片的配置。
更新3:
matchTemplate
方法对我有用(来自mevatron
的响应)。它可以使用大量的测试。