Документация Engee

Сопоставление в окнах

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