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

Справочник по функциям

Общие функции

out = detect_edges([T::Type,] img, f::AbstractEdgeDetectionAlgorithm, args...; kwargs...)

Обнаруживает края изображения (img), используя алгоритм f. Если не указано, f считается как Canny.

Вывод

Возвращаемое изображение out является Array{T}. Если T не указан, он выводится.

Примеры

Просто передайте входное изображение и алгоритм функции detect_edges.

f = Canny(spatial_scale = 1.4)
img_edges = detect_edges(img, f)

Это означает «обнаружение краев (detect_edges) изображения (img) с использованием алгоритма f».

Вы также можете явным образом указать возвращаемый тип:

f = Canny(spatial_scale = 1.4)
img_edges_float32 = detect_edges(Gray{Float32}, img, f)

См. также описание detect_edges! со сведениями об обнаружении краев на месте.

detect_edges!([out,] img, f::AbstractEdgeDetectionAlgorithm, args...; kwargs...)

Обнаруживает края изображения (img), используя алгоритм f. Если не указано, f считается как Canny.

Вывод

Если out указан, он будет изменен на месте. В противном случае img будет изменен на месте.

Примеры

Просто передайте алгоритм функции detect_edges!:

img_edges = similar(img)
detect_edges!(img_edges, img, f)

Когда вы просто хотите изменить img на месте, необязательно вручную выделять img_edges. Достаточно воспользоваться вспомогательным методом:

detect_edges!(img, f)

См. также описание detect_edges.

out₁, out₂ = detect_subpixel_edges([T₁::Type, T₂::Type], img, f::AbstractEdgeDetectionAlgorithm, args...; kwargs...)

Обнаруживает края изображения (img) с точностью до субпикселя, используя алгоритм f. Если не указано, f считается как Canny.

Вывод

Целочисленные компоненты края соответствуют ненулевым записям строк и столбцов в out₁, который представляет собой Array{T₁}. Сопутствующие смещения субпикселей хранятся в двумерном массиве out₂ в виде векторов длиной 2 (Array{SVector{2, T₂}}). Для восстановления субпиксельных координат можно добавить смещения субпикселей к целочисленным компонентам.

Примеры

Просто передайте входное изображение и алгоритм функции detect_subpixel_edges.

f = Canny(spatial_scale = 1.4, thinning_algorithm = SubpixelNonmaximaSuppression())
img_edges, offsets = detect_subpixel_edges(img, f)

Это означает «обнаружение краев (detect_subpixel_edges) изображения (img) с использованием алгоритма f».

Вы также можете явным образом указать возвращаемые типы:

f = Canny(spatial_scale = 1.4, thinning_algorithm = SubpixelNonmaximaSuppression())
img_edges, offsets = detect_subpixel_edges(Gray{Float32}, Float32, img, f)

См. также описание detect_subpixel_edges! со сведениями об обнаружении краев на месте.

detect_subpixel_edges!(out₁, out₂, img, f::AbstractEdgeDetectionAlgorithm, args...; kwargs...)

Обнаруживает края изображения (img) с точностью до субпикселя, используя алгоритм f. Если не указано, f считается как Canny.

Вывод

Целочисленные компоненты края соответствуют ненулевым записям строк и столбцов в out₁. Сопутствующие смещения субпикселей хранятся в двумерном массиве out₂ в виде векторов длиной 2. Для восстановления субпиксельных координат можно добавить смещения субпикселей к целочисленным компонентам.

Примеры

Просто передайте алгоритм функции detect_subpixel_edges!:

f = Canny(spatial_scale = 1.4, thinning_algorithm = SubpixelNonmaximaSuppression())
img_edges = similar(img)
offsets = zeros(SVector{2,Float64}, axes(img))
detect_edges!(img_edges, offsets, img, f)

См. также описание detect_subpixel_edges.

detect_gradient_orientation(g₁::AbstractArray, g₂::AbstractArray, orientation_convention::OrientationConvention, args...; kwargs...)

Учитывая градиент в первом (g₁) и втором (g₂) пространственных измерениях, возвращает ориентацию градиента, где ориентация интерпретируется в соответствии с заданным OrientationConvention.

Подробные сведения

Вы можете указать, как должна быть представлена ориентация градиента, предоставив OrientationConvention. Если это не указано, ориентация измеряется против часовой стрелки с южного направления. Это связано с тем, что в растровой системе координат первое пространственное измерение увеличивается по мере продвижения вниз по изображению (то есть указывает на юг), а второе пространственное измерение увеличивается по мере продвижения вправо по изображению (то есть указывает на восток).

Чтобы интерпретировать ориентацию в канонических декартовых координатах, укажите восток в качестве эталонного направления компаса (compass_direction = 'E') и направление против часовой стрелки (clockwise = false).

Вывод

Возвращает двумерный массив углов. Если in_radians = true, допустимые углы находятся в диапазоне [0...2π), в противном случае — в диапазоне [0...360). Значения и 360 используются в качестве контрольных для обозначения неопределенных углов (поскольку величина градиента была слишком близка к нулю). По умолчанию угол не определен, если (abs(g₁) < tol && abs(g₂) < tol), где g₁ и g₂ обозначают градиент в первом и втором пространственных измерениях, и tol = sqrt(eps(Float64)) (как определено в типе OrientationConvention).

См. также описание detect_gradient_orientation!.

detect_gradient_orientation(out::AbstractArray, g₁::AbstractArray, g₂::AbstractArray, orientation_convention::OrientationConvention, args...; kwargs...)

Учитывая градиент в первом (g₁) и втором (g₂) пространственных измерениях, возвращает ориентацию градиента в out, где ориентация интерпретируется в соответствии с заданным OrientationConvention.

Подробные сведения

Вы можете указать, как должна быть представлена ориентация градиента, предоставив OrientationConvention. Если это не указано, ориентация измеряется против часовой стрелки в радианах с южного направления. Это связано с тем, что в растровой системе координат первое пространственное измерение увеличивается по мере продвижения вниз по изображению (то есть указывает на юг), а второе пространственное измерение увеличивается по мере продвижения вправо по изображению (то есть указывает на восток).

Чтобы интерпретировать ориентацию в канонических декартовых координатах, укажите восток в качестве эталонного направления компаса (compass_direction = 'E') и направление против часовой стрелки (clockwise = false).

Вывод

Возвращает двумерный массив углов. Если in_radians = true, истинные углы находятся в диапазоне [0...2π), в противном случае — в диапазоне [0...360). Значения и 360 используются в качестве контрольных для обозначения неопределенных углов (поскольку величина градиента была слишком близка к нулю). По умолчанию угол не определен, если (abs(g₁) < tol && abs(g₂) < tol), где g₁ и g₂ обозначают градиент в первом и втором пространственных измерениях, и tol = sqrt(eps(eltype(out))) (как определено в OrientationConvention).

См. также описание detect_gradient_orientation.

thin_edges([T::Type,] mag, g₁, g₂, f::AbstractEdgeThinningAlgorithm, args...; kwargs...)

Используя алгоритм f, уточняет передачу края на основе величины края mag, градиента в первом пространственном измерении g₁ и градиента во втором пространственном измерении g₂.

Вывод

Возвращает Array{T}, представляющий уточненную передачу края.

Если T не указан, он выводится. Обратите внимание, что T должен представлять или заключать в оболочку число с плавающей запятой.

Примеры

Просто передайте входное изображение и алгоритм функции thin_edges.

using TestImages, ImageFiltering
img =  Gray.(testimage("mandril"))

# Градиент в первом и втором пространственном измерении
g₁, g₂ = imgradients(img, KernelFactors.scharr)

# Величина градиента
mag = hypot.(g₁, g₂)

f = NonmaximaSuppression(threshold = Percentile(10))

thinned_edges = thin_edges(mag, g₁, g₂, f)

Это означает «уточнение краев (thin_edges) на основе величины передачи края пространственных градиентов с использованием алгоритма f».

Вы также можете явным образом указать возвращаемый тип:

thinned_edges_float32 = thin_edges(Gray{Float32}, mag, g₁, g₂, f)

См. также описание thin_edges! со сведениями об уточнении краев на месте.

thin_edges!([out,] mag, g₁, g₂, f::AbstractEdgeThinningAlgorithm, args...; kwargs...)

Изолирует локальные максимумы величины градиента mag вдоль направления локального градиента. Аргументы g₁ и g₂ представляют градиент в первом пространственном измерении (y) и градиент во втором пространственном измерении (x), соответственно.

Вывод

Если out указан, он будет изменен на месте. В противном случае mag будет изменен на месте.

Примеры

Просто передайте алгоритм функции thin_edges!:

using TestImages, ImageFiltering
img =  Gray.(testimage("mandril"))

# Градиент в первом и втором пространственном измерении
g₁, g₂ = imgradients(img, KernelFactors.scharr)

# Величина градиента
mag = hypot.(g₁, g₂)

f = SubpixelNonmaximaSuppression(threshold = Percentile(10))

thinned_edges = zeros(eltype(mag), axes(mag))
thin_edges!(thinned_edges, mag, g₁, g₂, f)

Когда вы просто хотите изменить mag на месте, необязательно вручную выделять thinned_edges. Достаточно воспользоваться вспомогательным методом:

thin_edges!(mag, g₁, g₂, f)

См. также описание thin_edges.

out₁, out₂ = thin_subpixel_edges(mag, g₁, g₂, f::AbstractEdgeThinningAlgorithm, args...; kwargs...)

Изолирует локальные максимумы величины градиента mag вдоль направления локального градиента. Аргументы g₁ и g₂ представляют градиент в первом пространственном измерении (y) и градиент во втором пространственном измерении (x), соответственно.

Вывод

Целочисленные компоненты локальных максимумов соответствуют ненулевым записям строк и столбцов в out₁. Сопутствующие смещения субпикселей хранятся в двумерном массиве out₂ в виде векторов длиной 2. Для восстановления субпиксельных координат можно добавить смещения субпикселей к целочисленным компонентам.

Примеры

Просто передайте алгоритм функции thin_subpixel_edges:

using TestImages, ImageFiltering
img =  Gray.(testimage("mandril"))

# Градиент в первом и втором пространственном измерении
g₁, g₂ = imgradients(img, KernelFactors.scharr)

# Величина градиента
mag = hypot.(g₁, g₂)

f = SubpixelNonmaximaSuppression(threshold = Percentile(10))

thinned_edges, offsets = thin_subpixel_edges(mag, g₁, g₂, f)

См. также описание thin_subpixel_edges!.

thin_subpixel_edges!(out₁, out₂, mag, g₁, g₂, f::AbstractEdgeThinningAlgorithm, args...; kwargs...)

Изолирует локальные максимумы величины градиента mag вдоль направления локального градиента. Аргументы g₁ и g₂ представляют градиент в первом пространственном измерении (y) и градиент во втором пространственном измерении (x), соответственно.

Вывод

Целочисленные компоненты локальных максимумов соответствуют ненулевым записям строк и столбцов в out₁. Сопутствующие смещения субпикселей хранятся в двумерном массиве out₂ в виде векторов длиной 2. Для восстановления субпиксельных координат можно добавить смещения субпикселей к целочисленным компонентам.

Примеры

Просто передайте алгоритм функции thin_subpixel_edges!:

using TestImages, ImageFiltering
img =  Gray.(testimage("mandril"))

# Градиент в первом и втором пространственном измерении
g₁, g₂ = imgradients(img, KernelFactors.scharr)

# Величина градиента
mag = hypot.(g₁, g₂)

f = SubpixelNonmaximaSuppression(threshold = Percentile(10))

thinned_edges = zeros(eltype(mag), axes(mag))
offsets = zeros(SVector{2,Float64}, axes(mag))
thin_subpixel_edges!(thinned_edges, offsets, mag, g₁, g₂, f)

См. также описание thin_subpixel_edges.

Алгоритмы обнаружения краев

AbstractEdgeDetectionAlgorithm <: AbstractImageFilter

Корневой тип для пакета ImageEdgeDetection.

Любой конкретный алгоритм обнаружения краев должен выделять его подтип для поддержки API detect_edges, detect_edges!, detect_subpixel_edges и detect_subpixel_edges!.

Примеры

Все алгоритмы обнаружения краев в ImageEdgeDetection вызываются по следующей схеме:

# создание экземпляра алгоритма
f = Canny()

# передача алгоритма функции `detect_edges`
img_edges = detect_edges(img, f)

# или использование версии `detect_edges!` на месте
img_edges = similar(img)
detect_edges!(img_edges, img, f)

Дополнительные примеры см. в описании detect_edges и detect_edges! и конкретных алгоритмов.

Можно также обнаруживать края с субпиксельной точностью, указав SubpixelNonmaximaSuppression в качестве алгоритма уточнения краев и используя detect_subpixel_edges или detect_subpixel_edges!. Функция возвращает изображение края, а также сопровождающую матрицу векторов длиной 2, которые при добавлении к координатам изображения края определяют расположения края с субпиксельной точностью.

# создание экземпляра алгоритма
f = Canny(thinning_algorithm = SubpixelNonmaximaSuppression())

# передача алгоритма функции `detect_subpixel_edge`
img_edges, subpixel_offsets = detect_subpixel_edges(img, f)

# или использование версии `detect_edges!` на месте
img_edges = similar(img)
subpixel_offsets = zeros(SVector{2,Float64}, axes(img))
detect_edges!(img_edges, subpixel_offsets, img, f)

Алгоритм Кэнни (Canny)

    Canny <: AbstractEdgeDetectionAlgorithm
    Canny(; spatial_scale = 1, high = Percentile(80), low = Percentile(20), thinning_algorithm = NonmaximaSuppression(threshold = low))

    detect_edges([T,] img, f::Canny)
    detect_edges!([out,] img, f::Canny)
    detect_subpixel_edges([T₁, T₂] img, f::Canny)
    detect_subpixel_edges!(out₁, out₂, img, f::Canny)

Возвращает двоичное изображение, отображающее края входного изображения.

Подробные сведения

TODO

Параметры

Различные варианты параметров функции detect_edges и типа Canny более подробно описываются ниже.

Варианты для изображений

Функция detect_edges может обрабатывать различные типы входных данных. По умолчанию тип возвращаемого изображения совпадает с типом входного изображения.

Для цветных изображений входные данные преобразуются в оттенки серого.

Варианты для spatial_scale в Canny.

Параметр spatial_scale определяет радиус (σ) гауссова фильтра. Это должно быть положительное вещественное число.

Варианты для high и low в Canny.

Пороги гистерезиса high и low (high > low) могут быть заданы как положительные числа или как Percentiles. Если значение не указано, используется значение по умолчанию high = Percentile(80) и low = Percentile(20).

Варианты для thinning_algorithm в Canny.

Вы можете указать AbstractEdgeThinningAlgorithm. По умолчанию используется алгоритм NonmaximaSuppression, который подавляет немаксимумы с точностью на уровне пикселя. Для субпиксельной точности задайте алгоритм SubpixelNonmaximaSuppression.

Пример

using TestImages, FileIO, ImageView

img =  testimage("mandril_gray")
img_edges = detect_edges(img, Canny(spatial_scale = 1.4))

imshow(img)
imshow(img_edges)

Справочные материалы

J.Canny, A Computational Approach to Edge Detection, in IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. PAMI-8, no. 6, pp. 679-698, Nov. 1986, doi: 10.1109/TPAMI.1986.4767851.

Алгоритмы уточнения краев

AbstractEdgeThinningAlgorithm <: AbstractImageFilter

Корневой тип для пакета ImageEdgeDetection.

Любой конкретный алгоритм уточнения краев должен выделять его подтип для поддержки API thin_edges, thin_edges!, thin_subpixel_edges и thin_subpixel_edges!.

Примеры

Все алгоритмы обнаружения краев в ImageEdgeDetection вызываются по следующей схеме:

# создание экземпляра алгоритма
f = NonmaximaSuppression()

# определение градиентов изображения
g₁, g₂ = imgradients(img, KernelFactors.scharr)

# определение величины градиента
mag = hypot.(g₁, g₂)

# передача алгоритма функции `thin_edges`
thinned_edges = thin_edges(mag, g₁, g₂, f)

# или использование версии `thin_edges!` на месте
thinned_edges = zeros(eltype(mag), axes(mag))
thin_edges!(thinned_edges, mag, g₁, g₂, f)

Дополнительные примеры см. в описании thin_edges и thin_edges! и конкретных алгоритмов.

Для выполнения подавления немаксимумов с субпиксельной точностью можно использовать функции thin_subpixel_edges и thin_subpixel_edges!. Функция возвращает изображение края, а также сопровождающую матрицу векторов длиной 2, которые при добавлении к координатам изображения края определяют расположения края с субпиксельной точностью.

Подавление немаксимумов

    NonmaximaSuppression <: AbstractEdgeThinningAlgorithm
    NonmaximaSuppression(; threshold::Union{Number, Percentile} = Percentile(20))

    f = NonmaximaSuppression()
    f(out::AbstractArray, mag::AbstractArray, g₁::AbstractArray, g₂::AbstractArray, f::NonmaximaSuppression)

Изолирует локальные максимумы величины градиента mag вдоль направления локального градиента и сохраняет результат в out. Аргументы g₁ и g₂ представляют градиент в первом пространственном измерении (y) и градиент во втором пространственном измерении (x), соответственно.

Подробные сведения

TODO

Пример

using TestImages, FileIO, ImageView, ImageEdgeDetection, ImageFiltering

img =  testimage("mandril_gray")

# Градиент в первом и втором пространственном измерении
g₁, g₂ = imgradients(img, KernelFactors.scharr)

# Величина градиента
mag = hypot.(g₁, g₂)

nms = zeros(eltype(mag), axes(mag))
# Создание экземпляра функтора NonmaximaSuppression.
f = NonmaximaSuppression()

# Подавление немаксимальных величин градиента и сохранение результата в `nms`.
f(nms, mag, g₁, g₂)

imshow(img)
imshow(mag)
imshow(nms)

Справочные материалы

J.Canny, A Computational Approach to Edge Detection, in IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. PAMI-8, no. 6, pp. 679-698, Nov. 1986, doi: 10.1109/TPAMI.1986.4767851.

Подавление немаксимумов (субпиксели)

    SubpixelNonmaximaSuppression <: AbstractEdgeThinningAlgorithm
    SubpixelNonmaximaSuppression(; threshold::Union{Number, Percentile} = Percentile(20))

    f = SubpixelNonmaximaSuppression()
    f(out₁::AbstractArray, out₂::Matrix{<:AbstractArray}, mag::AbstractArray, g₁::AbstractArray, g₂::AbstractArray, f::SubpixelNonmaximaSuppression)

Изолирует локальные максимумы величины градиента mag вдоль направления локального градиента с субпиксельной точностью. Аргументы g₁ и g₂ представляют градиент в первом пространственном измерении (y) и градиент во втором пространственном измерении (x), соответственно.

Целочисленные компоненты локальных максимумов соответствуют ненулевым записям строк и столбцов в out₁. Сопутствующие смещения субпикселей хранятся в двумерном массиве out₂ в виде векторов длиной 2. Для восстановления субпиксельных координат можно добавить смещения субпикселей к целочисленным компонентам.

Подробные сведения

TODO

Пример

using TestImages, FileIO, ImageView, ImageEdgeDetection, ImageFiltering

img =  testimage("mandril_gray")

# Градиент в первом и втором пространственном измерении
g₁, g₂ = imgradients(img, KernelFactors.scharr)

# Величина градиента
mag = hypot.(g₁, g₂)

nms = zeros(eltype(mag), axes(mag))
subpixel_offsets = zeros(SVector{2,Float64}, axes(mag))

# Создание экземпляра функтора NonmaximaSuppression.
f = SubpixelNonmaximaSuppression()

# Подавление немаксимальных величин градиента и сохранение результата в `nms`.
f(nms, subpixel_offsets, mag, g₁, g₂)

imshow(img)
imshow(mag)
imshow(nms)

Справочные материалы

  1. J. Canny, A Computational Approach to Edge Detection, in IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. PAMI-8, no. 6, pp. 679-698, Nov. 1986, doi: 10.1109/TPAMI.1986.4767851.

  2. F. Devernay, A non-maxima suppression method for edge detection with sub-pixel accuracy, Tech. Report RR-2724, INRIA, 1995.

Тип OrientationConvention

    OrientationConvention(; compass_direction::AbstractChar = 'S', is_clockwise::Bool = false, in_radians = true, tol = sqrt(eps(Float64)))

Указывает контекст системы координат для detect_gradient_orientation, который определяет значение углов (ориентации градиента).

Подробные сведения

Вы можете указать, как должна быть представлена ориентация градиента. По умолчанию ориентация измеряется против часовой стрелки с южного направления. Это связано с тем, что в растровой системе координат первое пространственное измерение увеличивается по мере продвижения вниз по изображению (то есть указывает на юг), а второе пространственное измерение увеличивается по мере продвижения вправо по изображению (то есть указывает на восток).

Чтобы интерпретировать ориентацию в канонических декартовых координатах, укажите восток в качестве эталонного направления компаса (compass_direction = 'E') и направление против часовой стрелки (clockwise = false).

Если in_radians = true, допустимые углы находятся в диапазоне [0...2π), в противном случае — в диапазоне [0...360). Значения и 360 используются в качестве контрольных для обозначения неопределенных углов (поскольку величина градиента была слишком близка к нулю). По умолчанию угол не определен, если (abs(g₁) < tol && abs(g₂) < tol), где g₁ и g₂ обозначают градиент в первом и втором пространственных измерениях, и tol = sqrt(eps(Float64)).

Пример

using TestImages, FileIO, ImageView, ImageEdgeDetection, ImageFiltering

img =  testimage("mandril_gray")

# Градиент в первом и втором пространственном измерении
g₁, g₂ = imgradients(img, KernelFactors.scharr)

# Интерпретация углов с учетом канонической декартовой системы координат,
# где углы измеряются против часовой стрелки от положительного направления оси x.

orientation_convention = OrientationConvention(in_radians = true,
                                               is_clockwise = false,
                                               compass_direction = 'E')
angles = detect_gradient_orientation(g₁, g₂, orientation_convention)