Функции фильтрации
Функции
#
ImageFiltering.imfilter
— Function
imfilter([T], img, kernel, [border="replicate"], [alg]) --> imgfilt
imfilter([r], img, kernel, [border="replicate"], [alg]) --> imgfilt
imfilter(r, T, img, kernel, [border="replicate"], [alg]) --> imgfilt
Фильтрует одно-, двух- или многомерный массив img
с ядром kernel
, вычисляя их корреляцию.
Расширенная справка
Варианты для r
При необходимости можно производить диспетчеризацию в различные реализации, передавая ресурс r
согласно определению в пакете ComputationalResources.
Пример:
imfilter(ArrayFireLibs(), img, kernel)
Этот вызов запрашивает выполнение вычислений на GPU с использованием библиотек ArrayFire.
Варианты для T
При необходимости можно контролировать тип элементов выходного изображения, передавая тип T
первым аргументом.
Варианты для img
Изображение можно передать в виде одно-, двух- или многомерного массива.
Варианты для kernel
Параметр kernel[0, 0,..]
соответствует началу (нулевому смещению) ядра. С помощью centered
можно установить начало в центре массива. Можно также воспользоваться пакетом OffsetArrays для задания индексов kernel
вручную. Например, отфильтровать случайное отцентрированное ядро размером 3x3 можно одним из следующих способов.
kernel = centered(rand(3,3))
kernel = OffsetArray(rand(3,3), -1:1, -1:1)
Параметр kernel
можно задать в виде массива или «разложенного ядра», то есть кортежа (filt1, filt2, ...)
фильтров, которые будут применены по каждой оси изображения. Если известно, что ядро является разделяющимся, такой формат может ускорить обработку. Каждый фильтр должен быть той же размерности, что и само изображение, и иметь форму, указывающую на ось фильтрации, например фильтр 3x1 для фильтрации первого измерения или фильтр 1x3 для фильтрации второго измерения. В случае с двумя измерениями любое ядро, передаваемое в виде одиночной матрицы, проверяется на разделяемость; чтобы эта проверка не проводилась, передайте ядро в виде одноэлементного кортежа: (kernel,)
.
Варианты для border
С помощью аргумента border
указывается способ дополнения для экстраполяции изображения за пределами его исходных границ.
"replicate"
(по умолчанию)
Пиксели границы продолжаются за границами изображения.
╭────┏━━━━━━┓────╮
│aaaa┃abcdef┃ffff│
╰────┗━━━━━━┛────╯
"circular"
Пиксели границы переносятся в противоположную сторону. Например, при обращении по индексам за пределами левой границы возвращаются значения начиная с правой границы.
╭────┏━━━━━━┓────╮
│cdef┃abcdef┃abcd│
╰────┗━━━━━━┛────╯
"reflect"
Пиксели границы отражаются относительно позиции между пикселями. Пиксель границы при этом опускается.
╭────┏━━━━━━┓────╮
│dcba┃abcdef┃fedc│
╰────┗━━━━━━┛────╯
"symmetric"
Пиксели границы отражаются относительно края изображения.
╭────┏━━━━━━┓────╮
│edcb┃abcdef┃edcb│
╰────┗━━━━━━┛────╯
Fill(m)
Пиксели границы заполняются указанным значением .
╭────┏━━━━━━┓────╮
│mmmm┃abcdef┃mmmm│
╰────┗━━━━━━┛────╯
Inner()
Указывает, что края при фильтрации должны отбрасываться: возвращается только внутренняя часть результата.
NA()
Выбор фильтрации с использованием граничных условий NA (недоступно). Лучше всего подходит для фильтров только с положительными весами, например фильтров размытия.
Варианты для alg
Параметр alg
позволяет выбрать алгоритм: Algorithm.FIR()
(конечная импульсная характеристика, то есть традиционная цифровая фильтрация) или Algorithm.FFT()
(фильтрация методом Фурье). Если алгоритм не указан, он выбирается с учетом размера изображения и ядра так, чтобы обеспечивалась высокая производительность. Помимо этого, можно использовать фильтр пользовательского типа, например KernelFactors.IIRGaussian
.
#
ImageFiltering.imfilter!
— Function
imfilter!(imgfilt, img, kernel, [border="replicate"], [alg])
imfilter!(r, imgfilt, img, kernel, border::Pad)
imfilter!(r, imgfilt, img, kernel, border::NoPad, [inds=axes(imgfilt)])
Фильтрует массив img
с ядром kernel
, вычисляя их корреляцию, и сохраняет результат в imgfilt
.
Индексы imgfilt
определяют область, в которой вычисляется отфильтрованное изображение. Это позволяет выбрать определенную область интереса, однако имейте в виду, что входной массив img
все равно может дополняться. Можно также явным образом задать индексы inds
объекта imgfilt
, которые нужно вычислить, и использовать граничные условия NoPad
. В этом случае вы отвечаете за правильную настройку дополнения: массив img
должен быть индексируемым во всех позициях, которые требуются для вычисления результата. Этот синтаксис лучше всего поддерживается при использовании КИХ-фильтрации, в частности по той причине, что БИХ-фильтрация может давать несогласованные результаты при применении ко всему массиву.
См. также описание функции imfilter
.
#
ImageFiltering.imgradients
— Function
imgradients(img, kernelfun=KernelFactors.ando3, border="replicate") -> gimg1, gimg2, …
Оценивает градиент изображения img
в направлении первого и второго измерений во всех точках изображения с использованием ядра, указанного в kernelfun
.
Возвращает кортеж массивов (gimg1, gimg2, ...)
, по одному массиву для каждого измерения во входном массиве: gimg1
соответствует производной относительно первого измерения, gimg2
— второго и т. д.
Пример
using Images, ImageFiltering, TestImages
img = testimage("mandrill")
imgr = imgradients(img, KernelFactors.sobel, "reflect")
mosaicview(imgr...)
#
ImageFiltering.MapWindow.mapwindow
— Function
mapwindow(f::F, img, window;
border = "replicate",
indices = default_imginds(img, window, border), callmode=:copy!)
Применяет f
к скользящим окнам img
с заданным размером окна или осями, определяемыми окном. Например, mapwindow(median!, img, window)
возвращает массив значений, сходный с img
(естественно, отфильтрованный по медиане), а mapwindow(extrema, img, window)
возвращает массив кортежей (минимум, максимум) для окна размера window с центром в каждой точке img
.
Функция f
принимает буфер buf
для окна данных, окружающего текущую точку.
Если аргумент window
задан в виде кортежа измерений (целых чисел), все эти целые числа должны быть нечетными, а центром окна является текущая точка изображения.
Например, при window = (3,3)
функция f
принимает массив buf
, соответствующий смещениям (-1:1, -1:1) от точки imgf[i, j]
, для которой вычисляется функция. Окном может быть также кортеж значений типа AbstractUnitRange
. В этом случае в качестве буфера buf
применяются указанные диапазоны, что позволяет при необходимости использовать асимметричные окна.
Ограничение вычислений частью изображения
С помощью именованного аргумента 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
.
Ядро
#
ImageFiltering.Kernel
— Module
Kernel
— это модуль, реализующий ядра фильтрации (корреляции) полной размерности. Поддерживаются следующие ядра:
-
sobel
-
prewitt
-
ando3
,ando4
иando5
-
scharr
-
bickley
-
gaussian
-
DoG
(разность гауссианов) -
LoG
(лапласиан гауссиана) -
Laplacian
-
gabor
-
moffat
См. также описание модуля KernelFactors
.
#
ImageFiltering.Kernel.ando3
— Function
diff1, diff2 = ando3()
Возвращает ядра корреляции для вычисления двухмерного градиента с помощью «оптимальных» фильтров Андо. Ядро diff1
вычисляет градиент по оси y (первое измерение), а ядро diff2
— градиент по оси x (второе измерение). diff1 == rotr90(diff2)
(diff,) = ando3(extended::NTuple{N,Bool}, d)
Возвращает N-мерное ядро корреляции (кортеж) для вычисления градиента по измерению d
с помощью «оптимальных» фильтров Андо размера 3. Если extended[dim]
имеет значение false, diff
имеет размер 1 по соответствующему измерению.
Цитирование
S.Ando, Consistent gradient operators, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 22, no.3, pp. 252—265, 2000. doi:10.1109/34.841757
См. также описание функций KernelFactors.ando3
, Kernel.ando4
, Kernel.ando5
и ImageFiltering.imgradients
.
#
ImageFiltering.Kernel.ando4
— Function
diff1, diff2 = ando4()
Возвращает ядра корреляции для вычисления двухмерного градиента с помощью «оптимальных» фильтров Андо. Ядро diff1
вычисляет градиент по оси y (первое измерение), а ядро diff2
— градиент по оси x (второе измерение). diff1 == rotr90(diff2)
(diff,) = ando4(extended::NTuple{N,Bool}, d)
Возвращает N-мерное ядро корреляции (кортеж) для вычисления градиента по измерению d
с помощью «оптимальных» фильтров Андо размера 4. Если extended[dim]
имеет значение false, diff
имеет размер 1 по соответствующему измерению.
Цитирование
S.Ando, Consistent gradient operators, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 22, no.3, pp. 252—265, 2000. doi:10.1109/34.841757
См. также описание функций KernelFactors.ando4
, Kernel.ando3
, Kernel.ando5
и ImageFiltering.imgradients
.
#
ImageFiltering.Kernel.ando5
— Function
diff1, diff2 = ando5()
Возвращает ядра корреляции для вычисления двухмерного градиента с помощью «оптимальных» фильтров Андо. Ядро diff1
вычисляет градиент по оси y (первое измерение), а ядро diff2
— градиент по оси x (второе измерение). diff1 == rotr90(diff2)
(diff,) = ando5(extended::NTuple{N,Bool}, d)
Возвращает N-мерное ядро корреляции (кортеж) для вычисления градиента по измерению d
с помощью «оптимальных» фильтров Андо размера 5. Если extended[dim]
имеет значение false, diff
имеет размер 1 по соответствующему измерению.
Цитирование
S.Ando, Consistent gradient operators, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 22, no.3, pp. 252—265, 2000. doi:10.1109/34.841757
См. также описание функций KernelFactors.ando5
, Kernel.ando3
, Kernel.ando4
и ImageFiltering.imgradients
.
#
ImageFiltering.Kernel.bickley
— Function
diff1, diff2 = bickley()
Возвращает ядра корреляции для вычисления двухмерного градиента с помощью оператора Бикли. Ядро diff1
вычисляет градиент по оси y (первое измерение), а ядро diff2
— градиент по оси x (второе измерение). diff1 == rotr90(diff2)
(diff,) = bickley(extended::NTuple{N,Bool}, d)
Возвращает N-мерное ядро корреляции (кортеж) для вычисления градиента по измерению d
с помощью оператора Бикли. Если extended[dim]
имеет значение false, diff
имеет размер 1 по соответствующему измерению.
Цитирование
W.G. Bickley, Finite difference formulae for the square lattice, The Quarterly Journal of Mechanics and Applied Mathematics, vol. 1, no. 1, pp. 35—42, 1948. doi:10.1093/qjmam/1.1.35
См. также описание функций KernelFactors.bickley
, Kernel.prewitt
, Kernel.ando3
, Kernel.scharr
и ImageFiltering.imgradients
.
#
ImageFiltering.Kernel.DoG
— Function
DoG((σp1, σp2, ...), (σm1, σm2, ...), [l1, l2, ...]) -> k
DoG((σ1, σ2, ...)) -> k
DoG(σ::Real) -> k
Создает многомерное ядро на основе разницы гауссианов k
, равное gaussian(σp, l)-gaussian(σm, l)
. Если предоставлено только одно значение σ
, по умолчанию выбирается σp = σ, σm = √2 σ
. Можно также указать длину ядра l
; по умолчанию ядро простирается на два max(σp,σm)
в каждом направлении от центра. Значение l
должно быть нечетным.
Если значение σ
задано в виде одного числа, возвращается симметричное двухмерное ядро на основе разницы гауссианов.
См. также описание функции KernelFactors.IIRGaussian
.
#
ImageFiltering.Kernel.gabor
— Function
gabor(size_x,size_y,σ,θ,λ,γ,ψ) -> (k_real,k_complex)
Возвращает двухмерное комплексное ядро Габора, содержащееся в кортеже:
-
size_x
,size_y
означают размер ядра; -
σ
означает среднеквадратичное отклонение от огибающей Гаусса; -
θ
представляет ориентацию нормали относительно параллельных полос функции Габора; -
λ
представляет длину волны периодической составляющей; -
γ
— пространственное характеристическое отношение, определяющее эллиптичность носителя функции Габора; -
ψ
— сдвиг фаз.
#Citation N. Petkov and P. Kruizinga, Computational models of visual neurons specialised in the detection of periodic and aperiodic oriented visual stimuli: bar and grating cells, Biological Cybernetics, vol. 76, no. 2, pp. 83—96, Feb. 1997. doi.org/10.1007/s004220050323
#
ImageFiltering.Kernel.gaussian
— Function
gaussian((σ1, σ2, ...), [(l1, l2, ...)]) -> g
gaussian(σ) -> g
Создает многомерный фильтр Гаусса со среднеквадратичным отклонением σd
по измерению d
. Можно также указать длину ядра l
в виде кортежа той же длины.
Если значение σ
задано в виде одного числа, возвращается симметричное двухмерное ядро.
См. также описание функции KernelFactors.gaussian
.
#
ImageFiltering.Kernel.Laplacian
— Type
Laplacian((true,true,false,...))
Laplacian(dims, N)
Laplacian()
Ядро на основе лапласиана в N
измерениях, принимающее производные в направлениях, помеченных как true
в переданном кортеже. В аргументе dims
можно также передать список измерений для дифференцирования. (Однако такой вариант не является выводимым.)
Laplacian()
— это двухмерный лапласиан, эквивалентный Laplaciantrue,true
.
Ядро представлено как непрозрачный тип, но с помощью функции convert(AbstractArray, L)
его можно преобразовать в формат массива.
#
ImageFiltering.Kernel.LoG
— Function
LoG((σ1, σ2, ...)) -> k
LoG(σ) -> k
Создает ядро на основе лапласиана гауссиана k
. σd
— это ширина гауссиана по измерению d
. Если значение σ
задано в виде одного числа, возвращается симметричное двухмерное ядро.
См. также описание функции KernelFactors.IIRGaussian
и типа Kernel.Laplacian
.
#
ImageFiltering.Kernel.moffat
— Function
moffat(α, β, ls) -> k
Создает двухмерное симметричное ядро Моффата k
с шириной сердцевины α
и степенью β
. Ядро имеет размер, равный 4 * максимальный размер половины полной ширины или указанный в ls
. Подробные сведения см. в этой записной книжке.
Цитирование
Moffat, A. F. J. A theoretical investigation of focal stellar images in the photographic emulsion and application to photographic photometry. Astronomy and Astrophysics 3 (1969): 455.
#
ImageFiltering.Kernel.prewitt
— Function
diff1, diff2 = prewitt()
Возвращает ядра корреляции для вычисления двухмерного градиента с помощью оператора Прюитта. Ядро diff1
вычисляет градиент по оси y (первое измерение), а ядро diff2
— градиент по оси x (второе измерение). diff1 == rotr90(diff2)
(diff,) = prewitt(extended::NTuple{N,Bool}, d)
Возвращает N-мерное ядро корреляции (кортеж) для вычисления градиента по измерению d
с помощью оператора Прюитта. Если extended[dim]
имеет значение false, diff
имеет размер 1 по соответствующему измерению.
Цитирование
J.M. Prewitt, Object enhancement and extraction, Picture processing and Psychopictorics, vol. 10, no. 1, pp. 15—19, 1970.
См. также описание функций KernelFactors.prewitt
, Kernel.sobel
, Kernel.ando3
, Kernel.scharr
,Kernel.bickley
и ImageFiltering.imgradients
.
#
ImageFiltering.Kernel.scharr
— Function
diff1, diff2 = scharr()
Возвращает ядра корреляции для вычисления двухмерного градиента с помощью оператора Шарра. Ядро diff1
вычисляет градиент по оси y (первое измерение), а ядро diff2
— градиент по оси x (второе измерение). diff1 == rotr90(diff2)
(diff,) = scharr(extended::NTuple{N,Bool}, d)
Возвращает N-мерное ядро корреляции (кортеж) для вычисления градиента по измерению d
с помощью оператора Шарра. Если extended[dim]
имеет значение false, diff
имеет размер 1 по соответствующему измерению.
Цитирование
H.Scharr and J. Weickert, An anisotropic diffusion algorithm with optimized rotation invariance, Mustererkennung 2000, pp. 460—467, 2000. doi:10.1007/978-3-642-59802-9_58
См. также описание функций KernelFactors.scharr
, Kernel.prewitt
, Kernel.ando3
, Kernel.bickley
и ImageFiltering.imgradients
.
#
ImageFiltering.Kernel.sobel
— Function
diff1, diff2 = sobel()
Возвращает ядра корреляции для вычисления двухмерного градиента с помощью оператора Собеля. Ядро diff1
вычисляет градиент по оси y (первое измерение), а ядро diff2
— градиент по оси x (второе измерение). diff1 == rotr90(diff2)
(diff,) = sobel(extended::NTuple{N,Bool}, d)
Возвращает N-мерное ядро корреляции (кортеж) для вычисления градиента по измерению d
с помощью оператора Собеля. Если extended[dim]
имеет значение false, diff
имеет размер 1 по соответствующему измерению.
Цитирование
P.-E. Danielsson and O. Seger, Generalized and separable sobel operators, in Machine Vision for Three-Dimensional Scenes, H. Freeman, Ed. Academic Press, 1990, pp. 347—379. doi:10.1016/b978-0-12-266722-0.50016-6
См. также описание функций KernelFactors.sobel
, Kernel.prewitt
, Kernel.ando3
, Kernel.scharr
, Kernel.bickley
и imgradients
.
KernelFactors
#
ImageFiltering.KernelFactors
— Module
KernelFactors
— это модуль, реализующий разделяемые ядра фильтрации, каждое из которых хранится в виде множителей. Поддерживаются следующие ядра:
-
box
-
sobel
-
prewitt
-
ando3
,ando4
иando5
(последнее только в двухмерном варианте) -
scharr
-
bickley
-
gaussian
-
IIRGaussian
(приближенная гауссова фильтрация, выполняющаяся быстро даже при большом σ)
См. также описание модуля Kernel
.
#
ImageFiltering.KernelFactors.ando3
— Function
kern1, kern2 = ando3()
Возвращает разложенную форму «оптимальных» градиентных фильтров Андо для измерений 1 и 2 изображения.
Цитирование
S.Ando, Consistent gradient operators, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 22, no.3, pp. 252—265, 2000. doi:10.1109/34.841757
См. также описание функций Kernel.ando3
, KernelFactors.ando4
, KernelFactors.ando5
и ImageFiltering.imgradients
.
kern = ando3(extended::NTuple{N,Bool}, d)
Возвращает разложенный фильтр Андо (размера 3) для вычисления градиента в N
измерениях по оси d
. Если extended[dim]
имеет значение false, kern
имеет размер 1 по соответствующему измерению.
См. также описание функций KernelFactors.ando4
, KernelFactors.ando5
и ImageFiltering.imgradients
.
#
ImageFiltering.KernelFactors.ando4
— Function
kern1, kern2 = ando4()
Возвращает разделяемые аппроксимации «оптимальных» фильтров Андо 4x4 для измерений 1 и 2 изображения.
Цитирование
S.Ando, Consistent gradient operators, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 22, no.3, pp. 252—265, 2000. doi:10.1109/34.841757
См. также описание функций Kernel.ando4
и ImageFiltering.imgradients
.
kern = ando4(extended::NTuple{N,Bool}, d)
Возвращает разложенный фильтр Андо (размера 4) для вычисления градиента в N
измерениях по оси d
. Если extended[dim]
имеет значение false, kern
имеет размер 1 по соответствующему измерению.
Цитирование
S.Ando, Consistent gradient operators, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 22, no.3, pp. 252—265, 2000. doi:10.1109/34.841757
См. также описание функций Kernel.ando4
и ImageFiltering.imgradients
.
#
ImageFiltering.KernelFactors.ando5
— Function
kern1, kern2 = ando5()
Возвращает разделяемые аппроксимации «оптимальных» градиентных фильтров Андо 5x5 для измерений 1 и 2 изображения.
Цитирование
S.Ando, Consistent gradient operators, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 22, no.3, pp. 252—265, 2000. doi:10.1109/34.841757
См. также описание функций Kernel.ando5
и ImageFiltering.imgradients
.
kern = ando5(extended::NTuple{N,Bool}, d)
Возвращает разложенный фильтр Андо (размера 5) для вычисления градиента в N
измерениях по оси d
. Если extended[dim]
имеет значение false, kern
имеет размер 1 по соответствующему измерению.
#
ImageFiltering.KernelFactors.bickley
— Function
kern1, kern2 = bickley()
Возвращает разложенные фильтры Бикли для измерений 1 и 2 изображения. Каждый из них представляет собой кортеж из двух одномерных фильтров.
Цитирование
W.G. Bickley, Finite difference formulae for the square lattice, The Quarterly Journal of Mechanics and Applied Mathematics, vol. 1, no. 1, pp. 35—42, 1948. doi:10.1093/qjmam/1.1.35
См. также описание функций Kernel.bickley
и ImageFiltering.imgradients
.
kern = bickley(extended::NTuple{N,Bool}, d)
Возвращает разложенный фильтр Бикли для вычисления градиента в N
измерениях по оси d
. Если extended[dim]
имеет значение false, kern
имеет размер 1 по соответствующему измерению.
См. также описание функций Kernel.bickley
и ImageFiltering.imgradients
.
#
ImageFiltering.KernelFactors.gaussian
— Function
gaussian(σ::Real, [l]) -> g
Создает одномерное гауссово ядро g
со среднеквадратичным отклонением σ
; при необходимости можно указать длину ядра l
. По умолчанию ядро простирается на два σ
в каждом направлении от центра. Значение l
должно быть нечетным.
gaussian((σ1, σ2, ...), [l]) -> (g1, g2, ...)
Создает многомерный фильтр Гаусса как произведение одномерных множителей со среднеквадратичным отклонением σd
по измерению d
. Можно также указать длину ядра l
в виде кортежа той же длины.
#
ImageFiltering.KernelFactors.IIRGaussian
— Function
IIRGaussian([T], σ; emit_warning::Bool=true)
Создает аппроксимацию бесконечной импульсной характеристики (БИХ) к гауссиану среднеквадратичного отклонения σ
. σ
может быть одним вещественным числом или кортежем чисел; в последнем случае создается кортеж таких фильтров, каждый из которых предназначен для фильтрации отдельного измерения массива.
При необходимости можно указать тип T
для коэффициентов фильтра; если тип не указан, он будет соответствовать типу σ
(если σ
не является значением с плавающей запятой, выбирается тип Float64
).
Цитирование
I.T. Young, L. J. van Vliet, and M. van Ginkel, Recursive Gabor Filtering. IEEE Trans. Sig. Proc., 50: 2798-2805 (2002).
#
ImageFiltering.KernelFactors.prewitt
— Function
kern1, kern2 = prewitt()
Возвращает разложенные фильтры Прюитта для измерений 1 и 2 изображения. Каждый из них представляет собой кортеж из двух одномерных фильтров.
Цитирование
J.M. Prewitt, Object enhancement and extraction, Picture processing and Psychopictorics, vol. 10, no. 1, pp. 15—19, 1970.
См. также описание функций Kernel.prewitt
и ImageFiltering.imgradients
.
kern = prewitt(extended::NTuple{N,Bool}, d)
Возвращает разложенный фильтр Прюитта для вычисления градиента в N
измерениях по оси d
. Если extended[dim]
имеет значение false, kern
имеет размер 1 по соответствующему измерению.
См. также описание функций Kernel.prewitt
и ImageFiltering.imgradients
.
#
ImageFiltering.KernelFactors.scharr
— Function
kern1, kern2 = scharr()
Возвращает разложенные фильтры Шарра для измерений 1 и 2 изображения. Каждый из них представляет собой кортеж из двух одномерных фильтров.
Цитирование
H.Scharr and J. Weickert, An anisotropic diffusion algorithm with optimized rotation invariance, Mustererkennung 2000, pp. 460—467, 2000. doi:10.1007/978-3-642-59802-9_58
См. также описание функций Kernel.scharr
и ImageFiltering.imgradients
.
kern = scharr(extended::NTuple{N,Bool}, d)
Возвращает разложенный фильтр Шарра для вычисления градиента в N
измерениях по оси d
. Если extended[dim]
имеет значение false, kern
имеет размер 1 по соответствующему измерению.
См. также описание функций Kernel.scharr
и ImageFiltering.imgradients
.
#
ImageFiltering.KernelFactors.sobel
— Function
kern1, kern2 = sobel()
Возвращает разложенные фильтры Собеля для измерений 1 и 2 двухмерного изображения. Каждый из них представляет собой кортеж из двух одномерных фильтров.
Цитирование
P.-E. Danielsson and O. Seger, Generalized and separable sobel operators, in Machine Vision for Three-Dimensional Scenes, H. Freeman, Ed. Academic Press, 1990, pp. 347—379. doi:10.1016/b978-0-12-266722-0.50016-6
См. также описание функций Kernel.sobel
и ImageFiltering.imgradients
.
kern = sobel(extended::NTuple{N,Bool}, d)
Возвращает разложенный фильтр Собеля для вычисления градиента в N
измерениях по оси d
. Если extended[dim]
имеет значение false, kern
имеет размер 1 по соответствующему измерению.
См. также описание функций Kernel.sobel
и ImageFiltering.imgradients
.
#
ImageFiltering.KernelFactors.TriggsSdika
— Type
TriggsSdika(a, b, scale, M)
Определяет ядро для одномерной фильтрации с бесконечной импульсной характеристикой (БИХ). a
— это «прямой» фильтр, b
— «обратный» фильтр, M
— матрица для сопоставления граничных условий на правом краю, а scale
— константа масштабирования, применяемая к каждому элементу по завершении фильтрации.
Цитирование
B.Triggs and M. Sdika, Boundary conditions for Young-van Vliet recursive filtering. IEEE Trans. on Sig. Proc. 54: 2365-2367 (2006).
TriggsSdika(ab, scale)
Создает симметричный фильтр Триггса-Сдики (с a = b = ab
). M
вычисляется автоматически. В настоящее время поддерживаются только фильтры длиной 3.
Служебные средства для ядер
#
OffsetArrays.center
— Function
center(A, [r::RoundingMode=RoundDown])::Dims
Возвращает координату центра заданного массива A
. Если значение size(A, k)
является четным числом, то будет применена процедура округления с режимом r
.
Совместимость: OffsetArrays 1.9
Для этого метода требуется версия OffsetArrays не ниже 1.9. |
Примеры
julia> A = reshape(collect(1:9), 3, 3)
3×3 Matrix{Int64}:
1 4 7
2 5 8
3 6 9
julia> c = OffsetArrays.center(A)
(2, 2)
julia> A[c...]
5
julia> Ao = OffsetArray(A, -2, -2); # оси (-1:1, -1:1)
julia> c = OffsetArrays.center(Ao)
(0, 0)
julia> Ao[c...]
5
Чтобы сместить центральную координату заданного массива в точку (0, 0, ...)
, можно использовать centered
.
#
OffsetArrays.centered
— Function
centered(A, cp=center(A)) -> Ao
Смещает центральную координату / точку cp
массива A
в точку (0, 0, ..., 0)
. Внутренне это эквивалентно OffsetArray(A, .-cp)
.
Совместимость: OffsetArrays 1.9
Для этого метода требуется версия OffsetArrays не ниже 1.9. |
Примеры
julia> A = reshape(collect(1:9), 3, 3)
3×3 Matrix{Int64}:
1 4 7
2 5 8
3 6 9
julia> Ao = OffsetArrays.centered(A); # оси (-1:1, -1:1)
julia> Ao[0, 0]
5
julia> Ao = OffsetArray(A, OffsetArrays.Origin(0)); # оси (0:2, 0:2)
julia> Aoo = OffsetArrays.centered(Ao); # оси (-1:1, -1:1)
julia> Aoo[0, 0]
5
Пользователи могут передавать cp
, чтобы изменить интерпретацию «центральной точки», но значение выходного массива также должно быть переосмыслено. Например, если cp = map(last, axes(A))
, то эта функция смещает уже не центральную точку, а правую нижнюю точку в точку (0, 0, ..., 0)
. Обычно cp
используется для изменения поведения округления, когда массив имеет четное значение размера в некотором измерении:
julia> A = reshape(collect(1:4), 2, 2) # В идеале центр должен быть в точке (1.5, 1.5), но OffsetArrays поддерживают только целочисленные смещения.
2×2 Matrix{Int64}:
1 3
2 4
julia> OffsetArrays.centered(A, OffsetArrays.center(A, RoundUp)) # задание (2, 2) в качестве центральной точки
2×2 OffsetArray(::Matrix{Int64}, -1:0, -1:0) with eltype Int64 with indices -1:0×-1:0:
1 3
2 4
julia> OffsetArrays.centered(A, OffsetArrays.center(A, RoundDown)) # задание (1, 1) в качестве центральной точки
2×2 OffsetArray(::Matrix{Int64}, 0:1, 0:1) with eltype Int64 with indices 0:1×0:1:
1 3
2 4
См. также описание функции center
.
#
ImageFiltering.KernelFactors.kernelfactors
— Function
kernelfactors(factors::Tuple)
Подготавливает разложенное ядро для фильтрации. Если передан кортеж из двух векторов длиной m
и n
, возвращается кортеж из двух векторов ReshapedVector
, имеющих размеры m×1
и 1×n
. В общем случае форма каждого следующего множителя factor
изменяется так, чтобы он простирался вдоль соответствующего измерения.
Если передан кортеж общих массивов, предполагается, что каждый из них имеет соответствующую форму вдоль «ведущих» измерений; размерность каждого массива «расширяется» до N = length(factors)
с добавлением значений 1 к размеру при необходимости.
#
ImageFiltering.Kernel.reflect
— Function
reflect(kernel) --> reflectedkernel
Вычисляет поточечное отражение относительно 0, 0, … ядра kernel
. При использовании imfilter
с reflectedkernel
выполняется свертка, а не корреляция, относительно исходного ядра kernel
.
Границы и дополнение
#
ImageFiltering.BorderArray
— Type
BorderArray(inner::AbstractArray, border::AbstractBorder) <: AbstractArray
Создает тонкую оболочку вокруг массива inner
с заданной границей border
. Данные в конструктор не копируются; вместо этого граничные значения вычисляются динамически в вызовах getindex
. Полезно для шаблонных вычислений. См. также описание функции padarray
.
Примеры
julia> using ImageFiltering
julia> arr = reshape(1:6, (2,3))
2×3 reshape(::UnitRange{Int64}, 2, 3) with eltype Int64:
1 3 5
2 4 6
julia> BorderArray(arr, Pad((1,1)))
BorderArray{Int64,2,Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Pad{2}} with indices 0:3×0:4:
1 1 3 5 5
1 1 3 5 5
2 2 4 6 6
2 2 4 6 6
julia> BorderArray(arr, Fill(10, (2,1)))
BorderArray{Int64,2,Base.ReshapedArray{Int64,2,UnitRange{Int64},Tuple{}},Fill{Int64,2}} with indices -1:4×0:4:
10 10 10 10 10
10 10 10 10 10
10 1 3 5 10
10 2 4 6 10
10 10 10 10 10
10 10 10 10 10
#
ImageFiltering.Fill
— Type
struct Fill{T,N} <: AbstractBorder
value::T
lo::Dims{N}
hi::Dims{N}
end
Fill
— это тип, определяющий конкретное значение, которое будет использоваться для экстраполяции пикселей за границами изображения.
Вывод
Тип Fill
, определяющий значение, которым будет дополняться граница изображения.
Подробные сведения
Когда операция фильтрации двухмерного пространственного изображения представлена в виде дискретной свертки между изображением и фильтром , результаты не определены для пикселей, которые находятся ближе пикселей к границе изображения. Чтобы определить операцию для пикселей, находящихся ближе к границе и на ней, требуется схема экстраполяции пикселей за границей. Тип Fill
позволяет указать конкретное значение, которое будет использоваться при экстраполяции. Подробные схемы экстраполяции см. в описании типа Pad
.
Этот тип упрощает дополнение одно-, двух- или многомерных изображений.
Можно указать другую степень дополнения на нижней и верхней границах каждого измерения изображения (верхней, левой, нижней и правой границах в двух измерениях).
Пример
Для иллюстрации рассмотрим изображение, состоящее из строки из шести пикселей, которые следуют по алфавиту:
┏━━━━━━┓
┃abcdef┃
┗━━━━━━┛
Дополнение постоянным значением m
только на левой и правой границах выглядит следующим образом:
╭────┏━━━━━━┓────╮
│mmmm┃abcdef┃mmmm│
╰────┗━━━━━━┛────╯
(Аналогичным будет результат и для верхней и нижней границ.)
#
ImageFiltering.Inner
— Type
Inner()
Inner(lo, hi)
Указывает, что края при фильтрации должны отбрасываться: возвращается только внутренняя часть результата.
Пример:
imfilter(img, kernel, Inner())
#
ImageFiltering.NA
— Type
NA(na=isnan)
Выбор фильтрации с использованием граничных условий NA (недоступно). Лучше всего подходит для фильтров только с положительными весами, например фильтров размытия. Выходное значение фактически нормализуется следующим образом:
filtered array with Fill(0) boundary conditions output = ----------------------------------------------- filtered 1 with Fill(0) boundary conditions
Элементы массива, для которых na
возвращает значение true
, также считаются находящимися за границами массива.
#
ImageFiltering.NoPad
— Type
NoPad()
NoPad(border)
Указывает, что дополнение не должно применяться к входному массиву или что входное изображение уже предварительно дополнено. Передача объекта border
позволяет сэкономить память на выборе границы; его можно получить по индексу в []
.
Пример
Следующие команды:
np = NoPad(Pad(:replicate)) imfilter!(out, img, kernel, np)
позволяют выполнить фильтрацию напрямую, пропустив дополнение. Каждый элемент out
должен быть вычислим с использованием операций в пределах границ с img
и kernel
.
#
ImageFiltering.Pad
— Type
struct Pad{N} <: AbstractBorder
style::Symbol
lo::Dims{N} # число, на которое следует расширить изображение с нижнего края каждого измерения
hi::Dims{N} # число, на которое следует расширить изображение с верхнего края каждого измерения
end
Pad
— это тип, определяющий форму дополнения, которая должна использоваться для экстраполяции пикселей за границами изображения. В экземплярах должен быть задан style
, символ, определяющий граничные условия изображения.
Вывод
Тип Pad
, определяющий способ дополнения границы изображения.
Расширенная справка
Когда операция фильтрации двухмерного пространственного изображения представлена в виде дискретной свертки между изображением и фильтром , результаты не определены для пикселей, которые находятся ближе пикселей к границе изображения. Чтобы определить операцию для пикселей, находящихся ближе к границе и на ней, требуется схема экстраполяции пикселей за границей. Тип Pad
позволяет указать необходимую схему экстраполяции.
Этот тип упрощает дополнение одно-, двух- или многомерных изображений.
Можно указать другую степень дополнения на нижней и верхней границах каждого измерения изображения (верхней, левой, нижней и правой границах в двух измерениях).
Параметры
Ниже описываются некоторые допустимые варианты style
. Для иллюстрации результаты дополнения с использованием каждого варианта показаны на примере изображения, состоящего из строки из шести пикселей, которые следуют по алфавиту:
┏━━━━━━┓
┃abcdef┃
┗━━━━━━┛
Результат дополнения демонстрируется только на левой и правой границах, но для верхней и нижней границ результат будет аналогичным.
:replicate
(по умолчанию)
Пиксели границы продолжаются за границами изображения.
╭────┏━━━━━━┓────╮
│aaaa┃abcdef┃ffff│
╰────┗━━━━━━┛────╯
:circular
Пиксели границы переносятся в противоположную сторону. Например, при обращении по индексам за пределами левой границы возвращаются значения начиная с правой границы.
╭────┏━━━━━━┓────╮
│cdef┃abcdef┃abcd│
╰────┗━━━━━━┛────╯
:symmetric
Пиксели границы отражаются относительно позиции между пикселями. Пиксель границы при этом опускается.
╭────┏━━━━━━┓────╮
│edcb┃abcdef┃edcb│
╰────┗━━━━━━┛────╯
:reflect
Пиксели границы отражаются относительно края изображения.
╭────┏━━━━━━┓────╮
│dcba┃abcdef┃fedc│
╰────┗━━━━━━┛────╯
#
ImageFiltering.padarray
— Function
padarray([T], img, border)
Generate a padded image from an array img
and a specification border
of the boundary conditions and amount of padding to add.
Return a padded image. The function supports one, two or multi-dimensional images. You can specify the element type T
of the output image.
Примеры
Дополнение
Основной синтаксис для Pad
имеет вид (style, m, n, ...)
или (style, (m, n))
, где m
пикселей добавляются к измерению 1 (сверху и снизу), n
пикселей — к измерению 2 и т. д.
Добавляем 30 пикселей слева и справа, 40 пикселей сверху и снизу:
padarray(A, Pad(:replicate, 30, 40))
padarray(A, Pad(:circular, 30, 40))
padarray(A, Pad(:symmetric, 30, 40))
padarray(A, Pad(:reflect, 30, 40))
Добавляем 30 пикселей сверху, 40 пикселей слева, 50 пикселей снизу, 60 пикселей справа:
padarray(A, Pad(0, (30, 40), (50, 60)))
padarray(A, Pad(0, (30, 40), (50, 60)))
3 измерения
padarray(A, Pad(:replicate, 1, 1, 1))
padarray(A, Fill(0, (1, 1, 1)))
Заполнение
Основной синтаксис для Fill
имеет вид (value, m, n)
или (value, (m, n))
, где в начале каждого измерения добавляется m
пикселей, а в конце — n
пикселей.
Добавляем 20 значений -1
сверху, 30 — слева, 40 — снизу, 50 — справа:
padarray(A, Fill(-1, (20, 30), (40, 50)))
Нахождение локальных экстремумов
#
ImageFiltering.findlocalmaxima
— Function
findlocalmaxima(img; window=default_window(img), edges=true) -> Vector{CartesianIndex}
Возвращает координаты элементов, значения которых больше, чем у всех смежных с ними элементов. edges
— это логическое значение, указывающее, следует ли включать первый и последний элементы каждого измерения, или кортеж логических значений, определяющий поведение на границах для каждого измерения по отдельности.
default_window
имеет значение 3 для каждого пространственного измерения img
и значение 1 в остальных случаях, что подразумевает нахождение максимумов среди смежных элементов по умолчанию в каждом пространственном «срезе».
#
ImageFiltering.findlocalminima
— Function
findlocalminima(img; window=default_window(img), edges=true) -> Vector{CartesianIndex}
Аналогично findlocalmaxima
, но возвращает координаты наименьших элементов.
Алгоритмы
#
ImageFiltering.Algorithm.FIR
— Type
Выполняет фильтрацию с использованием прямого алгоритма.
#
ImageFiltering.Algorithm.FFT
— Type
Выполняет фильтрацию с использованием быстрого преобразования Фурье.
#
ImageFiltering.Algorithm.IIR
— Type
Выполняет фильтрацию с использованием фильтра с бесконечной импульсной характеристикой.
#
ImageFiltering.Algorithm.Mixed
— Type
Выполняет фильтрацию с использованием каскада смешанных типов (БИХ, КИХ).
Решатели для готовых моделей
#
ImageFiltering.Models
— Module
Этот подмодуль предоставляет готовые модели, связанные с изображениями, и их решатели, которые можно применять для множества задач обработки изображений.
-
Решает модель Рудина-Ошера-Фатеми (ROF) прямодвойственным методом:
solve_ROF_PD
иsolve_ROF_PD!
#
ImageFiltering.Models.solve_ROF_PD!
— Method
solve_ROF_PD!(out, buffer, img, λ, num_iters)
Выполняемая на месте версия solve_ROF_PD
.
Решатель ROF нередко используется в цикле более высокого уровня. В этом случае имеет смысл предварительно выделить память для результата и промежуточных массивов для ускорения выполнения.
!!! note "Buffer"
Содержимое и назначение аргумента buffer
может измениться без уведомления при изменении внутренней реализации. Во избежание возможных изменений используйте вспомогательную функцию preallocate_solve_ROF_PD
.
Примеры
using ImageFiltering.Models: preallocate_solve_ROF_PD
out = similar(img)
buffer = preallocate_solve_ROF_PD(img)
solve_ROF_PD!(out, buffer, img, 0.2, 30)
#
ImageFiltering.Models.solve_ROF_PD
— Method
solve_ROF_PD([T], img::AbstractArray, λ; kwargs...)
Возвращает сглаженную версию img
с использованием фильтрации Рудина-Ошера-Фатеми (ROF), более известной как сглаживание или регуляризация методом полной вариации (TV). Этот алгоритм основан на прямодвойственном методе.
Эта функция применяется к универсальному N-мерному цветовому массиву и совместима с CUDA. Есть также выполняемая на месте версия: solve_ROF_PD!
.
Аргументы
-
T
: тип выходных элементов. По умолчаниюfloat32(eltype(img))
. -
img
: входное изображение, обычное зашумленное. -
λ
: коэффициент регуляризации. Чем больше значениеλ
, тем выше степень сглаживания.
Параметры
-
num_iters::Int
: число итераций перед остановкой.
Примеры
using ImageFiltering
using ImageFiltering.Models: solve_ROF_PD
using ImageQualityIndexes
using TestImages
img_ori = float.(testimage("cameraman"))
img_noisy = img_ori .+ 0.1 .* randn(size(img_ori))
assess_psnr(img_noisy, img_ori) # ~20 дБ
img_smoothed = solve_ROF_PD(img_noisy, 0.015, 50)
assess_psnr(img_smoothed, img_ori) # ~27 дБ
# при больших значениях λ результат будет чрезмерно сглаженным
img_smoothed = solve_ROF_PD(img_noisy, 5, 50)
assess_psnr(img_smoothed, img_ori) # ~21 дБ
Расширенная справка
С математической точки зрения эта функция решает следующую модель (ROF) прямодвойственным методом:
Справочные материалы
-
[1] Chambolle, A. (2004). An algorithm for total variation minimization and applications. Journal of Mathematical Imaging and Vision. 20: 89—97
-
[2] Википедия:https://en.wikipedia.org/wiki/Total_variation_denoising[]Сглаживание методом полной вариации
Внутренние механизмы
#
ImageFiltering.KernelFactors.ReshapedOneD
— Type
ReshapedOneD{N,Npre}(data)
Возвращает объект размерности N
, где data
должно иметь размерность 1. Он имеет оси 0:0
для первых Npre
измерений, оси data
для измерения Npre+1
и оси 0:0
для оставшихся измерений.
Объект data
должен поддерживать eltype
и ndims
, но не обязательно должен быть массивом AbstractArray.
ReshapedOneDs позволяет указать «измерение фильтрации» для одномерного фильтра.