Подсказка:
Как сказано в других ответах, испускание списка пикселей контура может быть реализовано как процесс развертки, во время которого проверяются окрестности 3x3 конечных точек запуска.
Эта процедура будет испускать пиксели в зашифрованном виде, как последовательность прямых и обратных дуг, которые необходимо сохранить и переупорядочить.
Альтернатива может быть основана на идее реализации стандартного алгоритма окрестности Мура, преимущество которого заключается в перечислении контурных пикселей в желаемом порядке.
Для этой процедуры требуется знать конфигурацию 8-окрестностей вокруг текущего пикселя, и идея состоит в том, чтобы обновлять эту окрестность при каждом переходе к другому пикселю: мы сохраняем индексы для серии, содержащей текущий пиксель, и для двух противоположных серий в строках. над и под.
При каждом переходе к другому пикселю нам нужно обновлять эти три индекса, что будет включать короткие последовательные поиски в списке отсортированных прогонов. Это можно рассматривать как механизм псевдослучайного доступа к пикселям, принимая во внимание, что последовательные доступы строго локальны и могут быть как бы кэшированы.
Обновление:
В представлении с кодированием длины серии, которое я использую, кодируются только черные серии, как тройки (X, Y, L)
. Прогоны сортируются по строкам сверху вниз, а затем слева направо подряд.
Для удобства можно перейти на схему «линейной адресации», как если бы все строки изображения были добавлены друг за другом, а каждый пиксель обозначен одним числом Z = X + Y.Nx
(где Nx
— ширина изображения).
Итак, у нас есть список черных серий, а белые неявно находятся между двумя последовательными черными.
Во время обработки мы всегда можем помнить индекс прогона, который начинается непосредственно перед текущим пикселем или на нем (R[I].Z <= Z < R[I+1].Z
). Мы можем определить цвет пикселя, проверив, находимся ли мы внутри ряда или между ним и следующим (Z < R[I].Z + R[I].L
).
Если мы переместимся на одну позицию влево, Z
уменьшится на 1
, и нам, возможно, придется выбрать предыдущий прогон (I--
).
Если мы переместимся на одну позицию вверх, Z
уменьшится на Nx
, и нам, возможно, придется вернуться на несколько прогонов (с I--
до R[I].Z <= Z
снова).
На картинке показан текущий пиксель и его 4-соседки, а также «зоны влияния» черных трасс. Мы можем обрабатывать все восемь направлений смещения одинаково.
Как мы видим, каждый ход занимает количество операций, в худшем случае равное количеству прогонов подряд, которое считается малой величиной. Используя эту концепцию, мы можем перемещаться по RLC-представлению по произвольному пути с разумными затратами, не реконструируя всю растровую карту.
Поскольку алгоритм окрестности Мура требует времени, линейного по длине контура, реализация, основанная на этой линейной адресации прогонов, также потребует линейного времени (для ограниченного числа прогонов в строке).
person
Yves Daoust
schedule
02.09.2015