在图像中查找图像(对象检测)
我确实有不同的图像,这些图像在“真实”图像周围都有某种边界。 我想实现的是找到“真实”的图像(像素大小和位置)。
对我来说,挑战在于边框不总是黑色的(可以是任何种类的黑色或灰色,有很多噪音),“真实”的图像(在这个例子中有鲨鱼的水)可以有颜色,饱和度, ...
现在通常我知道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)
我已经尝试了不同的方法,例如:
任何暗示,特别是如何找到合适的参数(适用于所有图像)的算法,如(自适应)阈值和canny以及改进处理流水线的想法都将受到高度赞赏。
您可以尝试从该图像中减去黑色图像,并且您将获得内部图像,方法如下:使用图像相减来比较C#中的图像,
如果边界是统一的,这将很容易。 使用cv::reduce
查找每行和每列的MIN和MAX; 然后计算MIN和MAX与附近角落中的像素值相等(或非常接近)的顶部,左侧,底部,右侧行/列。 为了理智,也许检查边框颜色是相同的四面八方。
在您的示例中,边框包含微弱的红色内容,但行/列方法可能仍然是简化问题的有用方法。 也许,正如Nofar所说,与你认为的背景颜色有着绝对的区别; 将它平方,转换为灰色,然后减少为行和列的总和。 你仍然需要找到边缘,但是将数据从两个维度减少到了一个。
如果存在大的边界和大量的噪声,则可能会迭代:在第二遍中,从列的统计数据中排除您认为构成边界的行(反之亦然)。
编辑:上面只适用于一个直立的矩形! 如果它可以旋转,那么行/列投影方法将不起作用。 在这种情况下,我可能会像上面那样求平方和差(不要从转换为灰色开始,因为它可能会丢弃信息),然后是模糊或某种形态,边缘检测然后进行某种Hough变换以找到直线边缘。
链接地址: http://www.djcxy.com/p/13977.html