OpenCV中自动检测和裁剪感兴趣区域(ROI)

5
我有这些图像要相互比较。然而,有太多的黑色区域,我认为可以裁剪掉以使比较更有效。
我想做的是裁剪火星。如果矩形或圆形能够产生更好的结果,则使用哪种方式都可以。我担心裁剪会导致图像大小不同,这样比较的效果可能不如预期。有什么想法和示例代码吗?谢谢提前。
更新:尝试使用cvHoughCircles(),但无法检测行星 :/

你什么时候拍的这些照片?火星现在已经深入日落了,因为它即将进入太阳共面。 - Mysticial
阈值、检测连接组件、裁剪图像。完成。 - LovaBill
3个回答

6

尝试使用颜色检测。您需要找到除黑色以外的所有颜色。这里这里是这种方法的很好的解释。


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;

现在您已经知道了物块的(x.y) 坐标。然后,您可以使用cvSetImageROI(imgThresh, cvRect(x-10, y-10, x+10, y+10))截取图像。在这里,我假设这个物块的半径小于10个像素。
所有裁剪后的图像大小相同,白色物块(星球)正好位于图像中心。
然后,您可以使用归一化互相关来比较图片。

嗨!ROI 的想法很棒。你能帮我将我的有界框设置为我的 ROI 吗?http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html - Masochist
使用 cvSetImageROI 函数很容易设置ROI。但是,每个图像只能使用一个ROI。 - SRF

1

在这里,直方图没有根本性的失败原因。在进行直方图之前,我会将图像转换为灰度,以使数字更易管理。彩色图像具有3D直方图;红色、绿色、蓝色和灰度直方图都是该3D直方图的1D投影。


对不起,我可能包含了不必要的信息。我的意思是想在没有黑色的情况下进行比较。 - Masochist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接