用于直线形式点模式识别的霍夫变换算法

如何解决用于直线形式点模式识别的霍夫变换算法

大家好,我目前正在研究不同的算法,这些算法可以为我提供对齐单元格组内的直线模式。

让我解释一下:

假设我们有一个 XY 平面,它是每 30(y) 个 200(x)。

我得到了一堆标记单元格中心的点(在 xy 坐标中),我的任务是获得通过这些单元格形成一条直线的点的模式。

Points placed in xy plane

模式必须是一组 8 个点:[[point1],[point2],[point3],...[point8]] 如果没有要配对的组,则为一组 4。

Patterns of possible straight lines through the points

直线只能有 -50º 到 50º 的梯度。

例如:

命中的 Y 坐标:

[0.65,0.65,1.9500000000000002,3.25,4.550000000000001,4.550000000000001]

命中的 X 坐标:

[77.7,107.1,191.1,195.3,123.9,79.80000000000001,109.2,193.2,126.00000000000001,77.7,111.3,128.1,197.4,126.00000000000001]

积分是 [77.7,0.65],[107.1,0.65]...等

所以我的第一个想法是实现某种霍夫变换,它会给我一个带有更多“投票”点的 rho 和 theta 值的累加器。

这是代码

puntos_y=[0.65,4.550000000000001]
puntos_x=[77.7,126.00000000000001]

#ANGLE VALUES (50º MAX )
thetas = np.deg2rad(np.arange(-50,50))
#PLANE WIDTH,HEIGHT XY
width,height = 200,30
#DIAG FOR ACCUMULATOR
diag_len = float(np.ceil(np.sqrt(width * width + height * height)))  # max_dist
#LINSPACE DE RHOS
rhos = np.linspace(-diag_len,diag_len,int(2*diag_len))

# STORE SOME VALUES
cos_t = np.cos(thetas)
sin_t = np.sin(thetas)
num_thetas = len(thetas)
num_rhos = len(rhos)

#  ACcumulador (ARRAY THETA VS RHO)
accumulator = np.zeros((int(2*diag_len),num_thetas))

#POINTS
y_idxs,x_idxs = puntos_y,puntos_x

# ACCUMULATOR VoteS
for i in range(len(x_idxs)):
    x = x_idxs[i]
    y = y_idxs[i]

    for t_idx in range(num_thetas):
        # START CALculaTING RHO VALUES. DIAG_LEN FOR POSITIVE INDEX
        rho = round(x * cos_t[t_idx] + y * sin_t[t_idx] + diag_len )
        accumulator[int(rho),int(t_idx)] += 1





def votos_max(accumulator,thetas,rhos):
    #FINDS MAX VoteS IN ACCUMULATOR
    idx = np.argmax(accumulator)
    rho = rhos[int(idx / accumulator.shape[1])]
    theta = thetas[idx % accumulator.shape[1]]

    return idx,theta,rho

#FINDS GRADIENT FOR A THETA
def sacar_pendiente(theta):
    return np.cos(theta) / np.sin(theta)

#FINDS Y WHEN X=0
def sacar_n(theta,rho):
    return rho / np.sin(theta)

这段代码为我提供了一个累加器数组,其中包含列表中每个点的 senoids。这些点相交的地方就是直线的梯度对于每组点都相同的地方。

Hough accumulator of points

问题是:如您所见,点并不构成一条精确的直线。它们排列在 xy 平面上几乎对齐但不完全对齐,这就是为什么您可以在累加器中看到各种高投票点,而不是每 2 组点中只有一个

所以当我看到这样的图形时,我可以想象这种模式:

Patterns recognized

我很想找到一些改进这个累加器的方法,也许是某种改变阈值的方法,所以在累加器中每组点都被视为一个大点(我不知道我是否解释得很好)是就像你小时候一样,把点做得更大,这样线就可以适应了。

考虑到每组 4 个点完全对齐,将直线的精度降低到程序点的某种方法,这当然会导致只有一个“投票最多”(RHO,THETA)点在累加器数组中,然后我将能够提取其坐标并轻松创建模式。

有什么办法可以改善吗? 也许我应该尝试其他类型的算法作为点和直线的模式识别器?

PD:对不起,如果我没有正确解释自己。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?