Сопоставление в окнах
Функция 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 пересекаются, поведение не определено.