Является ли Sobel Filter нормализованным?

X-производный Sobel выглядит следующим образом:

-1 0 +1
-2 0 +2
-1 0 +1

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

0 0 1            1 0 0
0 0 1      &     1 0 0
0 0 1            1 0 0

Если я выполню свертку, я получаю соответственно 4 и -4.

Таким образом, мой естественный ответ был бы нормализовать результат на 8 и перевести его на 0,5 - это верно? (Мне интересно, как не могу найти Википедию и т.д., Указав какую-либо нормализацию)

EDIT: Я использую фильтр Sobel для создания двумерного структурного тензора (с производными dX и dY):

                   A B 
Structure Tensor = C D

with  A = dx^2 
      B = dx*dy
      C = dx*dy 
      D = dy^2

В конечном итоге я хочу сохранить результат в [0,1], но сейчас мне просто интересно, нужно ли мне нормализовать результат Sobel (по умолчанию, а не только для его хранения) или нет, то есть:

A = dx*dx 
//OR
A = (dx/8.0)*(dx/8.0)
//OR
A = (dx/8.0+0.5)*(dx/8.0+0.5)

Ответ 1

Фильтр Собеля представляет собой композицию фильтра конечных разностей в одном измерении:

[ 1  0  -1 ] / 2

и сглаживающий фильтр в другом измерении:

[ 1  2  1 ] / 4

Следовательно, правильная нормализация к ядру, как обычно определяется, составляет 1/8.

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

1/4 в сглаживающем фильтре - это нормализация до 1. 1/2 в конечно-разностном фильтре получается из расстояния между двумя сравниваемыми пикселями. Производная определяется как предел h до нуля [f (x + h) -f (x)]/h. Для приближения конечных разностей мы можем выбрать h = 1, что приведет к фильтру [1,-1] или h = 2, что приведет к фильтру выше. Преимущество при h = 2 состоит в том, что фильтр симметричен, при h = 1 вы в конечном итоге вычисляете производную в середине между двумя пикселями, таким образом, результат смещается на половину пикселя.

Ответ 2

Математически правильная нормализация для фильтра Собеля составляет 1/8, поскольку он приносит результат в естественные единицы одного уровня серого на пиксель. Но в практическом программировании это не всегда правильно.

Ответ 3

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

http://www.imagemagick.org/discourse-server/viewtopic.php?t=14434&start=30

Фактически, scikit-image использует этот подход. например,

>>>from skimage import filters
>>>import numpy as np
>>>one[:,0] = 2
>>>one
array([[ 2.,  1.,  1.],
       [ 2.,  1.,  1.],
       [ 2.,  1.,  1.]])
>>>filters.sobel_v(one)
array([[ 0.,  0.,  0.],
       [ 0., -1.,  0.],
       [ 0.,  0.,  0.]])