【问题标题】:Find image within image (object detection)在图像中查找图像(对象检测)
【发布时间】:2017-10-26 05:21:06
【问题描述】:

我确实有不同的图像,它们在“真实”图像周围都有某种边框。我想要实现的是找到“真实”图像(以像素为单位的大小和位置)。

对我来说,挑战在于边框并不总是黑色(可以是任何一种带有很多噪点的黑色或灰色),而“真实”图像(本例中是水和鲨鱼)可以有任何颜色组合, 饱和度, ...

现在总的来说,我知道 Canny、Blob 检测、霍夫线等算法,但我才刚刚开始使用它们。到目前为止,我设法找到了特定图像的边框,但是一旦我尝试将相同的算法和参数应用于下一张图像,它就不起作用了。我目前的做法是这样的(伪代码):

  1. 转换为灰色CvInvoke.CvtColor(_processedImage, tempMat, CvEnum.ColorConversion.Rgb2Gray)
  2. 使用CvInvoke.PyrDown(srcImage, targetImage) 和CvInvoke.PyrUp(srcImage, targetImage) 进行下采样
  3. 用CvInvoke.GaussianBlur(_processedImage, bluredImage, New Drawing.Size(5, 5), 0)模糊图像
  4. 用CvInvoke.Threshold(_processedImage, blackWhiteImage, _parameters.BinarizeThreshold, 255, CvEnum.ThresholdType.Binary)二值化
  5. 使用CvInvoke.Canny(_processedImage, imgEdges, 60, 100) 检测边缘
  6. 使用CvInvoke.FindContours(_processedImage, contours, Nothing, CvEnum.RetrType.External, CvEnum.ChainApproxMethod.ChainApproxSimple) 查找轮廓
  7. 假设最大轮廓是真实图像

我已经尝试了不同的方法,例如:

任何提示,特别是关于如何为(自适应)阈值和 canny 等算法找到合适的参数(适用于所有图像)以及改进处理管道的想法将不胜感激。

【问题讨论】:

    标签: c# algorithm opencv image-processing emgucv


    【解决方案1】:

    你可以尝试从这个图像中减去黑色图像,你会得到内部图像,方法是: Use image subtraction to compare images in C#,

    【讨论】:

    • 感谢您的想法和链接。我是否正确理解这一点,我从与原始图像相同大小的完全黑色图像开始,然后从黑色中减去原始图像?如问题中所述,边框并不总是黑色,而是一种灰色。所以我最终会以另一个灰色的边框结束,对吗?下一个问题是我需要内部图像的坐标和大小。怎么做?很抱歉初学者的问题,但这东西我真的不清楚。
    • 减去一个全黑的图像当然是无操作的,但减去其他东西可能有用。 BTW OpenCV 有一个内置函数,用于计算图像之间的绝对差异,并找到最大值。
    【解决方案2】:

    如果边界是统一的,这将很容易。使用cv::reduce 查找每行和每列的 MIN 和 MAX;然后计算上、左、下、右行/列,其 MIN 和 MAX 等于(或非常接近)附近角落的像素值。为了理智,也许检查边框颜色是否在所有方面都相同。

    在您的示例中,边框包含淡红色的东西,但行/列方法可能仍然是简化问题的有用方法。也许,正如 Nofar 建议的那样,与您认为的背景颜色绝对不同;将其平方,转换为灰色,然后减少为行和列的总和。您仍然需要找到边,但已将数据从二维减少到一维。

    如果边框很大且噪音很大,可能会进行迭代:在第二遍中,从列的统计信息中排除您认为构成边框的行(反之亦然)。

    编辑:以上仅适用于直立矩形!如果它可以旋转,那么行/列投影方法将不起作用。在那种情况下,我可能会像上面那样求平方和(不要从转换为灰色开始,因为它可能会丢弃信息),然后是模糊或一些形态学、边缘检测,然后是某种霍夫变换以找到直线边缘。

    【讨论】:

    • 好主意!谢谢。实际上,矩形略微旋转。刚刚研究了平方差之和。但是,我不清楚如何在单个图像上使用它。我可以假设整个图像的某个部分将是边框。你是这个意思吗?还是您想更细粒度地比较图像的某些部分?
    • @Jan 好吧,我没有完整的解决方案,但尝试提供一些想法。最终,这将取决于您的特定图像内容。如果旋转很轻微,我可能仍然会尝试切断行和列。是否有任何地区始终是背景?还是背景总是很暗?如果不是,那么您可能需要一些其他方法来识别背景,例如它的纹理。 (看起来像是一部电影,在这种情况下,你也可以用多帧来做一些事情......)
    • 非常感谢您的时间和精力!一旦我回到我的机器上,我会在下周检查你的想法。
    猜你喜欢
    • 1970-01-01
    • 2012-06-05
    • 2019-07-13
    • 2022-06-10
    • 2017-08-28
    相关资源
    最近更新 更多