如何解决用于直线形式点模式识别的霍夫变换算法
大家好,我目前正在研究不同的算法,这些算法可以为我提供对齐单元格组内的直线模式。
让我解释一下:
假设我们有一个 XY 平面,它是每 30(y) 个 200(x)。
我得到了一堆标记单元格中心的点(在 xy 坐标中),我的任务是获得通过这些单元格形成一条直线的点的模式。
模式必须是一组 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。这些点相交的地方就是直线的梯度对于每组点都相同的地方。
问题是:如您所见,点并不构成一条精确的直线。它们排列在 xy 平面上几乎对齐但不完全对齐,这就是为什么您可以在累加器中看到各种高投票点,而不是每 2 组点中只有一个。
所以当我看到这样的图形时,我可以想象这种模式:
我很想找到一些改进这个累加器的方法,也许是某种改变阈值的方法,所以在累加器中每组点都被视为一个大点(我不知道我是否解释得很好)是就像你小时候一样,把点做得更大,这样线就可以适应了。
考虑到每组 4 个点完全对齐,将直线的精度降低到程序点的某种方法,这当然会导致只有一个“投票最多”(RHO,THETA)点在累加器数组中,然后我将能够提取其坐标并轻松创建模式。
有什么办法可以改善吗? 也许我应该尝试其他类型的算法作为点和直线的模式识别器?
PD:对不起,如果我没有正确解释自己。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。