【发布时间】:2017-10-26 05:21:06
【问题描述】:
我确实有不同的图像,它们在“真实”图像周围都有某种边框。我想要实现的是找到“真实”图像(以像素为单位的大小和位置)。
对我来说,挑战在于边框并不总是黑色(可以是任何一种带有很多噪点的黑色或灰色),而“真实”图像(本例中是水和鲨鱼)可以有任何颜色组合, 饱和度, ...
现在总的来说,我知道 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)查找轮廓 - 假设最大轮廓是真实图像
我已经尝试了不同的方法,例如:
任何提示,特别是关于如何为(自适应)阈值和 canny 等算法找到合适的参数(适用于所有图像)以及改进处理管道的想法将不胜感激。
【问题讨论】:
标签: c# algorithm opencv image-processing emgucv