线组之间的距离

时间:2012-12-19 05:30:21

标签: algorithm image-processing

假设我的图像是简单的形状 - 线条,点,曲线和简单对象的集合, 如何计算图像之间的距离 - 所以长度很重要,但总尺度不重要,直线\曲线的位置很重要,角度很重要等等

附加图像例如:

我的比较对象是左上角的一个多维数据集,这个例子的分数是虚构的。

  1. 到圆柱的距离是80(有两条线,但顶部几何形状不同)
  2. 左下方的立方体得分为100,因为它具有不同比例的精确匹配线。
  3. 右下角的矩形得分为90,因为它顶部有精确的匹配线,但侧面有不同的刻度线。
  4. 我正在寻找能够帮助我开始思考解决方案的算法名称或一般方法....

    感谢您的帮助。

    enter image description here

3 个答案:

答案 0 :(得分:2)

这是让你入门的东西。当遇到新问题时,我认为尝试很多复杂步骤并没有多大价值,因为它们可以在某个地方使用。所以我的重点是使用相对简单的东西,这些东西会在更多种情况下失败,但希望你会看到它的价值并对问题有所了解。

该方法完全基于角点检测;这种检测的两种典型方法是Harris检测器或Shi和Tomasi在1994年的“Good Features to Track”一文中描述的方法。我将使用第二种方法,因为在OpenCV中有一个现成的实现,更新的Matlab,可能还有很多其他的地方。它在这些包装上的实施还允许更容易的参数调整,关于拐角质量和拐角之间的最小距离。因此,假设您可以正确检测所有角点,如何根据这些点测量一个形状与另一个形状的接近程度?图像具有任意大小,因此我的想法是将点坐标标准化为范围[0,1]。这解决了根据原始描述所期望的缩放问题。现在我们必须比较范围[0,1]中的点集。在这里,我们选择最简单的方法:从形状p中考虑一个点a,形状b中最接近的点是什么?我们假设它是这一点pb中的任何点之间的最小绝对差异的一个。如果我们总结所有值,我们得到形状之间的得分。分数越低,形状越相似(根据这种方法)。

以下是我画的一些形状:

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

以下是检测到的角落:

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

正如您在最后一组图像中可以清楚地看到的那样,该方法很容易将矩形/正方形与圆柱体混淆。要处理这个问题,您需要将该方法与其他描述符结合起来。最初,您可以考虑的一个简单的方法是形状区域与其边界框区域之间的比率(矩形为1,圆柱为低)。

利用上述方法,这里分别是第一和第二形状,第一和第三形状,......之间的测量值:0.02358485,0.41350339,0.30128458 0.4980852,0.18031262。第二个多维数据集是第一个多维数据集的调整大小版本,如您所见,它们与此度量标准非常相似。最后一个形状是第一个立方体的调整大小版本,但不保持纵横比,并且度量标准给出了更大的差异。

如果你想使用执行此操作的代码,那么(在Python中,取决于OpenCV,numpy):

import sys
import cv2 as cv
import numpy

inp = []
for fname in sys.argv[1:]:
    img_color = cv.imread(fname)
    img = cv.cvtColor(img_color, cv.COLOR_RGB2GRAY)
    inp.append((img_color, img))

ptsets = []

# Corner detection parameters.
params = (
        200,  # max number of corners
        0.01, # minimum quality level of corners
        10,   # minimum distance between corners
)
# Params for visual circle markers.
circle_radii = 3
circle_color = (255, 0, 0)
for i, (img_color, img) in enumerate(inp):
    height, width = img.shape
    cornerMap = cv.goodFeaturesToTrack(img, *params)
    corner = numpy.array([c[0] for c in cornerMap])

    for c in corner:
        cv.circle(img_color, tuple(c), circle_radii, circle_color, -1)

    # Just to visually check for correct corners.
    cv.imwrite('temp_%d.png' % i, img_color)

    # Convert corner coordinates to [0, 1]
    cornerUnity = (corner - corner.min()) / (corner.max() - corner.min())
    # You might want to use other descriptors here. XXX
    ptsets.append(cornerUnity)


def compare_ptsets(p):
    res = numpy.zeros(len(p))

    base = p[0]
    for i in xrange(1, len(p)):
        sum_min_diff = sum(numpy.abs(p[i] - value).min() for value in base)
        res[i] = sum_min_diff

    return res

res = compare_ptsets(ptsets)
print res

答案 1 :(得分:1)

要遵循的流程取决于您要考虑的功能深度和所需的准确度。

如果您想要更准确的内容,请搜索一些技术论文,例如this,这些论文可以提供具体且经过充分验证的方法或算法。

修改

来自 Waltz算法(AI中的一种方法)的想法可以调整。这只是我的想法。解释原始图像,从中生成一些约束。对于每个候选人,找出它满足的约束数量。满足更多约束的那个将与原始图像最相似。

答案 2 :(得分:0)

尝试为每个数字计算mass center。将每个图形点视为质量等于1的粒子。

然后将每个距离计算为sqrt((x1-x2)^2 + (y1-y2)^2),其中(xi,yi)是图i的质心坐标。