Обнаружение прямой линии по изображению
Я делаю проект, который обнаруживает дыры в дороге. Я использую лазер для излучения луча на дороге, а камеру - для съемки дороги. изображение может быть таким
Теперь я хочу обработать это изображение и дать результат, прямо или нет. если он кривой, то насколько большой кривой. Я не понимаю, как это сделать. Я много искал, но не могу найти подходящий результат. Может ли кто-нибудь помочь мне в этом?
4 ответа
Есть несколько разных способов измерения прямолинейности линии. Поскольку ваш вопрос довольно расплывчатый, невозможно сказать, что подойдет вам лучше всего.
Но вот мое предложение:
Используйте линейную регрессию, чтобы рассчитать наиболее подходящую прямую линию через ваши точки, затем вычислите среднеквадратичное расстояние каждой точки от этой линии (более прямые линии дадут меньшие результаты).
Это довольно сложно, и ваш вопрос очень широкий, но давайте попробуем:
Возможно, вам нужно идентифицировать точки на пиксельном изображении. Есть несколько вариантов сделать это, но я бы сгладил изображение с помощью фильтра размытия и затем нашел бы больше красных пикселей (которые, как полагают, являются центрами точек). Сохраните эти координаты в векторном массиве (массив х раз у).
Я бы использовал сплайн-интерполяцию между точками. Таким образом, можно просто получить локальный вывод кривой, касающейся каждой точки.
Если максимум первого деривации мал, точки находятся в линии. Если вы считаете, что точки принадлежат одной кривой, второй вывод - это ваша кривизна.
Для 1. Вы также можете полагаться на некоторые библиотеки, специализирующиеся на обработке изображений (это часть обработки ваших задач). Одна из таких библиотек - opencv.
Для 2. Я бы использовал математический инструментарий, либо октаву, либо математическую библиотеку для родного языка.
Возможно, вам придется прочитать эту статью, она так интересна, чтобы решить вашу проблему
Как предложил @urzeit, вы должны сначала найти точки как можно точнее. На самом деле нет никакого способа дать хороший совет по этому поводу, не видя реальных картинок, за исключением, может быть: постараться сделать задачу максимально простой для себя. Например, если вы можете установить камеру на очень короткое время затвора (микросекунды, если это возможно) и одновременно сконцентрировать энергию лазера, "фон" будет вносить меньше энергии в яркость изображения, а лазерные пятна будут просто быть яркими пятнами на темном фоне.
Измерение линейности должно быть простым, хотя: "Линейность" - это просто другое слово для "линейной корреляции". Таким образом, вы можете просто рассчитать соотношение между значениями X и Y. Как показывают изображения на связанной странице википедии, корреляция =1 означает, что все точки находятся на одной линии.
Если вы хотите фактическую линию, вы можете просто использовать Total Least Squares.