Позвольте мне объяснить:
Предположим, у нас есть плоскость XY, которая равна 200(x) на 30(y).
I' m задан набор точек, обозначающих центры ячеек (в xy координаты), и моя задача — получить шаблоны точек, которые образуют прямую линию через эти ячейки.
Точки, расположенные в плоскости xy
Шаблоны должны быть группа из 8 точек: [[point1],[point2],[point3],...[point8]] или группа из 4, если нет группы для сопряжения.
Схемы возможных прямых, проходящих через точки
Прямые линии могут иметь градиент только от -50° до 50°.
Например:
Координаты Y попадания:
Код: Выделить всё
[0.65, 0.65, 0.65, 0.65, 0.65, 1.9500000000000002, 1.9500000000000002, 1.9500000000000002, 1.9500000000000002, 3.25, 3.25, 3.25, 3.25, 3.25, 4.550000000000001, 4.550000000000001, 4.550000000000001, 4.550000000000001]
Код: Выделить всё
[77.7, 107.1, 191.1, 195.3, 123.9, 79.80000000000001, 109.2, 193.2, 126.00000000000001, 77.7, 111.3, 195.3, 123.9, 128.1, 79.80000000000001, 109.2, 197.4, 126.00000000000001]
Поэтому моей первой мыслью было реализовать какое-то преобразование Хафа, которое вернуло бы мне аккумулятор со значениями ро и тета для точек с большим количеством "голосов".
Это код :
Код: Выделить всё
puntos_y=[0.65, 0.65, 0.65, 0.65, 0.65, 1.9500000000000002, 1.9500000000000002, 1.9500000000000002, 1.9500000000000002, 3.25, 3.25, 3.25, 3.25, 3.25, 4.550000000000001, 4.550000000000001, 4.550000000000001, 4.550000000000001]
puntos_x=[77.7, 107.1, 191.1, 195.3, 123.9, 79.80000000000001, 109.2, 193.2, 126.00000000000001, 77.7, 111.3, 195.3, 123.9, 128.1, 79.80000000000001, 109.2, 197.4, 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)
Хотя накопитель точек
ПРОБЛЕМА В следующем: Как видите, точки не образуют точную прямую линию. Они расположены в плоскости xy почти выровнены, но не точно, поэтому в аккумуляторе вы можете видеть различные точки с большим количеством голосов, а не только одну на две группы точек.
Так что я могу представьте себе шаблон, когда я увижу его графически следующим образом:
Шаблоны распознаны
Мне бы хотелось найти какой-нибудь способ улучшить этот аккумулятор, может быть, какой-нибудь способ изменения порога, чтобы в аккумуляторе каждая группа точек рассматривать как БОЛЬШУЮ ТОЧКУ (не знаю, хорошо ли я это объясняю), это похоже на то, когда вы были ребенком и увеличивали точки, чтобы линия могла поместиться.
Какой-то способ уменьшая точность прямой линии до точки программы, рассматривая каждую группу из 4 точек так, как будто они полностью выровнены, что, конечно же, приведет к наличию только одной точки с «наибольшим количеством голосов» (RHO, THETA) в массиве аккумуляторов, что тогда я смогу извлеките его координаты и легко создайте шаблон.
Есть ли какой-нибудь способ улучшить это?
Может быть, мне стоит попробовать другой тип алгоритма в качестве распознавателя шаблонов для точек и прямых линии?
ПД: Извините, если я неправильно объясняюсь.
Подробнее здесь: https://stackoverflow.com/questions/669 ... orm-points