Справочник по функциям
Общие функции
#
ImageEdgeDetection.EdgeDetectionAPI.detect_edges — Function
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! со сведениями об обнаружении краев на месте.
#
ImageEdgeDetection.EdgeDetectionAPI.detect_edges! — Function
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.
#
ImageEdgeDetection.EdgeDetectionAPI.detect_subpixel_edges — Function
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! со сведениями об обнаружении краев на месте.
#
ImageEdgeDetection.EdgeDetectionAPI.detect_subpixel_edges! — Function
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.
#
ImageEdgeDetection.detect_gradient_orientation — Function
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). Значения 2π и 360 используются в качестве контрольных для обозначения неопределенных углов (поскольку величина градиента была слишком близка к нулю). По умолчанию угол не определен, если (abs(g₁) < tol && abs(g₂) < tol), где g₁ и g₂ обозначают градиент в первом и втором пространственных измерениях, и tol = sqrt(eps(Float64)) (как определено в типе OrientationConvention).
См. также описание detect_gradient_orientation!.
#
ImageEdgeDetection.detect_gradient_orientation! — Function
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). Значения 2π и 360 используются в качестве контрольных для обозначения неопределенных углов (поскольку величина градиента была слишком близка к нулю). По умолчанию угол не определен, если (abs(g₁) < tol && abs(g₂) < tol), где g₁ и g₂ обозначают градиент в первом и втором пространственных измерениях, и tol = sqrt(eps(eltype(out))) (как определено в OrientationConvention).
См. также описание detect_gradient_orientation.
#
ImageEdgeDetection.EdgeDetectionAPI.thin_edges — Function
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! со сведениями об уточнении краев на месте.
#
ImageEdgeDetection.EdgeDetectionAPI.thin_edges! — Function
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.
#
ImageEdgeDetection.EdgeDetectionAPI.thin_subpixel_edges — Function
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!.
#
ImageEdgeDetection.EdgeDetectionAPI.thin_subpixel_edges! — Function
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.
Алгоритмы обнаружения краев
#
ImageEdgeDetection.EdgeDetectionAPI.AbstractEdgeDetectionAlgorithm — Type
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)
#
ImageEdgeDetection.Canny — Type
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.
Алгоритмы уточнения краев
#
ImageEdgeDetection.EdgeDetectionAPI.AbstractEdgeThinningAlgorithm — Type
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, которые при добавлении к координатам изображения края определяют расположения края с субпиксельной точностью.
Подавление немаксимумов
#
ImageEdgeDetection.NonmaximaSuppression — Type
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.
Подавление немаксимумов (субпиксели)
#
ImageEdgeDetection.SubpixelNonmaximaSuppression — Type
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)
Справочные материалы
-
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.
-
F. Devernay, A non-maxima suppression method for edge detection with sub-pixel accuracy, Tech. Report RR-2724, INRIA, 1995.
Тип OrientationConvention
#
ImageEdgeDetection.OrientationConvention — Type
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). Значения 2π и 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)
Вспомогательные типы
#
ImageEdgeDetection.Percentile — Type
Percentile(x)
Indicate that x should be interpreted as a percentile rather than an absolute value. For example,
-
detect_edges(img, Canny(high = 80, low = 20))uses absolute thresholds on the edge magnitudes -
detect_edges(img, Canny(high = Percentile(80), low = Percentile(20)))uses percentiles of the edge magnitude image as threshold