我将这些图像相互比较。然而,我认为我可以裁剪出太多的黑人,以使比较更有效。
我想做的是庄稼火星。在比较时,矩形或圆形可以产生更好的结果。我担心如果裁剪会导致不同尺寸的图像,那么比较不会像预期的那样有效吗?如果可能,想法如何做和示例代码?提前致谢
更新:尝试使用cvHoughCircles()它不会检测到这个星球:/
答案 0 :(得分:6)
答案 1 :(得分:4)
您可以使用cvCvtColor(img,imgGrayScale,CV_BGR2GRAY)
然后使用cvThreshold(imgGrayScale,imgThresh,x,255,CV_THRESH_BINARY)
对其进行阈值处理。在这里,你必须找到一个很好的x值(我认为x = 50是好的)。
CvMoments *moments = (CvMoments*)malloc(sizeof(CvMoments));
cvMoments(imgThresh, moments, 1);
double moment10 = cvGetSpatialMoment(moments, 1, 0);
double moment01 = cvGetSpatialMoment(moments, 0, 1);
double area = cvGetCentralMoment(moments, 0, 0);
int x = moment10/area;
int y = moment01/area;
现在你知道了blob的(x.y)坐标。然后,您可以使用cvSetImageROI(imgThresh, cvRect(x-10, y-10, x+10, y+10))
裁剪图像。这里我假设这个blob的半径小于10像素。
所有裁剪的图像大小相同,白色斑点(行星)正好位于图像的中间位置。
然后,您可以使用规范化的互相关来比较图像。
答案 2 :(得分:1)
直方图在这里失败没有根本原因。我会在做直方图之前将图像转换为灰度,只是为了使数字更易于管理。彩色图像具有3D直方图;红色,绿色,蓝色和灰度直方图都是该3D直方图的一维投影。