繁体   English   中英

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

[英]Find image within image (object detection)

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

显示水与鲨鱼的真实图像

对我而言,挑战在于边框并不总是黑色(可以是任何种类的黑色或带有大量噪点的灰色),而“真实”图像(在本例中为鲨鱼的水)可以具有颜色、饱和度、 ...

现在总的来说,我知道像 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. 假设最大轮廓是真实图像

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

任何关于如何为(自适应)阈值和精明等算法找到合适参数(适用于所有图像)的提示以及改进处理管道的想法都将受到高度赞赏。

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

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

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

如果有一个大的边界和大量的噪音,也许迭代:在第二遍中,从列的统计数据中排除您认为构成边界的行(反之亦然)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM