2013-06-13 4 views
23

Для изображения производной вычисления, оператор Собела выглядит следующим образом:Почему оператор Sobel выглядит так?

[-1 0 1] 
[-2 0 2] 
[-1 0 1] 

Я не совсем понимаю 2 вещи о нем,

1.Why центра пикселя ? Не могу я просто использовать оператора, как показано ниже,

[-1 1] 
[-1 1] 
[-1 1] 

2. Почему центральный ряд в 2 раза больше других строк?

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

ответ

47

В компьютерном зрении очень часто нет идеального универсального способа сделать что-то. Чаще всего мы просто пытаемся найти оператора, увидеть его результаты и проверить, соответствуют ли они нашим потребностям. Это справедливо и для вычисления градиента: оператор Sobel является одним из многих способов вычисления градиента изображения, который доказал свою полезность во многих случаях.

В самом деле, простой оператор градиента мы могли думать даже проще, чем тот, который вы предложить выше:

[-1 1] 

Несмотря на свою простоту, этот оператор имеет первую проблему: когда вы используете его, вы вычисляете градиент между двух позиций, а не на одной позиции. Если вы примените его к 2 пикселям (x,y) и (x+1,y), вы вычислили градиент в позиции (x,y) или (x+1,y)? Фактически, вы вычислили градиент в позиции (x+0.5,y), а работа с половинчатыми пикселями не очень удобна. Именно поэтому мы добавляем ноль в середине:

[-1 0 1] 

Применяя эту к пикселям (x-1,y), (x,y) и (x+1,y) ясно даст вам градиент для центрального пикселя (x,y).

Этот также можно рассматривать как свертки двух [-1 1] фильтров: [-1 1 0], который вычисляет градиент в положении (x-0.5,y), слева от пикселя, и [0 -1 1], который вычисляет градиент справа от пикселя.

Теперь этот фильтр по-прежнему имеет еще один недостаток: он очень чувствителен к шуму. Именно поэтому мы решили не применять его на одной строке пикселей, но на 3-х строк: это позволяет получить средний градиент на этих 3-х строк, которые будут смягчать возможные помехи:

[-1 0 1] 
[-1 0 1] 
[-1 0 1] 

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

[-1 0 1] 
[-2 0 2] 
[-1 0 1] 

манипуляции с коэффициентами может привести к другим операторам градиентных таких как оператор ScHARR, который дает только немного больше вес в среднем ряду:

[-3 0 3 ] 
[-10 0 10] 
[-3 0 3 ] 

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

+0

Большое вам спасибо за подробный ответ. – Alcott

+1

* «Только ваше воображение - это предел для создания новых, если это соответствует вашим потребностям ...» * - +1. – rayryeng

14

EDIT Истинная причина того, что оператор Собела выглядит таким образом можно быть найдены путем чтения an interesting article by Sobel himself. Мой быстрый просмотр этой статьи показывает, что идея Собела состояла в том, чтобы получить улучшенную оценку градиента, усредняя горизонтальные, вертикальные и диагональные центральные различия. Теперь, когда вы разбиваете градиент на вертикальные и горизонтальные компоненты, диагональные центральные различия в них включены, в то время как вертикальные и горизонтальные центральные различия включены только в один. Два избежать двойного подсчет диагоналей должен поэтому иметь половину веса по вертикали и горизонтали. Фактические веса 1 и 2 равны , удобные для арифметики с фиксированной точкой (и фактически включают шкалу коэффициент 16).

Я согласен с @mbrenon в основном, но в комментарии есть слишком сложные моменты.

Во-первых, в компьютерном зрении подход «Чаще всего, мы просто пытаемся использовать оператора» просто тратит время и дает плохие результаты по сравнению с тем, что могло быть достигнуто. (Тем не менее, мне нравится экспериментировать.)

Это правда, что хорошей причиной для использования [-1 0 1] является то, что он центрирует производную оценку в пикселе. Но еще одна веская причина заключается в том, что это формула central difference, и вы можете математически доказать, что она дает более низкую ошибку в ее estmate истинного деривата, чем [-1 1].

[1 2 1] Используется для фильтрации шума, как mbrenon, сказал. Причина, по которой эти конкретные числа хорошо работают, заключается в том, что они являются аппроксимацией гауссова, который является только фильтром, который не вводит артефакты (хотя из статьи Собела это похоже на совпадение). Теперь, если вы хотите уменьшить шум, и вы находите горизонтальную производную, которую вы хотите фильтровать в вертикальном направлении, чтобы в меньшей степени повлиять на оценку деривации. Соединив transpose([1 2 1]) с [-1 0 1], мы получаем оператор Собеля. то есть:

[1]   [-1 0 1] 
[2]*[-1 0 1] = [-2 0 2] 
[1]   [-1 0 1] 
+0

Спасибо за цитату! –

2

Для 2D-изображения вам нужна маска. Скажем эта маска:

[ a11 a12 a13; 
    a21 a22 a23; 
    a31 a32 a33 ] 

Df_x (градиент вдоль х) должны быть изготовлены из Df_y (градиент вдоль у) при повороте на 90o, т.е.маска должна быть:

[ a11 a12 a11; 
    a21 a22 a21; 
    a31 a32 a31 ] 

Теперь, если мы хотим, чтобы вычитать сигнал в передней части среднего пикселя (тот, что дифференциация в дискретном - вычитанием) мы хотим выделить те же веса на обе стороны вычитанием, то есть наш маска становится:

[ a11 a12 a11; 
    a21 a22 a21; 
    -a11 -a12 -a11 ] 

Далее, сумма весов должна быть равна нулю, потому что, когда мы имеем сглаженное изображение (например, все 255s) мы хотим иметь нулевой ответ, то есть мы получаем:

[ a11 a12 a11; 
    a21 -2a21 a21; 
    -a31 -a12 -a31 ] 

В случае гладкого изображения мы ожидаем, что дифференцирование вдоль оси Х для производства нуля, то есть:

[ a11 a12 a11; 
    0 0 0; 
    -a31 -a12 -a31 ] 

Наконец, если мы нормализуем получит:

[ 1 A 1; 
    0 0 0; 
    -1 -A -1 ] 

и вы можете установить все, что вы хотите экспериментально. Коэффициент 2 дает исходный фильтр Собеля.

Смежные вопросы