Является ли 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.]])