Я выполнил обнаружение кромок на изображениях (с Python 2-7 и OpenCV 3.2) и получил результаты, подобные следующему изображению, т.е. края с одним пикселем не обязательно закрыты (могут иметь «свободные» заканчивается "), а также с возможными отверстиями:Эффективный способ вычисления наклонов краевых линий
Теперь я хотел бы получить„производное“из этих краев, что означает„наклон“в каждой точке, как показано в следующем изображении:
На данный момент единственный способ, которым мне удалось это сделать, очень локально. Для каждой точки ребра (красным цветом в следующем «увеличенном» изображении) я создаю вокруг него круг (розовым), маскируем круг с краем, чтобы получить соседние красные точки, а затем вычислить наклон этих двух соседей.
Однако, это может быть довольно грязно, если края имеют отверстия (которые они часто делают) или близки к другим краям (которые они часто являются) и маскирующие все точки довольно интенсивных вычислений, так что я интересно, есть ли лучший способ.
Моя первая мысль была сплайн-интерполяция, но вы должны дать в качестве входных данных список заказал очков, которые вы не можете иметь для данного края, если вы не используете пиксельный соседа алгоритм отслеживания, который также может получить довольно грязно в случае не очень хороших ребер.
Я также думал о findContours, но для этого нужны замкнутые края, иначе он дает контур края с одним пикселем, т. Е. Две линии по обе стороны от краев, начинается в произвольном месте на краю, короче говоря, это беспорядок.
Есть ли более чистый и эффективный способ, чем мой фактический метод для достижения того, что я хочу? Имеет ли OpenCV какие-либо ресурсы или выполняет свою работу после обнаружения края (я думаю, что последнее более вероятно!)?
P.S. : «Я не думаю, что есть лучший способ» - это ответ, который я готов принять!
проще всего представлять ваши объекты в виде контуров, но, как вы сказали, ваши объекты могут иметь дыры и, возможно, очень сложно представить их как «подключенный» контур. – Micka
Спасибо за ваш ответ. Даже без отверстий мои объекты не обязательно закрыты, они в основном являются свободными краями. И findContours() поэтому не помогает. Я отредактировал свой вопрос, чтобы принять это во внимание. – Soltius
вы все равно можете представить сегменты кривой «контур» (упорядоченный список позиций точек вдоль кривой), но вам придется их вычислять по-разному (а не findContours). после этого вычисление наклона становится простым и, возможно, в целом более эффективным. Но все же существует проблема группировки ребер на сегменты кривой ... – Micka