3

Я выполнил обнаружение кромок на изображениях (с Python 2-7 и OpenCV 3.2) и получил результаты, подобные следующему изображению, т.е. края с одним пикселем не обязательно закрыты (могут иметь «свободные» заканчивается "), а также с возможными отверстиями:Эффективный способ вычисления наклонов краевых линий

enter image description here

Теперь я хотел бы получить„производное“из этих краев, что означает„наклон“в каждой точке, как показано в следующем изображении:

enter image description here

На данный момент единственный способ, которым мне удалось это сделать, очень локально. Для каждой точки ребра (красным цветом в следующем «увеличенном» изображении) я создаю вокруг него круг (розовым), маскируем круг с краем, чтобы получить соседние красные точки, а затем вычислить наклон этих двух соседей.

enter image description here

Однако, это может быть довольно грязно, если края имеют отверстия (которые они часто делают) или близки к другим краям (которые они часто являются) и маскирующие все точки довольно интенсивных вычислений, так что я интересно, есть ли лучший способ.

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

Есть ли более чистый и эффективный способ, чем мой фактический метод для достижения того, что я хочу? Имеет ли OpenCV какие-либо ресурсы или выполняет свою работу после обнаружения края (я думаю, что последнее более вероятно!)?

P.S. : «Я не думаю, что есть лучший способ» - это ответ, который я готов принять!

+0

проще всего представлять ваши объекты в виде контуров, но, как вы сказали, ваши объекты могут иметь дыры и, возможно, очень сложно представить их как «подключенный» контур. – Micka

+0

Спасибо за ваш ответ. Даже без отверстий мои объекты не обязательно закрыты, они в основном являются свободными краями. И findContours() поэтому не помогает. Я отредактировал свой вопрос, чтобы принять это во внимание. – Soltius

+0

вы все равно можете представить сегменты кривой «контур» (упорядоченный список позиций точек вдоль кривой), но вам придется их вычислять по-разному (а не findContours). после этого вычисление наклона становится простым и, возможно, в целом более эффективным. Но все же существует проблема группировки ребер на сегменты кривой ... – Micka

ответ

0

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

FindContours выводит упорядоченный список, но, вероятно, не в том порядке, в котором вы нуждаетесь. Он группирует связанные пиксели с приоритетом TOP-DOWN/LEFT-RIGHT. Таким образом, он последовательно перебирает каждую строку, когда он попадает в белый пиксель, он находит первый контур. Таким образом, на вашем изображении первый контур, который он находит, на самом деле тот, что справа, так как он имеет самое близкое к значению 0 Y.

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

Как только у вас есть упорядоченный список, просто выполните интерполяцию отсутствующих пикселей.

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

+1

Я думаю, что вы правы, хотя, как я уже сказал в моем (отредактированном) вопросе, findContour на закрытой 1-пиксельной линии действительно некрасиво. И мои образы не всегда будут таким образом ... Но я лучше понимаю, что проблема сейчас, и что я могу и не могу сделать! – Soltius

+0

Хорошо. В качестве побочного примечания я использовал findContours для описания линий в 1 пиксель и не сталкивался с какой-либо проблемой, я на самом деле использую его для вычисления размеров объектов. Поэтому я не знаю, в чем проблема. Рад, что я мог помочь, приветствия. –

Смежные вопросы