Я хочу найти острые края на изображении карты высот, игнорируя мелкие края.
OpenCV предлагает несколько подходов к поиску границ в 2D-изображении: Кэнни, Собел, и т. д..
Однако все эти подходы работают путем сравнения значений интенсивности с обеих сторон края. Если 2D-изображение представляет собой карту высот 3D-объекта, это приводит к странному поведению.
На карте высот высота 3D-объекта в заданной координате X/Y представлена как интенсивность 2D-пикселя в этой координате X/Y:
На изображении выше на краю B
интенсивность меняется лишь незначительно между левой и правой стороной, даже если это острый угол.
На краю A
наблюдается большая разница в интенсивности между пикселями на левой стороне края и справа, даже если это всего лишь небольшой угол.
Таким образом, для Кэнни или Собеля не существует порога, который бы сохранял острый край, но отфильтровывал поверхностный край.
(В приведенном выше примере ребро B
имеет одну сторону с восходящим уклоном и одну сторону с нисходящим уклоном. Я мог бы отфильтровать этот объект, но при этом также были бы удалены ребра C
и D
)
Как получить бинарное изображение ребра, содержащее только ребра выше определенного угла? (например, ребро B
, C
и D
, но не A
)
Или, альтернативно, как я могу получить производное изображение градиента, где интенсивность каждого пикселя пропорциональна углу края в этом пикселе?