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

Градиенты изображения

Функция imgradients

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

imgradients(img, kernelfun=KernelFactors.ando3, border="replicate") -> gimg1, gimg2, ...

Вывод

Градиент возвращается в виде кортежа массивов, по одному массиву для каждого измерения во входном массиве. gimg1 соответствует производной относительно первого измерения, gimg2 — второго и т. д.

Пример

В этом примере методы оценки градиента сравниваются в плане точности, с которой оценивается ориентация градиента.

using Images

values = LinRange(-1,1,128);
w = 1.6*pi;

## Определим функцию синусоидальной дифракционной решетки, f(x,y) = sin( (w*x)^2 + (w*y)^2 ),
## вместе с ее точными частными производными.
I = [sin( (w*x)^2 + (w*y)^2 ) for y in values, x in values];
Ix = [2*w*x*cos( (w*x)^2 + (w*y)^2 ) for y in values, x in values];
Iy = [2*w*y*cos( (w*x)^2 + (w*y)^2 ) for y in values, x in values];

## Определим точную ориентацию градиентов.
direction_true = atan.(Iy./Ix);

for kernelfunc in (KernelFactors.prewitt, KernelFactors.sobel,
                   KernelFactors.ando3, KernelFactors.scharr,
                   KernelFactors.bickley)

    ## Оценим градиенты и их ориентацию.
    Gy, Gx = imgradients(I,kernelfunc, "replicate");
    direction_estimated = atan.(Gy./Gx);

    ## Определим среднее абсолютное отклонение между оценочной и истинной
    ## ориентациями. Значения на границе игнорируются, так как предполагается, что они
    ## ошибочные.
    error = mean(abs.(direction_true[2:end-1,2:end-1] -
                     direction_estimated[2:end-1,2:end-1]));

    error = round(error, digits=5);
    println("Using \$kernelfunc results in a mean absolute deviation of \$error")
end

Результат выполнения этого кода:

Using ImageFiltering.KernelFactors.prewitt results in a mean absolute deviation of 0.01069
Using ImageFiltering.KernelFactors.sobel results in a mean absolute deviation of 0.00522
Using ImageFiltering.KernelFactors.ando3 results in a mean absolute deviation of 0.00365
Using ImageFiltering.KernelFactors.scharr results in a mean absolute deviation of 0.00126
Using ImageFiltering.KernelFactors.bickley results in a mean absolute deviation of 0.00038

Параметр kernelfun

Выбрать конечно-разностную схему можно с помощью параметра kernelfun. С помощью параметра border можно также указать, как следует поступать с пикселями на границе изображения.

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

Как правило, значением kernelfun может быть любая функция, соответствующая следующему интерфейсу:

    kernelfun(extended::NTuple{N,Bool}, d) -> kern_d,

где kern_d — это ядро для получения производной по -му измерению -мерного массива. Параметр extended[i] имеет значение true, если изображение имеет размер больше 1 по измерению . В параметре kern_d можно передать плотное или разложенное ядро, причем если ядро является разделяемым, рекомендуется разложенное представление.

Ниже описываются некоторые допустимые варианты kernelfun.

KernelFactors.prewitt

В варианте prewit [3] градиент вычисляется на основе следующих ядер:

См. также описание функций KernelFactors.prewitt и Kernel.prewitt.

KernelFactors.sobel

В варианте sobel [4] задаются следующие ядра:

См. также описание функций KernelFactors.sobel и Kernel.sobel.

KernelFactors.ando3

В варианте ando3 [5] задаются следующие ядра:

См. также описание функций KernelFactors.ando3 и Kernel.ando3; KernelFactors.ando4 и Kernel.ando4; KernelFactors.ando5 и Kernel.ando5.

KernelFactors.scharr

В варианте scharr [6] задаются следующие ядра:

См. также описание функций KernelFactors.scharr и Kernel.scharr.

KernelFactors.bickley

В варианте bickley [7,8] задаются следующие ядра:

См. также описание функций KernelFactors.bickley и Kernel.bickley.

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

С помощью аргумента border указывается способ дополнения для экстраполяции изображения за пределами его исходных границ. Для иллюстрации результаты дополнения с использованием каждого варианта показаны на примере изображения, состоящего из строки из шести пикселей, которые следуют по алфавиту: . Результат дополнения демонстрируется только на левой и правой границах, но для верхней и нижней границ результат будет аналогичным.

"replicate"

Пиксели границы продолжаются за границами изображения.

См. также описание Pad, padarray, Inner и NoPad.

"circular"

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

См. также описание Pad, padarray, Inner и NoPad.

"symmetric"

Пиксели границы отражаются относительно позиции между пикселями. Пиксель границы при этом опускается.

См. также описание Pad, padarray, Inner и NoPad.

"reflect"

Пиксели границы отражаются относительно края изображения.

См. также описание Pad, padarray, Inner и NoPad.

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

Для понимания различий между методами оценки градиента следует отличать (1) непрерывное аналоговое изображение со скалярными значениями , где x_1,x_2 \in \mathbb{R}, и (2) его дискретную цифровую реализацию , где , and .

Аналоговое изображение

Градиент непрерывного аналогового изображения в точке определяется как вектор

где  — единичный вектор в направлении . Градиент направлен в сторону максимальной скорости изменения в точке с координатами . С помощью градиента можно вычислить производную функции в произвольном направлении. В частности, производная в направлении единичного вектора находится по формуле , где означает точечное произведение.

Цифровое изображение

На практике мы получаем цифровое изображение , где яркость известна только в дискретном множестве мест. Это означает, что необходимые частные производные не определены и должны быть аппроксимированы по разностно-дискретным формулам [1].

Простым способом аппроксимации частных производных является использование центрально-разностных формул

и

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

Ядро также часто называют маской или сверточной матрицей.

Весовые схемы и погрешность аппроксимации

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

Большинство конечно-разностных схем, используемых при обработке изображений, основаны на ядрах , и, как указано в работе [7], многие из них также могут быть параметризованы одним параметром :

где

Разделяемые ядра

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

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

  1. B. Jahne, Digital Image Processing (5th ed.). Springer Publishing Company, Incorporated, 2005. 10.1007/3-540-27563-0

  2. M. Patra and M. Karttunen, Stencils with isotropic discretization error for differential operators, Numer. Methods Partial Differential Eq., vol. 22, pp. 936—​953, 2006. doi:10.1002/num.20129

  3. J. M. Prewitt, Object enhancement and extraction, Picture processing and Psychopictorics, vol. 10, no. 1, pp. 15—​19, 1970.

  4. 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

  5. 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

  6. 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

  7. A. Belyaev, Implicit image differentiation and filtering with applications to image sharpening, SIAM Journal on Imaging Sciences, vol. 6, no. 1, pp. 660—​679, 2013. doi:10.1137/12087092x

  8. 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