выберите больший шар - PullRequest
       6

выберите больший шар

0 голосов
/ 27 марта 2012

У меня есть массив данных, заполненный "#" и "." например, он отображает что-то вроде этого:

...........#############..............................
.........################..................#######....
........##################................#########...
.......####################..............###########..
........##################................#########...
.........################..................#######....
...........#############..............................

Я хочу создать алгоритм, который находит больший шар и стирает меньший. Я думал об использовании самой длинной последовательности "#", чтобы узнать, что такое диаметр.

Итак, у меня есть что-то вроде этого:

x = 0
longest_line = 0
for i in range(0, nbLine) :
   for j in range(0, nbRaw) :
       if data[i, j] = red :
          x = x+1
          if data[i, j+1] != red: 

И я не знаю, что делать дальше ..

Ответы [ 4 ]

3 голосов
/ 27 марта 2012

Я бы использовал какой-то алгоритм сегментации , а затем просто посчитал бы количество пикселей в каждом объекте.Затем просто сотрите меньший, что должно быть легко, поскольку у вас есть тег объекта.

Алгоритмы сегментации обычно работают следующим образом.

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

Итак, для очень простого примера:

...##...
.######.
...##...

Ваша обработка будет выглядеть так:

00011000
02111110
00011000

При таком преобразовании, что:2 => 1

Примените таблицу поиска, и все объекты будут помечены значением 1.Затем просто посчитайте количество пикселей, и все готово.

Я оставлю вам реализацию; -)

2 голосов
/ 27 марта 2012

У вас всегда есть только две фигуры, подобные этой? Потому что в этом случае вы также можете использовать библиотеку регулярных выражений python. Этот код, похоже, подходит для вашего примера (я скопировал ваш маленький рисунок в файл и назвал его «balls.txt»):

import re

f = open("balls.txt", "r")

for line in f :

   balls = re.search("(\.+)(#+)(\.+)(#*)(\.+)", line) 

   dots1 = balls.groups()[0]
   ball1 = balls.groups()[1]
   dots2 = balls.groups()[2]
   ball2 = balls.groups()[3]
   dots3 = balls.groups()[4]

   if len(ball1) < len(ball2): 
       ball1 = ball1.replace('#', '.')
   else:
       ball2 = ball2.replace('#', '.')

   print "%s%s%s%s%s" % (dots1, ball1, dots2, ball2, dots3)

И вот что я получаю:

...........#############..............................
.........################.............................
........##################............................
.......####################...........................
........##################............................
.........################.............................
...........#############..............................

Я надеюсь, что это может дать вам некоторые идеи для решения вашей проблемы

2 голосов
/ 27 марта 2012
  1. Получите ваши данные в более привлекательную структуру массива
  2. Выполнить маркировку подключенного компонента
  3. Подсчитать количество элементов с каждой меткой (игнорируя метку фона)
  4. Выберите метку с наибольшим количеством элементов
0 голосов
/ 28 марта 2012

При условии, что шары не соприкасаются:

Предполагая ровно два шара

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

сканировать каждую строку сверху вниз, слева направо в каждой строке.

Когда вы видите первый #, присвойте его шару 0 (добавьте его, x, y шнуры к набору, принадлежащему объекту шара 0).

Когда вы видите любой последующий #, добавьте его к шару 0, если он находится рядом с любой точкой, уже находящейся в шаре 0; в противном случае добавьте его в шар 1. (Если новый # находится в точке x, y, который мы только что проверили (x + 1, y) в наборе, (x-1, y) в наборе, (x, y + 1) в множестве (x, y-1) в множестве и диагональные соседи)

Когда сканирование завершено, размеры списка показывают больший шарик. Затем у вас есть список точек, которые нужно стереть в наборе очков другого шара.

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