我想知道比较一组轮廓的最佳策略是什么,实际上是两个图片中的精确边缘检测的边缘,以便知道哪一对更相似。
我有这张图片:
http://i55.tinypic.com/10fe1y8.jpg
我想知道如何计算出哪一种最适合它:
http://i56.tinypic.com/zmxd13.jpg
(它应该是右边的那个)
有没有比较整体的轮廓? 我可以轻松旋转图像,但我不知道使用哪些函数来计算右边的参考图像是最合适的。
这是我已经尝试过使用opencv:
matchShapes函数 - 我使用2个灰度图像尝试了这个函数,我总是在每个比较图像中得到相同的结果,并且值似乎是错误的,因为它是0,0002。
所以我对matchShapes有所了解,但我不确定这是正确的假设,是该函数适用于成对的轮廓而不是完整的图像。现在这是一个问题,因为虽然我有想要比较的图像的轮廓,但它们是数百个,我不知道哪些应该“配对”。
所以我也尝试将第一个图像的所有轮廓与其他两个轮廓进行比较,并使用进行迭代,但我可能会比较,例如,5的轮廓与圆形轮廓的对比两个参考图像而不是2个轮廓。
还试过简单的cv :: compare函数和matchTemplate,没有成功。
答案 0 :(得分:18)
嗯,为此你有几个选择,取决于你需要多么强大的方法。
对于这些方法,我假设您提供的图像是您正在使用的图像(即,对象已经被分割并且大致相同的比例。此外,您将需要更正旋转(至少在粗略的方式。你可以做一些事情,比如每10,30,60或90度迭代旋转比较图像,或者你认为可以逃脱的粗糙度。
例如,
for(degrees = 10; degrees < 360; degrees += 10)
coinRot = rotate(compareCoin, degrees)
// you could also try Cosine Similarity, or even matchedTemplate here.
metric = SAD(coinRot, targetCoin)
if(metric > bestMetric)
bestMetric = metric
coinRotation = degrees
这些解决方案实施起来会更复杂,但可能会产生更强大的分类。