在图像中查找图像(对象检测)

我确实有不同的图像,这些图像在“真实”图像周围都有某种边界。 我想实现的是找到“真实”的图像(像素大小和位置)。

真正的图像显示与鲨鱼的水

对我来说,挑战在于边框不总是黑色的(可以是任何种类的黑色或灰色,有很多噪音),“真实”的图像(在这个例子中有鲨鱼的水)可以有颜色,饱和度, ...

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

  • 转换为灰色CvInvoke.CvtColor(_processedImage, tempMat, CvEnum.ColorConversion.Rgb2Gray)
  • 使用CvInvoke.PyrDown(srcImage, targetImage)CvInvoke.PyrUp(srcImage, targetImage)缩减采样
  • 模糊图像与CvInvoke.GaussianBlur(_processedImage, bluredImage, New Drawing.Size(5, 5), 0)
  • CvInvoke.Threshold(_processedImage, blackWhiteImage, _parameters.BinarizeThreshold, 255, CvEnum.ThresholdType.Binary)
  • CvInvoke.Canny(_processedImage, imgEdges, 60, 100)检测边缘CvInvoke.Canny(_processedImage, imgEdges, 60, 100)
  • 用`CvInvoke.FindContours(_processedImage,contour,Nothing,CvEnum.RetrType.External,CvEnum.ChainApproxMethod.ChainApproxSimple)查找轮廓。
  • 假设最大的轮廓是真实的图像
  • 我已经尝试了不同的方法,例如:

  • 阈值饱和通道和边界框
  • 阈值,canny边缘和发现轮廓
  • 任何暗示,特别是如何找到合适的参数(适用于所有图像)的算法,如(自适应)阈值和canny以及改进处理流水线的想法都将受到高度赞赏。


    您可以尝试从该图像中减去黑色图像,并且您将获得内部图像,方法如下:使用图像相减来比较C#中的图像,


    如果边界是统一的,这将很容易。 使用cv::reduce查找每行和每列的MIN和MAX; 然后计算MIN和MAX与附近角落中的像素值相等(或非常接近)的顶部,左侧,底部,右侧行/列。 为了理智,也许检查边框颜色是相同的四面八方。

    在您的示例中,边框包含微弱的红色内容,但行/列方法可能仍然是简化问题的有用方法。 也许,正如Nofar所说,与你认为的背景颜色有着绝对的区别; 将它平方,转换为灰色,然后减少为行和列的总和。 你仍然需要找到边缘,但是将数据从两个维度减少到了一个。

    如果存在大的边界和大量的噪声,则可能会迭代:在第二遍中,从列的统计数据中排除您认为构成边界的行(反之亦然)。

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

    链接地址: http://www.djcxy.com/p/13977.html

    上一篇: Find image within image (object detection)

    下一篇: Combine several images algorithms