Предназначен ли фильтр Собеля для нормализации?

x-производная Собеля выглядит так:

-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 — это правильно? (Мне интересно, как я не могу найти Википедию и т. Д., В которых упоминается какая-либо нормализация)

РЕДАКТИРОВАТЬ: я использую фильтр Собеля для создания двумерного тензора структуры (с производными dX и dY):

                   A B 
Structure Tensor = C D

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

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

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

person Tom    schedule 09.04.2013    source источник
comment
это зависит только от вашего приложения. Если цель состоит в том, чтобы сохранить его и визуализировать результат в виде растрового изображения, вам следует преобразовать и масштабировать его так, чтобы он попадал в диапазон 0..255. Какова ваша цель ?   -  person nbonneel    schedule 09.04.2013
comment
Поэтому моей естественной реакцией было бы нормализовать результат на 8 и перевести его на 0,5 — это правильно? Ваш ответ на что?   -  person Lajos Arpad    schedule 09.04.2013
comment
@WhitAngl: хранение и визуализация — это конечная цель (поэтому в конце я сделаю соответствующую нормализацию/перевод), но между ними мне нужно немного больше вычислить. И мне интересно, нужно ли ВСЕГДА нормализовать фильтр Собеля (см. обновленный вопрос).   -  person Tom    schedule 09.04.2013
comment
@Lajos Arpad: естественный ответ на получение результатов, которые больше не входят в диапазон ввода, то есть [0 = черный до 1 = белый]   -  person Tom    schedule 09.04.2013
comment
если вопрос: нужно ли ВСЕГДА нормализовать, ответ - нет. Например, у меня есть приложение, которое этого не делает. Значит всегда не держит.   -  person nbonneel    schedule 09.04.2013
comment
Я только что видел ваше редактирование: если вы хотите вычислить тензор структуры: вы вообще НЕ должны его нормализовать.   -  person nbonneel    schedule 09.04.2013
comment
Хорошо, никакой нормализации до самого конца. Благодарю вас!   -  person Tom    schedule 09.04.2013
comment
Возможно, вы уже думаете об этом, но я бы предположил, что это ВСЕГДА будет нормализовано, и для каждого изображения нужно знать максимальное/минимальное значение результирующих значений и соответствующим образом масштабировать его. Пусть это будет частью процесса для каждого изображения, и так получилось, что max и min равны 1 и 0, так и быть, масштабирование не требуется.   -  person Noremac    schedule 09.04.2013
comment
Единственная причина, по которой вы когда-либо нормализовали любую свертка, заключается либо в том, что я хочу увидеть результаты, либо в том, что алгоритм требует нормализации. Если вы просто используете полученные коэффициенты для дальнейших вычислений, то нет причин для нормализации.   -  person jodag    schedule 19.09.2013


Ответы (3)


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

[ 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 вы в конечном итоге вычисляете производную посередине между двумя пикселями, поэтому результат смещается. на полпикселя.

person Cris Luengo    schedule 19.04.2019

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

person Ophir Gvirtzer    schedule 19.03.2014

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

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.]])
person Yan Zhu    schedule 25.08.2015