Алгоритм преобразования Хафа для распознавания образов прямых линий из точекPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Алгоритм преобразования Хафа для распознавания образов прямых линий из точек

Сообщение Anonymous »

Привет всем! В настоящее время я работаю над различными алгоритмами, которые могли бы дать мне образцы прямых линий внутри групп выровненных ячеек.
Позвольте мне объяснить:
Предположим, у нас есть плоскость 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]
Координаты 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]
Очки будут [77.7,0.65],[107.1,0.65]... и т. д.
Поэтому моей первой мыслью было реализовать какое-то преобразование Хафа, которое вернуло бы мне аккумулятор со значениями ро и тета для точек с большим количеством "голосов".
Это код :

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Алгоритм преобразования Хафа для распознавания образов прямых линий из точек
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Круг Хафа opencv
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Повышение точности линии Хафа/сегментация корешков книг с помощью OpenCV и C++
    Anonymous » » в форуме C++
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Улучшение распознавания текста при наличии наложенных линий
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как избавиться от линий на рисунке? И как я могу уменьшить количество линий, необходимых для создания рисунка?
    Anonymous » » в форуме Python
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»