Подтвердить что ты не робот

Почему оператор Sobel выглядит так?

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

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

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

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

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

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

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

4b9b3361

Ответ 1

В компьютерном видении очень часто нет идеального, универсального способа сделать что-то. Чаще всего мы просто пытаемся найти оператора, увидеть его результаты и проверить, соответствуют ли они нашим потребностям. Это верно и для вычисления градиента: оператор 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 строки: это позволяет получить средний градиент на этих трех строках, что смягчит возможные шумы:

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

Df_x (градиент вдоль x) должен быть получен из Df_y (градиент вдоль 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 ]

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

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

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

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

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