floodFilKx + 1. у. intColor); // fill right // закрашиваем правый

floodFilKx, у + 1. intColor): // fill down // закрашиваем нижний

floodFilKx. у - 1. intColor) // fill up

// закрашиваем верхний }

}

Процесс начинается заново для адреса каждого пиксела, который появляется при вызове функции f loodFi ПО. Алгоритм работает вслепую, проверяя ближайших соседей вне зависимости от того, тестировались ли они ранее. Поэтому здесь не учитывается связность области (region coherence) - вероятность того, что пиксел, смежный с внутренним пикселом, также является внутренним пикселом. По этой причине многие пикселы проверяются многократно, что требует огромного количества вызовов процедуры.

Пример 10.5.1

Рассмотрим внутренне-определенную область, состоящую всего из пяти пикселов, которая показана на рис. 10.23. Пусть начальный пиксел, обозначенный буквой S, расположен в точке (4,2). После вызова подпрограммы floodfilK4, 2. white) последовательность адресов пикселов, для которых происходят дальнейшие вызовы, имеет вид:

(3,2), (2,2), (1,2), (3,2), (2, 3), (2,1), (4, 2), (3,3), (2, 3), (4,3) ....

Всего процедура вызывается 21 раз, с учетом повторных проверок одного и того же пиксела, например (2,3).

Рис. 10.23. Пример внутренне-определенной области для заполнения Поскольку алгоритм заливки является в большой степени рекурсивным, стек рекурсии может стать очень глубоким, даже для простой области. Поэтому существует вероятность переполнения стека и последующего сбоя алгоритма даже для областей умеренного размера. Кроме того, для управления этой рекурсией требуются дополнительные затраты ресурсов, которые могут значительно замедлить процесс заливки. Существуют более эффективные (но и более сложные) методы, использующие связность области; они будут рассмотрены позднее.

Для того чтобы расширить данный алгоритм до 8-связной версии, нужно просто добавить четыре инструкции проверки четырех соседей по диагоналям, таких как ЯооаПП (х+1. у-1. 1п1Со1ог). Этот рекурсивный метод также может быть адаптирован для гранично-определенных областей (см. упражнения).


⇐ Предыдущая| |Следующая ⇒