[英]Find image within image (object detection)
我确实有不同的图像,它们在“真实”图像周围都有某种边框。 我想要实现的是找到“真实”图像(以像素为单位的大小和位置)。
对我而言,挑战在于边框并不总是黑色(可以是任何种类的黑色或带有大量噪点的灰色),而“真实”图像(在本例中为鲨鱼的水)可以具有颜色、饱和度、 ...
现在总的来说,我知道像 Canny、Blob 检测、霍夫线等算法,但我才刚刚开始使用它们。 到目前为止,我设法找到了特定图像的边框,但是一旦我尝试将相同的算法和参数应用于下一张图像,它就不起作用了。 我目前的方法是这样的(伪代码):
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.FindContours(_processedImage, contours, Nothing, CvEnum.RetrType.External, CvEnum.ChainApproxMethod.ChainApproxSimple)
查找轮廓我已经尝试了不同的方法,例如:
任何关于如何为(自适应)阈值和精明等算法找到合适参数(适用于所有图像)的提示以及改进处理管道的想法都将受到高度赞赏。
您可以尝试从该图像中减去黑色图像,您将获得内部图像,方法是: 使用图像减法比较 C# 中的图像,
如果边界是统一的,这将很容易。 使用cv::reduce
查找每行和每列的 MIN 和 MAX; 然后计算顶部,左侧,底部,右侧的行/列,其 MIN 和 MAX 等于(或非常接近)附近角落的像素值。 为了理智起见,也许检查四面八方的边框颜色是否相同。
在您的示例中,边框包含微弱的红色内容,但行/列方法可能仍然是简化问题的有用方法。 也许,正如 Nofar 所建议的那样,与您认为的背景颜色完全不同; 平方它,转换为灰色,然后减少到行和列的总和。 您仍然需要找到边缘,但已将数据从二维减少到一维。
如果有一个大的边界和大量的噪音,也许迭代:在第二遍中,从列的统计数据中排除您认为构成边界的行(反之亦然)。
编辑:以上仅适用于直立矩形! 如果它可以旋转,那么行/列投影方法将不起作用。 在这种情况下,我可能会像上面那样求平方和(不要从转换为灰色开始,因为它可能会丢弃信息),然后是模糊或某种形态,边缘检测,然后是某种霍夫变换以找到直线边缘。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.