Библиотека OpenCV использует для своей приближенной функции cv :: distanceTransform алгоритм, который передает изображение сверху вниз, справа налево и обратно. Алгоритм описан в статье «Преобразования расстояний в цифровых изображениях» от Gunilla Borgefors (Comput. Vision Graph. Image Process. 34 3, pp. 344–371, 1986) .
Алгоритм вычисляет расстояние через комбинацию некоторых основных прыжков (горизонтальный, вертикальный, диагональный и ход коня). Каждый прыжок несет расходы. В следующей таблице приведены затраты на различные прыжки.
+------+------+------+------+------+
| 2.8 |2.1969| 2 |2.1969| 2.8 |
+------+------+------+------+------+
|2.1969| 1.4 | 1 | 1.4 |2.1969|
+------+------+------+------+------+
| 2 | 1 | 0 | 1 | 2 |
+------+------+------+------+------+
|2.1969| 1.4 | 1 | 1.4 |2.1969|
+------+------+------+------+------+
| 2.8 |2.1969| 2 |2.1969| 2.8 |
+------+------+------+------+------+
Расстояние от одного пикселя до другого представляет собой сумму затрат на необходимые скачки. На следующем рисунке показано расстояние от 0-ячеек до каждой другой ячейки. Стрелки показывают путь к некоторым ячейкам. Цветные цифры отражают точное (евклидово) расстояние.
Алгоритм работает следующим образом: следующая маска
+------+------+------+
| 0 | 1 | 2 |
+------+------+------+
| 1 | 1.4 |2.1969|
+------+------+------+
| 2 |2.1969| 2.8 |
+------+------+------+
перемещается из левого верхнего края изображения в правый нижний угол. Во время этого прохода ячейки, лежащие внутри границ маски, либо сохраняют свое значение (если оно известно и меньше), либо получают значение, вычисленное путем суммирования значения маски и значения ячейки (если оно известно) из ячейки. ниже маски-0-клеток.
После этого выполняется второй проход снизу справа вверху слева (с перевернутой вертикальной и горизонтальной маской). После второго прохода рассчитываются расстояния.