Структура данных для распознавания образов на основе пикселов

У меня есть приложение, которое создает случайные изображения на основе ограничений. Различные цветные пиксели выбираются случайным образом и помещаются в сетку, которая удовлетворяет всем ограничениям. Например (упрощение), может существовать ограничение, указывающее, что синий или зеленый пиксель находится на (0, -1), а красные пиксели находятся на (-1, -1) и (-1, 0), а затем помещают белый пиксель запрещен. Эти координаты являются векторами из текущего местоположения размещения (т.е. Его окрестности).

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

Я думаю, что структура данных типа графа (tree?) может быть способом хранения всех ограничений, чтобы я мог быстро определить из окрестности пикселя, какие (если есть) ограничения применяются. Но я не могу понять, как создать такую ​​структуру, учитывая, что одна координата может содержать несколько цветов и как привязать набор координат/цветов к набору запрещенных цветов пикселей. Любые идеи?

Ответ 1

Вы можете использовать сокращение графа для решения этой проблемы. Он даже позаботится о упомянутых конфликтах. В основном это работает: он пытается назначить метки на основе функции стоимости, которую вы хотите свести к минимуму. Для вашего случая функция стоимости может быть примерно такой:

E(x)=infinite ; if constraint is violated
and  0        ; otherwise

Сокращение графика назначает метки, которые минимизируют эту функцию стоимости. Кроме того, он очень быстр и эффективен и сходится к минимумам. Посмотрите на следующие две ссылки:

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

Ответ 2

Havent работал с сопоставлением с образцом, но на ум приходит следующее:

Возьмем обычный граф ds, где вершины будут вашими векторами, а ребрам будут запрещены цвета, соединяющие их. Здесь вы можете соединить все вершины между собой, более оптимальным будет принятие какого-то направления, которое вы будете использовать, заполнить ваши ds, вы должны использовать ту же начальную точку и направление, когда будете проходить через пиксельные массивы. Из вашего примера, если вы начинаете с (0, -1), идущего по часовой стрелке, это будет что-то вроде: (0, -1) --blue-- (-1, -1), (0, -1) --green- - (-1, -1), (-1, -1) --red - (-1, 0), (-1, 0) --red - (- 1, 1), (-1, 1) - белый - (0, 1), (-1, 1) - белый (1, 1), (-1, 1) - белый (1, 0)

Теперь используйте DFS для поиска цвета для проверки (это будет край)

Ответ 3

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

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

Однако имейте в виду, что если ограничения неравномерно распределены в вашей сцене, результирующее дерево может быть плохо сбалансировано. В этом случае вы должны найти лучшее представление для ограничений, или фактическая сложность алгоритма будет ближе к наихудшему значению O (n), а не среднему (и лучшему) значению O (log n).

Ответ 4

Для этой проблемы вы можете использовать разные типы деревьев.

Это, кажется, широко исследуемая тема, и, вероятно, ответ будет длиннее обычного ответа SO. См. Следующие ссылки:

https://books.google.co.uk/books?id=ixDjBQAAQBAJ&pg=PA119&lpg=PA119&dq=best+data+structure+for+pattern+recognition&source=bl&ots=BLEx5TOrW9&sig=d_1HjGTeQ7SptvHJ0iZ_yXUG5Vo&hl=sl&sa=X&ei=dgI6VYDTKZPVapmTgdgD&ved=0CFcQ6AEwCA#v=onepage&q=best%20data%20structure%20for%20pattern%20recognition&f=false

http://www.computer.org/csdl/trans/ts/1977/02/01702419.pdf

http://www.ablesw.com/3d-doctor/3dseg.html