Алгоритм увеличения области

Всем привет. Я действительно изо всех сил пытаюсь понять логику этого и надеялся, что вы можете мне помочь. Прежде чем я продолжу, я просто хочу сообщить вам, что я программист-любитель и новичок в этом вопросе, без какого-либо формального образования в области компьютерных наук, поэтому, пожалуйста, терпите меня. : D Кроме того, я использую Python, но я мог бы использовать Java или что-то подобное.

В любом случае, я ищу реализацию Region Growing для использования в рудиментарном Drawbot. Я действительно пытался понять логику этого и надеялся, что ты мне поможешь. Прежде чем я продолжу, я просто хочу сообщить вам, что я программист-любитель и новичок в этом вопросе, без какого-либо формального образования в области компьютерных наук, поэтому, пожалуйста, терпите меня. : D Кроме того, я использую Python, но я мог бы использовать Java или что-то подобное.

В любом случае, я ищу реализацию Region Growing для использования в рудиментарном Drawbot. Я действительно пытался понять логику этого и надеялся, что ты мне поможешь. Прежде чем я продолжу, я просто хочу сообщить вам, что я программист-любитель и новичок в этом вопросе, без какого-либо формального образования в области компьютерных наук, поэтому, пожалуйста, терпите меня. : D Кроме того, я использую Python, но я мог бы использовать Java или что-то подобное.

Anywho, я ищу реализацию Region Growing для использования в рудиментарном Drawbot. Вот статья о выращивании в регионе: http://en.wikipedia.org/wiki/Region_growing

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

  • изображение будет размером не более 3x3 дюймов при произвольной глубине цвета

  • Изображение будет представлять собой сплошную черную фигуру на белом фоне.

  • Эта фигура может располагаться в любом месте фона.

Я рассмотрел следующие решения этой проблемы. Хотя некоторые из них работают в определенной степени, у каждого из них есть существенные недостатки либо в производительности, либо в осуществимости (по крайней мере, мне они не кажутся выполнимыми). Кроме того, поскольку это Drawbot, это нужно делать с помощью одной непрерывной линии. Однако это не означает, что я не могу вернуться назад, это только исключает возможность нескольких начальных точек (семян).

Рассматриваемые подходы:

Случайное блуждание:

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

псевдопитон ...

Cells To Visit = Number of Black Cells
Cells Visited = 0
MarkColor = red
While Cells Visited < Cells To Visit:
    if currentcell is black:
        Mark Current Cell As Visited #change pixel to red
        Cells Visited +=1
    neighbors = Get_Adjacent_Cells() #returns cells either black or red
    next cell = random.choose(neighbors)
    currentCell = next cell

Хотя я полагаю, что это возможно, мне кажется, что это очень неэффективно и не гарантирует хороших результатов, но в интересах того, чтобы действительно что-то сделать, я могу в конечном итоге попробовать это ... Моя логика в псевдокоде хоть немного верна?

Sweeping Pattern:

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

Этот метод при дальнейшей проверке имеет несколько серьезных недостатков. Столкнувшись с такой формой, как эта:

diagram1

Результат будет выглядеть следующим образом:

diagram2

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

4 / 8 Connected Neighborhood:

http://en.wikipedia.org/wiki/8-connected_neighborhood

Этот метод кажется мне наиболее мощным и эффективным, но на данный момент я не могу понять его полностью , и я не могу придумать, как бы реализовать это, не оставляя потенциально пропущенных областей

В каждой ячейке я бы смотрел на соседние черные ячейки, изобретал какой-то метод ранжирования, какую из них я должен посетить первым, посещать все из них и повторите процесс, пока все клетки не будут покрыты.

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


Это лучшие решения, которые я мог придумать. Спасибо, что нашли время, чтобы прочитать это, я понимаю, что это длинный, но я подумал, что должен сделать его как можно более ясным. Мы будем очень благодарны за любые предложения ... Спасибо!

Edit:

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

9
задан Acorn 2 May 2011 в 11:50
поделиться