Измерение прямоугольников под нечетными углами с помощью входной матрицы низкого разрешения (классификация линейной регрессии?) - PullRequest
0 голосов
/ 30 июля 2010

Я пытаюсь решить следующую проблему:

При условии ввода, скажем,

0000000000000000
0011111111110000
0011111111110000
0011111111110000
0000000000000000
0000000111111110
0000000111111110
0000000000000000

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

В этом примере я могу «дождаться начала прямоугольника» (то есть наблюдать за изменением нулей на 1), а затем наблюдать за его окончанием (возвращающимися в нули) и измерять часть в «единицах сетки». Это будет хорошо работать для простого случая, описанного выше, но потерпит неудачу, если прямоугольник наклонен под углом, например:

0000000000000000
0000011000000000
0000111100000000
0001111111000000
0000111111100000
0000011111110000
0000000111100000
0000000011000000

Первоначально я думал, что применим следующий вопрос:

Динамическое программирование - Самый большой квадратный блок

но теперь я не так уверен.

У меня практически нет опыта регрессионного или регрессионного тестирования, но я думаю, что я мог бы представить это как ввод 8 переменных .....

Ну, если честно, я не уверен, как бы я это сделал вообще. Размеры, которые извлекает эта часть кода, должны соответствовать прямоугольникам известных размеров (т. Е. Из базы данных).

Сначала я думал, что смогу использовать известные данные в качестве тренировочных упражнений и сохранить положительные результаты теста, но я действительно не уверен, куда идти.

Спасибо за любой совет.

Ответы [ 3 ]

2 голосов
/ 30 июля 2010

Соберите точки перехода (от 1 до 0 или наоборот) во время сканирования, затем определите длину и ширину либо непосредственно оттуда, либо из выпуклой оболочки каждого объекта.

Если прямоугольники могут перекрываться, у вас будут большие проблемы.

1 голос
/ 30 июля 2010

Я бы предпринял следующие шаги:

  1. собрать все столбцы в матрицу (это необходимо для правильной фильтрации)
  2. теперь примените фильтр (для этого нужно немного погуглить), чтобы повысить резкость по краям и углам
  3. создать структуру для хранения данных для следующих шагов (это может иметь много разных решений, выбрать понравившееся и / или оптимальное)
  4. сканирование по вертикали (столбец за столбцом), и для каждого сегмента последовательных «единиц», найденных в столбце (сегмент означает, что вы нашли его начало, конец, конец y координаты), выполните:
    1. убедитесь, что этот сегмент перекрывает некоторый сегмент в предыдущем столбце
    2. Если это не так, считайте это новым прямоугольником. Создайте прямоугольный объект и присвойте его дескриптор сегменту. для нового прямоугольника update it's metrics (эта операция принимает только координаты сегмента - x, ymin, ymax и будет обсуждаться позже)
    3. если это так, предположим, что это тот же прямоугольник, возьмите дескриптор прямоугольника, назначьте этот дескриптор текущему сегменту, затем получите прямоугольник по его дескриптору и update it's metrics

Это мило. После этого у вас будет пул прямоугольных объектов, каждый из которых имеет четыре координаты своих углов. Сделайте примитивную математику, чтобы приблизить ширину и высоту прямоугольника.
Так где же магия ? Ну, все это происходит в рутине update rect metrics.

Для каждого прямоугольника у нас есть 13 метрик:

  • min X => ymin1, ymax1
  • max X => ymin2, ymax2
  • мин Y => xmin1, xmax1
  • max Y => xmin2, xmax2
  • средняя длина вертикального сегмента

Прежде всего мы должны определить, правильно ли выровнен этот прямоугольник в нашей сетке сканирования. Для этого мы сравниваем значения average vertical segment length и max Y - min Y. Если они одинаковы (я бы выбрал порог около 97%, а затем настроил бы его для достижения наилучших результатов), тогда мы принимаем следующие координаты для нашего прямоугольника:

  1. (мин. X, макс. Y)
  2. (мин. X, мин. Y)
  3. (макс. X, макс. Y)
  4. (макс. X, мин. Y).

В другом случае прямоугольник поворачивается наружу, и в этом случае мы берем его координаты следующим образом:

  1. (мин. X, (ymin1 + ymax1) / 2)
  2. ((xmin1 + xmax1) / 2, мин Y)
  3. (max X, (ymin2 + ymax2) / 2)
  4. ((xmin2 + xmax2) / 2, макс. Y)
0 голосов
/ 30 июля 2010

Я задал этот вопрос другу, и он предложил:

  1. При первом взгляде на 1 сохраните его как новую форму.Flood заполните его вправо и добавьте эти точки к одной и той же форме.
  2. Любой входной пиксель, который не находится в форме, теперь является новой формой.Выполните ту же заливку.
  3. В следующем входном столбце снова выполните заливку из исходных точек формы.Добавить новые пиксели к соответствующей форме
  4. Если заливка заливкой не добавляет новые пиксели для двух последовательных столбцов, у вас есть законченная форма.Двигайтесь дальше и попытайтесь определить его размеры

Затем мы получим размеры для формы, которую мы изолировали (как в примере 2).

Для этого мы придумали:

  1. Если число крайних левых пикселей в форме меньше среднего числа пикселей в столбце, то, вероятно, угол поворота.Таким образом, найдите углы, получив самые дальние пиксели.Используйте формулу расстояния между всеми ними.Самый большой = гипотенуза, другие = ширина или высота.
  2. В противном случае этот кусочек, вероятно, идеально выровнен, так что углы, вероятно, всего лишь самый верхний пиксель, самый нижний правый пиксель и т. Д.

Что вы все думаете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...