在 OpenCV 中自动检测和裁剪 ROI

Posted

技术标签:

【中文标题】在 OpenCV 中自动检测和裁剪 ROI【英文标题】:Automatically detect and crop ROI in OpenCV 【发布时间】:2013-01-28 05:56:55 【问题描述】:

我有这些图片可以相互比较。但是,我认为我可以裁剪出太多的黑色以使比较更有效。

我想做的是裁剪火星。比较时,矩形或圆形可能会产生更好的结果。我担心如果裁剪会导致图像大小不同,比较不会像预期的那样好?如果可能的话,想法如何做和示例代码?提前致谢

更新:尝试使用 cvHoughCircles() 它不会检测到行星:/

【问题讨论】:

这些照片是什么时候拍的?火星即将进入太阳交界,现在日落很深。 阈值,[检测连通分量][1],裁剪图像。完毕。 [1]:***.com/questions/6044119/… 【参考方案1】:

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

【讨论】:

【参考方案2】:

您可以使用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 像素。

所有裁剪后的图像大小相同,白色斑点(行星)正好位于图像的中间。

然后您可以使用标准化互相关比较图像。

【讨论】:

嗨!投资回报率的想法很棒。你会帮我将有界框设置为我的投资回报率吗? docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/… 使用cvSetImageROI函数很容易设置ROI。但是您可以为单个图像使用 1 个 ROI。【参考方案3】:

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

【讨论】:

很抱歉,我必须包含不必要的信息。我想做的是在没有黑人的情况下进行比较。

以上是关于在 OpenCV 中自动检测和裁剪 ROI的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV c++ 裁剪图像

Opencv检测边界和ROI掩码

如何检测图像中的裂缝?

如何在 OpenCv 中轻松检测 2 个 ROI 是不是相交?

使用OpenCV检测损坏的形状

使用 OpenCV Cuda ORB 特征检测器