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

问题描述

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

让我解释一下:

假设我们有一个 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 (将#修改为@)