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

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

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

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

【问题讨论】:

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

标签: c++ visual-studio-2010 opencv


【解决方案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 像素。

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

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 很抱歉,我必须包含不必要的信息。我想做的是在没有黑人的情况下进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多