Сопоставление в окнах
Функция mapwindow
Эта функция позволяет применять функцию f
к скользящим окнам img
с заданным размером окна или осями, определяемыми аргументом window
.
mapwindow(f, img, window; [border="replicate"], [indices=axes(img)]) -> imgf
Например, mapwindow(median!, img, window)
возвращает массив Array
значений, сходный с img
(естественно, отфильтрованный по медиане), а mapwindow(extrema, img, window)
возвращает массив Array
кортежей (min,max)
для окна размера window
с центром в каждой точке img
.
Функция f
принимает буфер buf
для окна данных, окружающего текущую точку. Если аргумент window
задан в виде кортежа измерений (целых чисел), все эти целые числа должны быть нечетными, а центром окна является текущая точка изображения. Например, при window=(3,3)
функция f
принимает массив buf
, соответствующий смещениям (-1:1, -1:1)
от точки imgf[i,j]
, для которой вычисляется функция. Значением window
может быть также кортеж значений типа AbstractUnitRange. В этом случае в качестве буфера buf
применяются указанные диапазоны, что позволяет при необходимости использовать асимметричные окна.
Аргумент border
определяет то, как следует поступать с краями изображения img
; подробные сведения см. в описании функции imfilter
.
Наконец, с помощью аргумента indices
можно избежать ненужных вычислений, например, если нужно применить функцию mapwindow
к части изображения или использовать функцию mapwindow с заданным шагом. Это работает так:
mapwindow(f, img, window, indices=(2:5, 1:2:7)) == mapwindow(f,img,window)[2:5, 1:2:7]
но эффективнее, так как ненужные значения не вычисляются.
Так как данные в буфере buf
, принимаемом функцией f
, копируются из img
и память буфера используется повторно, функция f
не должна возвращать ссылки на buf
.
Следующий код:
f = buf -> copy(buf) # а не f = buf -> buf
mapwindow(f, img, window, indices=(2:5, 1:2:7))
должен работать, как ожидается.
Для функций, принимающих только объекты типа AbstractVector
, может потребоваться сначала специализировать default_shape
:
f = v->quantile(v, 0.75)
ImageFiltering.MapWindow.default_shape(::typeof(f)) = vec
В результате функция mapwindow(f, img, (m,n))
должна выполнять фильтрацию по 75-му квантилю.
См. также описание функции imfilter
.
Функция mapwindow!()
Функция mapwindow!()
— это вариант функции mapwindow
с предварительным выделением памяти для результата.
mapwindow!(f, out, img, window; border="replicate", indices=axes(img))
Если области памяти для out
и img
пересекаются, поведение не определено.