Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 识别一组点中的矩阵_C#_Java_Algorithm_Pattern Matching - Fatal编程技术网

C# 识别一组点中的矩阵

C# 识别一组点中的矩阵,c#,java,algorithm,pattern-matching,C#,Java,Algorithm,Pattern Matching,我有一张图片,我用我的程序来获得坐标列表 在图像中表示有一个矩阵。 在理想的测试中,我只能得到矩阵每平方的16个中心点。 但在实际测试中,我得到了相当多的噪声点 我想用一个算法从坐标列表中推断,这个组由16个坐标组成,它们最能代表一个矩阵 矩阵可以有任何纵横比(在一个范围内),并且可以产生一点旋转。 但始终是一个4x4矩阵。 矩阵并不总是出现在图像中,但这不是一个问题,我只需要最好的匹配。 当然,创建点始终大于16(或我跳过) 创建点的示例: 设计结果示例: 如果有人能建议我一个更好的方法来

我有一张图片,我用我的程序来获得坐标列表

在图像中表示有一个矩阵。 在理想的测试中,我只能得到矩阵每平方的16个中心点。 但在实际测试中,我得到了相当多的噪声点

我想用一个算法从坐标列表中推断,这个组由16个坐标组成,它们最能代表一个矩阵

矩阵可以有任何纵横比(在一个范围内),并且可以产生一点旋转。 但始终是一个4x4矩阵。 矩阵并不总是出现在图像中,但这不是一个问题,我只需要最好的匹配。 当然,创建点始终大于16(或我跳过)

创建点的示例:

设计结果示例:

如果有人能建议我一个更好的方法来做这将是伟大的

我在想点之间的欧几里德距离

  For each point in the list:
     1. calculate the euclidean distance (D) with the others
     2. filter that points that D * 3 > image.widht (or height)
     3. see if it have at least 2 point at the same (more or less) distance,
        if not skip
     4. if yes put the point in a list and for each same-distance founded points: go to 2nd step.
最后,如果列表中有16个点,这可能是一个矩阵

还有更好的建议吗


谢谢

根据您想要使用的处理能力,假设“小旋转”意味着非常小,您可以尝试以下操作: 1) 仅取点的X坐标,搜索大小为4的簇

2) 对于每个簇,查看左侧距离为d的簇,如果还有两个簇距离为2*d和3*d

3) 如果是,则比较每个簇的y坐标,以查看它们是否大致相等


根据数据,在步骤三之前,执行步骤第二步可以获得更好的性能,并使用它修剪所考虑的选项。 这就是我想到的算法:

for each pair of points (p1, p2):
    let d be the distance vector (x and y) between them
    if d.x > (image.width-p1.x)/3 or d.y > (image.height-p1.y)/3:
        continue
    let d_t be d turned 90 degrees (d.y, -d.x)
    for i from 0 to 3:
        for j from 0 to 3:
            if there is no point at p1 + i*d + j*d_t:
                continue outer loop
    if you get here, you have a 4*4 grid

将运行时间减半(平均),你可以考虑P1的右边的P2。< /P>你想要一个具有周期格的形状吗?在X线或Y线或两者上的近端性?角对称性呢?你也想要钻石形状吗?钻石形状永远不会出现。我认为最大旋转角度(从一个完美的正方形开始)可以是45°(和-45°)。是的,形状有一个周期晶格(X和Y),但当我从图像中外推点时,外推点有点不同。旋转45°的正方形不是菱形吗?@mbeckish我也这么认为不管怎样,欧几里德距离似乎没用。使用2d向量,这样你就可以看到四个点是否在一条线上。@mbeckish我的错误!因此答案是肯定的,它可以有一个菱形:d在初始距离上有一个小的百分比阈值,该算法可以容错找到矩阵点,通过:

改变IF,如果p1+i*d+j*d处最近点的距离与d的差值大于4%
是的,如果数据有噪声或浮点值,那么就这样做。另外,我的算法假设矩阵是正方形的,所以要注意这一点。