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

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

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

binarize([T::Type,] img, f::AbstractImageBinarizationAlgorithm, args...; kwargs...)

Выполняет бинаризацию img с использованием алгоритма f.

Вывод

Возвращаемое изображение img₀₁ является Array{T}.

Если T не указан, он выводится как Gray{eltype(eltype(img))}, который является Gray{N0f8} для изображений типа Array{N0f8} и Array{Gray{N0f8}}, и Gray{Float32} для изображений типа Array{Float32} и Array{Gray{Float32}}

Примеры

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

img₀₁ = binarize(img, f)

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

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

img₀₁_float32 = binarize(Gray{Float32}, img, f)

См. также описание binarize! со сведениями о бинаризации на месте.

binarize!([out,] img, f::AbstractImageBinarizationAlgorithm, args...; kwargs...)

Выполняет бинаризацию img с использованием алгоритма f.

Вывод

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

Примеры

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

img₀₁ = similar(img)
binarize!(img₀₁, img, f)

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

binarize!(img, f)

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

Алгоритмы

AbstractImageBinarizationAlgorithm <: AbstractImageFilter

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

Любой конкретный алгоритм бинаризации должен выделять его подтип для поддержки API binarize и binarize!.

Примеры

Все алгоритмы в ImageBinarization вызываются по следующей схеме:

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

# передача алгоритма функции `binarize`
img₀₁ = binarize(img, f) # `eltype(img₀₁)` является `Gray{N0f8}`

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

Некоторые алгоритмы также получают дополнительную информацию об изображении в качестве аргумента для вывода наилучших параметров, например window_size для AdaptiveThreshold.

# необходимо указать явным образом
f = AdaptiveThreshold(window_size = 32)

# или вывести лучшее значение по умолчанию из заданного изображения
img = testimage("cameraman")
f = AdaptiveThreshold(img)

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

Метод адаптивного порога

AdaptiveThreshold <: AbstractImageBinarizationAlgorithm
AdaptiveThreshold([img]; [window_size,] percentage = 15)

binarize([T,] img, f::AdaptiveThreshold)
binarize!([out,] img, f::AdaptiveThreshold)

Выполняет бинаризацию img с использованием порога, изменяющегося в зависимости от освещенности фона.

Вывод

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

Расширенная справка

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

Если значение пикселя на t процентов меньше, чем среднее значение окна пикселей , расположенного вокруг пикселя, пиксель становится черным, в противном случае — белым.

Эффективный с точки зрения вычислений метод вычисления среднего значения окрестности достигается за счет использования интегрального изображения integral_image.

Этот алгоритм особенно хорошо работает с изображениями, которые имеют ярко выраженный контраст между задним и передним планом. См. [1] для получения дополнительных сведений.

Аргументы

Более подробно аргумент функции описан ниже.

img::AbstractArray

Изображение, которое необходимо бинаризовать. Изображение автоматически преобразуется в Gray для построения гистограммы с нужными уровнями яркости.

Вы также можете передать img в AdaptiveThreshold для автоматического вывода лучшего window_size.

Параметры

Различные варианты для параметров AdaptiveThreshold, binarize и binarize! более подробно описываются ниже.

Варианты для percentage

Вы можете указать целое число для percentage (обозначенное t в [1]), которое должно находиться в диапазоне от 0 до 100. Значение по умолчанию: 15

Варианты для window_size

Аргумент window_size (обозначенный s в [1]) задает размер квадратной окрестности пикселя, который должен быть больше нуля.

Если img передан конструктору AdaptiveThreshold, window_size выводится как целое число, ближайшее к 1/8 от среднего значения ширины и высоты img.

Примеры

using TestImages

img = testimage("cameraman")
f = AdaptiveThreshold(window_size = 16)
img₀₁ = binarize(img, f)

f = AdaptiveThreshold(img) # вывод наилучшего `window_size` с использованием `img`
img₀₁ = binarize(img, f)

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

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

Метод Ниблэка

Niblack <: AbstractImageBinarizationAlgorithm
Niblack(; window_size = 7, bias = 0.2)

binarize([T,] img, f::Niblack)
binarize!([out,] img, f::Niblack)

Применяет адаптивный порог Ниблэка [1] с предположением, что входное изображение является текстовым.

Вывод

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

Расширенная справка

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

Входное изображение бинаризуется путем изменения порога во всеми изображении с помощью измененной версии алгоритма Ниблэка [2]. Порог определяется для каждого пикселя на основе среднего и стандартного отклонения интенсивности соседних пикселей в окне вокруг него. Порог задается следующим образом:

где  — это задаваемый пользователем параметр, определяющий влияние стандартного отклонения на значение .

Обратите внимание, что алгоритм Ниблэка очень чувствителен к изменениям значений серого цвета пикселей заднего плана, которые часто превышают локальные пороги и проявляются в виде артефактов на бинаризованном изображении. Алгоритм Sauvola, включенный в данный пакет, пытается решить эту проблему [2].

Аргументы

img

Изображение, бинаризованное в соответствии с попиксельным адаптивным порогом в значения пикселей заднего плана (0) и переднего плана (1).

bias::Real (обозначается в публикации)

Определяемый пользователем параметр смещения для порога. Может иметь отрицательные значения. Большее значение bias способствует появлению большего количества черных пикселей в выводе.

window_size::Integer (обозначается в публикации)

Порог для каждого пикселя является функцией распределения интенсивностей всех соседних пикселей в квадратном окне вокруг него. Длина стороны этого окна составляет , с целевым пикселем в центральной позиции.

Если значение не указано, window_size равен 7.

Пример

Бинаризация изображения «оператор» в пакете TestImages.

using TestImages, ImageBinarization

img = testimage("cameraman")
img₀₁ = binarize(img, Niblack())

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

Метод сегментации многочлена

Polysegment <: AbstractImageBinarizationAlgorithm
Polysegment()

binarize([T,] img, f::Polysegment)
binarize!([out,] img, f::Polysegment)

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

Вывод

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

Расширенная справка

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

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

Аргументы

Более подробно аргумент функции описан ниже.

img::AbstractArray

Изображение, которое необходимо бинаризовать. Изображение автоматически преобразуется в Gray.

Пример

Бинаризация изображения «оператор» в пакете TestImages.

using TestImages, ImageBinarization

img = testimage("cameraman")
img_binary = binarize(img, Polysegment())

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

  1. R. E. Vidal, Generalized Principal Component Analysis (GPCA): An Algebraic Geometric Approach to Subspace Clustering and Motion Segmentation. Order No. 3121739, University of California, Berkeley, Ann Arbor, 2003.

Метод Сауволы

Sauvola <: AbstractImageBinarizationAlgorithm
Sauvola(; bias = 0.2, window_size=7)

binarize([T,] img, f::Sauvola)
binarize!([out,] img, f::Sauvola)

Применяет адаптивную бинаризацию изображений по методу Сауволы-Пиетикайнена [1] с предположением, что входное изображение является текстовым.

Вывод

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

Расширенная справка

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

Входное изображение бинаризуется путем изменения порога во всеми изображении с помощью измененной версии алгоритма Ниблэка [2]. Подход Ниблэка заключался в определении порога для каждого пикселя на основе среднего и стандартного отклонения интенсивности соседних пикселей в окне вокруг него, заданный как

где  — это задаваемый пользователем параметр, определяющий влияние стандартного отклонения на значение .

Алгоритм Ниблэка очень чувствителен к изменениям значений серого цвета пикселей заднего плана, которые часто превышают локальные пороги и проявляются в виде артефактов на бинаризованном изображении. Саувола и Пиетикайнен [1] представляют динамический диапазон стандартного отклонения (т. е. его максимально возможное значение в цветовом пространстве), при этом порог определяется следующим образом

Это адаптивно усиливает вклад стандартного отклонения в значение .

Алгоритм Сауволы-Пиетикайнена реализован здесь с использованием оптимизации, предложенной Шафаитом, Кейзерсом и Бройлем [3], в которой интегральные изображения используются для вычисления значений и для каждого пикселя в постоянном времени. Поскольку каждая из этих структур данных может быть вычислена за один проход по исходному изображению, время выполнения значительно улучшается.

Аргументы

img

Изображение, бинаризованное в соответствии с попиксельным адаптивным порогом в значения пикселей заднего плана (0) и переднего плана (1).

window_size::Integer (обозначается в публикации)

Порог для каждого пикселя является функцией распределения интенсивностей всех соседних пикселей в квадратном окне вокруг него. Длина стороны этого окна составляет , с целевым пикселем в центральной позиции.

bias::Real (обозначается в публикации)

Определяемый пользователем параметр смещения. Может принимать отрицательные значения, хотя типичными являются значения в диапазоне [0,2, 0,5]. Согласно [1] этот алгоритм не слишком чувствителен к значению $k`$.

Пример

Бинаризация изображения «оператор» в пакете TestImages.

using TestImages, ImageBinarization

img = testimage("cameraman")
img_binary = binarize(img, Sauvola(window_size = 9, bias = 0.2))

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

  1. J. Sauvola and M. Pietikäinen (2000). Adaptive document image binarization. Pattern Recognition 33 (2): 225-236. doi:10.1016/S0031-3203(99)00055-2

  2. Wayne Niblack (1986). An Introduction to Image Processing. Prentice-Hall, Englewood Cliffs, NJ: 115-16.

  3. Faisal Shafait, Daniel Keysers and Thomas M. Breuel (2008). Efficient implementation of local adaptive thresholding techniques using integral images. Proc. SPIE 6815, Document Recognition and Retrieval XV, 681510 (28 January 2008). doi:10.1117/12.767755

Алгоритмы, использующие одну гистограмму-порог

Основную функциональность этих алгоритмов поддерживает HistogramThresholding.jl.

SingleHistogramThreshold <: AbstractImageBinarizationAlgorithm
SingleHistogramThreshold(alg::AbstractThresholdAlgorithm; nbins=256)

binarize([T,] img, f::AbstractThresholdAlgorithm; nbins=256)
binarize!([out,] img, f::AbstractThresholdAlgorithm; nbins=256)

Выполняет бинаризацию изображения img с использованием порога, найденного заданным алгоритмом поиска порога alg.

Вывод

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

Аргументы

Более подробно аргумент функции описан ниже.

img::AbstractArray

Изображение, которое необходимо бинаризовать. Изображение автоматически преобразуется в Gray для построения гистограммы с нужными уровнями яркости.

alg::AbstractThresholdAlgorithm

AbstractThresholdAlgorithm является абстрактным типом, определенным в ThresholdAPI.jl в пакете HistogramThreshold.jl. Он предоставляет различные алгоритмы поиска порогов:

  • HistogramThresholding.Balanced

  • HistogramThresholding.Entropy

  • HistogramThresholding.Intermodes

  • HistogramThresholding.MinimumError

  • HistogramThresholding.MinimumIntermodes

  • HistogramThresholding.Moments

  • HistogramThresholding.Otsu

  • HistogramThresholding.UnimodalRosin

  • HistogramThresholding.Yen

Более подробное объяснение и сведения о построении см. в описании каждого конкретного алгоритма. Например, введите ?Otsu в REPL, чтобы получить более подробную информацию о том, как использовать методы Otsu.

nbins::Integer

Количество дискретных столбцов, используемых для построения гистограммы. Меньший nbins может дать менее шумный или, другими словами, более сглаженный вывод. Значение по умолчанию — 256.

Примеры

Все использование происходит по одной и той же схеме. Возьмем для примера Otsu:

using TestImages, ImageBinarization

img = testimage("cameraman")
img_binary = binarize(img, Otsu())

Это менее удобно, но, тем не менее, вы также можете построить SingleHistogramThreshold самостоятельно:

using TestImages, ImageBinarization

img = testimage("cameraman")
f = SingleHistogramThreshold(Otsu(), nbins=256)
img_binary = binarize(img, f)

Метод Оцу

t = find_threshold(histogram, edges, Otsu())
t = find_threshold(img, Otsu(); nbins = 256)

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

Вывод

Возвращает вещественное число t в edges. Параметр edges представляет AbstractRange, который задает интервалы, связанные со столбцами гистограммы.

Расширенная справка

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

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

Выбор порога разделяет данные на две категории —  и . Пусть

обозначают кумулятивные вероятности,

обозначают средние, а

обозначают дисперсии категорий и , соответственно. Кроме того, пусть

представляет общее среднее,

межкатегорийную дисперсию, а

внутрикатегорийную дисперсию, соответственно.

Нахождение дискретного значения , максимизирующего функцию , дает искомый порог (т. е. столбец, определяющий порог). Как оказалось, это пороговое значение равно порогу, определяемому путем минимизации критерия внутрикатегориальной дисперсии . Более того, этот порог также совпадает с порогом, вычисленным путем максимизации отношения межкатегориальной дисперсии к внутрикатегориальной дисперсии.

Аргументы

Аргументы функции более подробно описываются ниже.

histogram

AbstractArray, хранящий распределение частот.

edges

AbstractRange, указывающий, как делятся интервалы для распределения частот.

Пример

Вычисление порога для изображения «оператор» в пакете TestImages.

using TestImages, ImageContrastAdjustment, HistogramThresholding

img = testimage("cameraman")
edges, counts = build_histogram(img,256)
#=
  The `counts` array stores at index 0 the frequencies that were below the
  first bin edge. Since we are seeking a threshold over the interval
  partitioned by `edges` we need to discard the first bin in `counts`
  so that the dimensions of `edges` and `counts` match.
=#
t = find_threshold(counts[1:end], edges, Otsu())

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

  1. Nobuyuki Otsu (1979). A threshold selection method from gray-level histograms. IEEE Trans. Sys., Man., Cyber. 9 (1): 62—​66. doi:10.1109/TSMC.1979.4310076

Метод минимального количества мод

t = find_threshold(histogram, edges, Minimum(); maxiter = 8000)
t = find_threshold(img, Minimum(); nbins = 256)

При допущении, что гистограмма является бимодальной, гистограмма сглаживается с помощью фильтра средних значений длины 3 до тех пор, пока не останется две моды. Затем для порога задается минимальное значение двух мод.

Вывод

Возвращает вещественное число t в edges. Параметр edges представляет AbstractRange, который задает интервалы, связанные со столбцами гистограммы.

Расширенная справка

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

Если после maxiter итераций сглаженная гистограмма все еще не является бимодальной, алгоритм вернется к использованию метода UnimodalRosin для выбора порога.

Аргументы

Аргументы функции более подробно описываются ниже.

histogram

AbstractArray, хранящий распределение частот.

edges

AbstractRange, указывающий, как делятся интервалы для распределения частот.

maxiter

Int, задающий максимальное количество итераций сглаживания. Если значение не указано, используется значение по умолчанию (8000).

Пример

Вычисление порога для изображения «оператор» в пакете TestImages.

using TestImages, ImageContrastAdjustment, HistogramThresholding

img = testimage("cameraman")
edges, counts = build_histogram(img,256)
#=
  The `counts` array stores at index 0 the frequencies that were below the
  first bin edge. Since we are seeking a threshold over the interval
  partitioned by `edges` we need to discard the first bin in `counts`
  so that the dimensions of `edges` and `counts` match.
=#
t = find_threshold(counts[1:end], edges, MinimumIntermodes())

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

  1. C. A. Glasbey, An Analysis of Histogram-Based Thresholding Algorithms, CVGIP: Graphical Models and Image Processing, vol. 55, no. 6, pp. 532—​537, Nov. 1993. doi:10.1006/cgip.1993.1040

  2. J. M. S. Prewitt and M. L. Mendelsohn, THE ANALYSIS OF CELL IMAGES, *Annals of the New York Academy of Sciences, vol. 128, no. 3, pp. 1035—​1053, Dec. 2006. doi:10.1111/j.1749-6632.1965.tb11715.x

Межмодовый метод

t = find_threshold(histogram, edges, Intermodes(maxiter=8000))
t = find_threshold(img, Intermodes(); nbins = 256)

При допущении, что гистограмма является бимодальной, гистограмма сглаживается с помощью фильтра средних значений длины 3 до тех пор, пока не останется две моды. Затем для порога задается среднее значение двух мод.

Вывод

Возвращает вещественное число t в edges. Параметр edges представляет AbstractRange, который задает интервалы, связанные со столбцами гистограммы.

Расширенная справка

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

Если после maxiter итераций сглаженная гистограмма все еще не является бимодальной, алгоритм вернется к использованию метода UnimodalRosin для выбора порога.

Аргументы

Аргументы функции более подробно описываются ниже.

histogram

AbstractArray, хранящий распределение частот.

edges

AbstractRange, указывающий, как делятся интервалы для распределения частот.

maxiter

Int, задающий максимальное количество итераций сглаживания. Если значение не указано, используется значение по умолчанию (1000).

Пример

Вычисление порога для изображения «оператор» в пакете TestImages.

using TestImages, ImageContrastAdjustment, HistogramThresholding

img = testimage("cameraman")
edges, counts = build_histogram(img,256)
#=
  The `counts` array stores at index 0 the frequencies that were below the
  first bin edge. Since we are seeking a threshold over the interval
  partitioned by `edges` we need to discard the first bin in `counts`
  so that the dimensions of `edges` and `counts` match.
=#
t = find_threshold(counts[1:end], edges, Intermodes())

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

  1. C. A. Glasbey, An Analysis of Histogram-Based Thresholding Algorithms, CVGIP: Graphical Models and Image Processing, vol. 55, no. 6, pp. 532—​537, Nov. 1993. doi:10.1006/cgip.1993.1040

Метод минимального количества ошибок

t = find_threshold(histogram, edges, MinimumError())
t = find_threshold(img, MinimumError(); nbins = 256)

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

Вывод

Возвращает вещественное число t в edges. Параметр edges представляет AbstractRange, который задает интервалы, связанные со столбцами гистограммы.

Расширенная справка

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

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

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

обозначают кумулятивные вероятности,

обозначают средние, а

обозначают дисперсии категорий и , соответственно.

Киттлер и Иллингворт предложили использовать функцию критерия минимума ошибки

для оценки несоответствия между сочетанием гауссианов, подразумеваемой определенным порогом , и кусочно-постоянной функцией плотности вероятности, представленной гистограммой. Нахождение дискретного значения , максимизирующего функцию , дает искомое пороговое значение (т. е. столбец, определяющий порог).

Аргументы

Аргументы функции более подробно описываются ниже.

histogram

AbstractArray, хранящий распределение частот.

edges

AbstractRange, указывающий, как делятся интервалы для распределения частот.

Пример

Вычисление порога для изображения «оператор» в пакете TestImages.

using TestImages, ImageContrastAdjustment, HistogramThresholding

img = testimage("cameraman")
edges, counts = build_histogram(img,256)
#=
  The `counts` array stores at index 0 the frequencies that were below the
  first bin edge. Since we are seeking a threshold over the interval
  partitioned by `edges` we need to discard the first bin in `counts`
  so that the dimensions of `edges` and `counts` match.
=#
t = find_threshold(counts[1:end], edges, MinimumError())

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

  1. J. Kittler and J. Illingworth, Minimum error thresholding, Pattern Recognition, vol. 19, no. 1, pp. 41—​47, Jan. 1986. doi:10.1016/0031-3203(86)90030-0

  2. Q.-Z. Ye and P.-E. Danielsson, On minimum error thresholding and its implementations, Pattern Recognition Letters, vol. 7, no. 4, pp. 201—​206, Apr. 1988. doi:10.1016/0167-8655(88)90103-1

Метод моментов

t = find_threshold(histogram, edges, Moments())
t = find_threshold(img, Moments(); nbins = 256)

Порог определяется следующим правилом: если присвоить всем наблюдениям ниже порога значение z₀, а всем наблюдениям выше порога — значение z₁, первые три момента исходной гистограммы должны соответствовать моментам этой специально построенной двухуровневой гистограммы.

Вывод

Возвращает вещественное число t в edges. Параметр edges представляет AbstractRange, который задает интервалы, связанные со столбцами гистограммы.

Расширенная справка

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

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

Моменты могут быть вычислены из гистограммы следующим образом.

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

Конкретно, пусть и обозначают доли наблюдений ниже и выше порога в , соответственно. Ограничение, согласно которому первые три момента в должны быть равны первым трем моментам в , можно выразить следующей системой четырех уравнений:

где левая часть представляет моменты , а правая часть представляет моменты . Чтобы найти желаемое пороговое значение, сначала нужно решить четыре уравнения, чтобы получить и , а затем выбрать порог таким образом, что .

Аргументы

Аргументы функции более подробно описываются ниже.

histogram

AbstractArray, хранящий распределение частот.

edges

AbstractRange, указывающий, как делятся интервалы для распределения частот.

Пример

Вычисление порога для изображения «оператор» в пакете TestImages.

using TestImages, ImageContrastAdjustment, HistogramThresholding

img = testimage("cameraman")
edges, counts = build_histogram(img,256)
#=
  The `counts` array stores at index 0 the frequencies that were below the
  first bin edge. Since we are seeking a threshold over the interval
  partitioned by `edges` we need to discard the first bin in `counts`
  so that the dimensions of `edges` and `counts` match.
=#
t = find_threshold(counts[1:end], edges, Moments())

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

Унимодальная функция Розина

t = find_threshold(histogram, edges, UnimodalRosin())
t = find_threshold(img, UnimodalRosin(); nbins = 256)

Генерирует порог, предполагающий унимодальное распределение, используя алгоритм Розина.

Вывод

Возвращает вещественное число t в edges. Параметр edges представляет AbstractRange, который задает интервалы, связанные со столбцами гистограммы.

Расширенная справка

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

Этот алгоритм сначала выбирает столбцы на гистограмме с наибольшей частотой. Затем алгоритм выполняет поиск от расположения максимального столбца до последнего столбца гистограммы, чтобы найти первый столбец с частотой 0 (известный как минимальный столбец). Затем проводится линия, проходящая через максимальный и минимальный столбцы. Столбец с наибольшим ортогональным расстоянием до линии выбирается в качестве порогового значения.

Допущения

Этот алгоритм предполагает, что

  • гистограмма является унимодальной;

  • всегда существует хотя бы один столбец, частота которого равна 0. В противном случае алгоритм будет использовать последний столбец в качестве минимального.

Если гистограмма содержит несколько столбцов с частотой 0, алгоритм выберет первый нулевой столбец в качестве минимума. Если имеется несколько столбцов с наибольшим ортогональным расстоянием, в качестве порога выбирается самый левый столбец.

Аргументы

Аргументы функции более подробно описываются ниже.

histogram

AbstractArray, хранящий распределение частот.

edges

AbstractRange, указывающий, как делятся интервалы для распределения частот.

Пример

Вычисление порога для изображения «поверхность луны» в пакете TestImages.

using TestImages, ImageContrastAdjustment, HistogramThresholding

img = testimage("moonsurface")
edges, counts = build_histogram(img,256)
#=
  The `counts` array stores at index 0 the frequencies that were below the
  first bin edge. Since we are seeking a threshold over the interval
  partitioned by `edges` we need to discard the first bin in `counts`
  so that the dimensions of `edges` and `counts` match.
=#
t = find_threshold(counts[1:end], edges, UnimodalRosin())

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

  1. P. L. Rosin, Unimodal thresholding, Pattern Recognition, vol. 34, no. 11, pp. 2083—​2096, Nov. 2001.https://doi.org/10.1016/s0031-3203%2800%2900136-9[doi:10.1016/s0031-3203(00)00136-9]

Метод энтропии

find_threshold(counts, edges, Entropy())
t = find_threshold(img, Entropy(); nbins = 256)

Алгоритм поиска порогового значения для гистограммы с уровнями серого с использованием энтропии гистограммы.

Вывод

Возвращает точку в AbstractRange, которая соответствует пороговому столбцу на гистограмме.

Расширенная справка

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

Этот алгоритм использует энтропию гистограммы с уровнями серого для определения порогового значения.

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

Энтропии, связанные с каждым распределением, имеют следующий вид.

Объединяя эти две энтропийные функции, мы имеем следующее.

Нахождение дискретного значения , максимизирующего функцию , дает искомое пороговое значение (т. е. столбец, определяющий порог).

Более подробно о выведении энтропии см. в разделе 4 в [1].

Параметры

Варианты для counts

Можно указать AbstractArray, который должен быть одномерным массивом частот для гистограммы. Необходимо представить соответствующий диапазон edges для столбцов гистограммы. Функция выдает ошибку, если обнаружит, что edges и counts имеют разную длину.

Варианты для edges

Можно указать AbstractRange, который должен быть соответствующим диапазоном для столбцов массива гистограммы, передаваемым в counts.

Пример

using TestImages, Images

img = testimage("cameraman")
# создание гистограммы с 256 столбцами
edges, counts = build_histogram(img, 256)
#=
  The `counts` array stores at index 0 the frequencies that were below the
  first bin edge. Since we are seeking a threshold over the interval
  partitioned by `edges` we need to discard the first bin in `counts`
  so that the dimensions of `edges` and `counts` match.
=#
find_threshold(counts[1:end], edges, Entropy())

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

Метод сбалансированной гистограммы

t = find_threshold(histogram, edges, Balanced())
t = find_threshold(img, Balanced(); nbins = 256)

При определении порога в сбалансированной гистограмме столбец интерпретируется как физический вес с массой, равной количеству его заполненности. Метод сбалансированной гистограммы включает в себя итерацию следующих трех шагов: (1) выбор индекс столбца средней точки в качестве главного, (2) вычисление суммарного веса слева и справа от главного столбца и (3) удаление самого левого столбца, если левая часть самая тяжелая, и самого правого в противном случае. Алгоритм останавливается, когда остается только один столбец. Последний столбец определяет искомый порог.

Вывод

Возвращает вещественное число t в edges. Параметр edges представляет AbstractRange, который задает интервалы, связанные со столбцами гистограммы.

Расширенная справка

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

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

где для

и . Конечный интервал состоит из одного элемента, который является индексом столбца, соответствующим желаемому порогу.

Если интерпретировать столбец как физический груз с массой, равной его заполненности, каждый шаг алгоритма можно представить как удаление крайнего левого или крайнего правого столбца, чтобы «уравновесить» результирующую гистограмму в главном элементе. Главный элемент определяется как середина между начальной и конечной точками рассматриваемого интервала.

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

Аргументы

Аргументы функции более подробно описываются ниже.

histogram

AbstractArray, хранящий распределение частот.

edges

AbstractRange, указывающий, как делятся интервалы для распределения частот.

Пример

Вычисление порога для изображения «оператор» в пакете TestImages.

using TestImages, ImageContrastAdjustment, HistogramThresholding

img = testimage("cameraman")
edges, counts = build_histogram(img, 256)
#=
  The `counts` array stores at index 0 the frequencies that were below the
  first bin edge. Since we are seeking a threshold over the interval
  partitioned by `edges` we need to discard the first bin in `counts`
  so that the dimensions of `edges` and `counts` match.
=#
t = find_threshold(counts[1:end], edges, Balanced())

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

  1. BI-LEVEL IMAGE THRESHOLDING - A Fast Method, Proceedings of the First International Conference on Bio-inspired Systems and Signal Processing, 2008. 10.5220/0001064300700076

Метод Йена

t = find_threshold(histogram, edges, Yen())
t = find_threshold(img, Yen(); nbins = 256)

Вычисляет пороговое значение, используя критерий максимальной корреляции Йена для двухуровневой пороговой обработки.

Вывод

Возвращает вещественное число t в edges. Параметр edges представляет AbstractRange, который задает интервалы, связанные со столбцами гистограммы.

Расширенная справка

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

Этот алгоритм использует концепцию энтропийной корреляции гистограммы уровней серого для получения порогового значения.

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

Энтропийные корреляции, связанные с каждым распределением, имеют следующий вид.

Объединяя эти две функции энтропийной корреляции, мы имеем следующее.

Нахождение дискретного значения , максимизирующего функцию , дает искомое пороговое значение (т. е. столбец, определяющий порог).

Аргументы

Аргументы функции более подробно описываются ниже.

histogram

AbstractArray, хранящий распределение частот.

edges

AbstractRange, указывающий, как делятся интервалы для распределения частот.

Пример

Вычисление порога для изображения «оператор» в пакете TestImages.

using TestImages, ImageContrastAdjustment, HistogramThresholding

img = testimage("cameraman")
edges, counts = build_histogram(img, 256)
#=
  The `counts` array stores at index 0 the frequencies that were below the
  first bin edge. Since we are seeking a threshold over the interval
  partitioned by `edges` we need to discard the first bin in `counts`
  so that the dimensions of `edges` and `counts` match.
=#
t = find_threshold(counts[1:end], edges, Yen())

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

  1. Yen JC, Chang FJ, Chang S (1995), A New Criterion for Automatic Multilevel Thresholding, IEEE Trans. on Image Processing 4 (3): 370-378, doi:10.1109/83.366472