Подавление Non-max
мы узнали, что вы можете получить направление градиента с atan(dy/dx)
которое является направлением, ортогональным краю.
Теперь у нас было домашнее задание, где мы должны были дискретизировать это направление на четыре класса (X-и y-направление и обе диагонали), а затем проверить обоих соседей пикселей в лучшем направлении соответствия для подавление non-max.
Я не полностью получил решение. Очевидно, нас было четверо. случаи:
abs(angle) < pi/8
, поэтому градиент (грубо) указывает в направлении x, поэтому мы проверяемimg(i, j-1)
иimg(i, j+1)
(предполагая, что начало изображения находится в левом верхнем углу)angle > pi/8 && angle <= 3*pi/8
, поэтому градиент указывает на верхний правый. Теперь я подумал, что нам нужно проверитьimg(i-1, j+1)
иimg(i+1, j-1)
но вместо этого мы проверяемimg(i-1, j-1)
иimg(i+1, j+1)
что похоже на ортогональную диагональ.
два других случая эквивалентны. Я пытался измените это, но тогда края действительно выглядят странно, поэтому это кажется правильным, но я не понимаю, почему.
может кто-нибудь объяснить это мне?
3 ответов
non-max подавление является способом устранения точек, которые не лежат в важных краях. В первом случае, если градиент близок к нулю градусов в данной точке, это означает, что край находится к северу или к югу, и эта точка будет считаться на краю, если величина этой точки больше, чем обе величины точек слева и справа (как в вашем примере). Во втором случае вы проверяете градиент на 45 градусов, поэтому край находится на 135 градусах, и таким образом, вы сохраняете точку, если она больше точек вдоль направления градиента, т. е. (-1, -1) и (1, 1). Вращение системы координат на это не влияет.
вот реализация python Подавление Не Максимумов использованный в Canny процессе обнаружения края.
надеюсь, это поможет кому-то, кто нуждается в NMS для поиска лучшего края.
может опоздать на исходный вопрос, но следующая ссылка может помочь любому, кто пытается понять не-максимальное подавление.