Да, используя классифицирующие операторы Собеля. Давайте попробуем понять, что вы здесь делаете:
Оператор Собеля для обнаружения вертикальных линий выглядит так:
[-1 0 1
-2 0 2
-1 0 1]
Если вы примените это к пикселю (поместите это поверх пикселя и используйте значения в соседних пикселях, а затем сложите все), оно будет иметь ненулевое значение только в том случае, если пиксели справа имеют разные значения, как пиксели в левый. Если это так, значит, есть вертикальный край.
Далее 45-градусный оператор Собеля:
[-2 -1 0
-1 0 1
0 1 2]
Если вы поняли, как работает вертикальный, это должно быть легко понять. самые большие значения будут иметь место, когда диагональ этой матрицы имеет разные значения, таким образом, край 45 градусов.
Прежде чем продолжить, давайте отметим одну вещь, упомянутую @ImanolLuengo в комментариях: 45-градусный оператор Собеля фактически увидит 30-градусный наклон, он просто даст ему меньшее значение. Это улучшит его меньше. Вы можете проверить это самостоятельно, если хотите.
Теперь, с матрицей 3x3, вы можете видеть, что будет довольно сложно получить 30-градусное преимущество, в основном потому, что тот факт, что ядро, которое мы используем, незаметное и маленькое (3x3), не позволяет нам создать питомник, который усиливает другие углы.
Однако, используя ту же логику, что и в операторе Собеля, мы можем думать о ядре большего размера, которое может увеличить любой произвольный угол.
Например, следующее ядро в основном улучшит 30 градусов:
[1 1 1 1 0
1 1 0 0 0
0 0 0 -1 -1
0 -1 -1 -1 -1]
Это «ручное приближение ядра», потому что, как вы заметили в Sobel, некоторые элементы ядра имеют большие числа, чем другие. Правило для этих чисел: более высокое значение в направлении края, которое вы хотите обнаружить, и более высокое значение в тех, которые на самом деле проходят через центр ядра.
Это не будет оператор Собеля, но вы можете просто составить любое ядро, которое будет выполнять ту работу, которую вы хотите.
person
Ander Biguri
schedule
14.12.2016
Gx
иGy
, а не диагональные операторы Собеля, и вы делаетеatan2(Gx/Gy)
, как предлагает Иманол, то у вас могут быть проблемы с плавающей запятой/целым числом. - person Ander Biguri   schedule 14.12.2016