WedX - журнал о программировании и компьютерных науках

Извлечение однолинейных контуров из ребер Canny

Я хотел бы извлечь контуры изображения, выраженные в виде последовательности координат точек.

С помощью Canny я могу создать бинарное изображение, содержащее только края изображения. Затем я пытаюсь использовать findContours для извлечения контуров. Однако результаты не в порядке.

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

Я просмотрел документацию OpenCV, но не смог найти ничего полезного, но я думаю, что я не первый с подобной проблемой. Есть ли какая-либо функция или метод, который я мог бы использовать?

Вот код Python, который я написал до сих пор:

def main():
    img = cv2.imread("lena-mono.png", 0)

    if img is None:
        raise Exception("Error while loading the image")

    canny_img = cv2.Canny(img, 80, 150)

    contours, hierarchy = cv2.findContours(canny_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    contours_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

    scale = 10
    contours_img = cv2.resize(contours_img, (0, 0), fx=scale, fy=scale)

    for cnt in contours:
        color = np.random.randint(0, 255, (3)).tolist()
        cv2.drawContours(contours_img,[cnt*scale], 0, color, 1)

    cv2.imwrite("canny.png", canny_img)
    cv2.imwrite("contours.png", contours_img)

Масштабный коэффициент используется для выделения двойных линий контуров. Вот ссылки на изображения:

  • Лена оттенки серого
  • Ребра, извлеченные с помощью Canny
  • Контуры: 10-кратное увеличение, где вы можете видеть неправильно результаты, созданные findContours

Любое предложение будет принята с благодарностью.


  • вы должны использовать HoughLines docs.opencv.org/modules/imgproc/doc/ 06.08.2013
  • размыть изображение, чтобы уменьшить шум 06.08.2013
  • Не думаю, что дело в шуме на изображении. Если вы посмотрите на края, извлеченные с помощью Canny, они в порядке. С HoughLines я бы не смог обрабатывать изогнутые линии на изображении, не так ли? 06.08.2013
  • да, конечно, у houghlines есть некоторые параметры, с которыми вы должны поиграть и найти нужный формат, так как для кривых вы получите несколько линий! линии - это в основном начальная и конечная точка! мы работаем с определением полосы движения на дороге, и это то, что мы также используем. 06.08.2013

Ответы:


1

Если я вас правильно понял, ваш вопрос не имеет ничего общего с поиском линий в параметрическом смысле (преобразование Хафа).

Скорее, это проблема метода findContours, возвращающего несколько контуров для одной линии.

Это связано с тем, что Canny является детектором краев, то есть фильтром, настроенным на градиент интенсивности изображения, возникающий по обеим сторонам линии.

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

Это довольно распространенная тема - и вот предыдущий пост, в котором предлагалось одно решение:

OpenCV, преобразующий ребра Canny в контуры

06.08.2014
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]