Как создать сегменты линии по точкам сетки

Я пытаюсь сгенерировать сегменты линии сетки по точкам сетки, у меня 34 точки вроде этого:

введите описание изображения здесь

Размер изображения 720 * 480 с 34 точками сетки, координаты здесь:

323.708 205.925
382.585 206.75
320.296 216.596
381.729 217.499
271.118 227.4
286.04 227.643
301.208 227.631
316.538 228.165
332.195 228.323
348.114 228.828
364.194 229.139
380.893 229.356
397.731 230.219
414.795 230.634
432.307 231.407
312.507 241.026
379.886 242.892
307.735 254.944
378.838 257.705
251.514 268.437
268.271 269.035
285.124 269.701
302.801 270.563
320.684 271.637
339.107 272.332
358.067 273.122
377.46 274.347
397.01 275.033
416.814 276.199
437.558 277.354
297.437 288.028
375.766 292.266
291.296 307.268
374.233 313.316

Я пробовал преобразование Хафа для обнаружения линий сетки. Но мне просто нужна картинка, чтобы промежутки между точками были заполнены (вот так):

введите описание изображения здесь

введите описание изображения здесь

так что я мог сделать следующую работу. Использование преобразования Хафа немного потрачено впустую.

Я пробовал использовать линейную интерполяцию, чтобы заполнить пробел ,, но мне нужно найти конечные точки вручную. Поэтому , Я хочу знать, как автоматически генерировать сегменты линии сетки только по этим точкам сетки.


person ytan    schedule 16.11.2016    source источник


Ответы (2)


для каждой точки найдите ближайшую точку в N,S,E,W направлениях и добавьте строку в список, если она еще не присутствует в списке. Если n - количество баллов, я вижу это так:

  1. петля i = <0,n-2>
  2. петля j = <i+1,n-1>
  3. для каждого направления оси

    добавьте любую линию, размер которой |pnt[i1]-pnt[i1]| меньше или равен размеру сетки, и в то же время направление линии похоже на фактическое направление NS или WE, поэтому:

    abs(dot(direction/|direction|,(pnt[i1]-pnt[i1])/|pnt[i1]-pnt[i1]|))
    

    близко к 1 или, по крайней мере, больше, чем 0.75, если векторы направления не точны. В качестве указаний вы можете начать с:

    NS = ( 0.0, 1.0 )
    WE = ( 1.0. 0.0 )
    

    Направление NS более отклонено, поэтому вам, вероятно, следует использовать больший запас для сравнения для них.

    Вы можете избавиться от нормализации внутри скалярного произведения для единичных векторов

person Spektre    schedule 16.11.2016

Вы уже знаете важные моменты, поэтому преобразование Хафа довольно накладно.

Если есть только 34 (или даже сотни) точек, они образуют около 1000 пар, и вы можете построить линию для каждой пары, а затем сгруппировать эти линии в rho-theta-пространстве без каких-либо сложных алгоритмов (этот подход является квадратичным). У вас будет 4 больших кластера, и нетрудно найти, какие отрезки (точки) линии из этих кластеров являются конечными.

Для больших наборов данных вы можете случайным образом сформировать начальные кластеры для небольшого подмножества случайных точек, а затем добавить каждую точку к наиболее подходящей линии (линейный подход)

person MBo    schedule 16.11.2016