2012-02-16 5 views
22

Я новичок в обработке изображений, и я работаю над обнаружением линий в изображении документа. Я прочитал теорию преобразования линии Hough, но я не понимаю, почему я должен использовать Canny, прежде чем называть эту функцию в opencv, как говорится во многих учебниках. В чем смысл поиска краев в этом случае? Дело в том, что если я не использую Canny или порог перед HoughLines(), результаты будут очень грязными. Надеюсь, кто-то объяснит мне причину.Какая польза от Canny перед HoughLines (opencv)?

2 из учебников я прочитал:

  1. Imgproc Feature Detection
  2. Hough Line Transform
+0

Просьба предоставить минимальный рабочий пример и ссылку на один из «многих учебников», на которые вы ссылаетесь. – Unapiedra

+1

Спасибо за ссылки! – Unapiedra

ответ

9

Короткий ответ

cvCanny используется для обнаружения краев, а также увеличения контрастности и удаления шумов изображения. HoughLines, который использует преобразование Hough, используется для определения того, являются ли эти ребра линиями или нет. Для преобразования Hough Trans необходимо, чтобы ребра были хорошо распознаны, чтобы быть эффективными и предоставлять результаты.

Длинный ответ

В Ограничения Hough Transform описаны более подробно в Википедии.

Эффективность преобразования Hough зависит от того, что бункер accuctumated pixel отличается, например. прямой контраст между пикселем и окружающими его соседями или при использовании области маски область пикселей и ее окружающие области. Если бы все пиксели имели похожие значения, то ничто не выделялось бы как линия или круг. Это приводит к уменьшению цвета (цвет в оттенки серого, оттенки серого до черного и белого), чтобы увеличить контракт.

Число параметров для преобразования Хафа также увеличивает распространение голосов в ячейках пикселей и увеличивает сложность преобразования, а это означает, что, как правило, только линии или круги надежно обнаруживаются с использованием его, поскольку они имеют менее 3 параметров ,

Края должны быть обнаружены задолго до запуска трансформации Хафа, иначе его эффективность будет еще более высокой. Также шумные изображения не очень хорошо работают с преобразованием Hough, если только шум не будет удален.

+0

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

9

Прежде всего, для обнаружения линий вы должны работать на boolean матрицы изображения (или двоичный) , Я имею в виду: цвет черный или белый, нет оттенки серого.

HoughLines() Требование к правильной работе - иметь такой вид изображения в качестве входного сигнала. Вот почему вы должны использовать Canny или Treshold, чтобы преобразовать цветное изображение изображения в boolean один.

преобразование Hough

Строка в одной картине на самом деле ребро. Преобразование Hough сканирует все изображение и использует преобразование, которое преобразует все белые пиксельные декартовы координаты в полярных координатах; черный пикселей не указано. Таким образом, вы не сможете получить строку, если сначала не обнаруживаете края, потому что HoughLines() не знают, как себя вести, когда есть оттенки серого.

+0

Я получаю это сейчас. Большое вам спасибо: – Risa

-2

все об обработке двоичных данных,

комплекса данных -> (двоичные данные, б двоичных данных, гр двоичных данных, ..) (используя Канне(), Собел(), и т.д.)

двоичные данные -> function1() (с использованием houghlines())

б двоичных данных -> function2()

с двоичными данными -> fUNCTION3() ..

двоичных данные -X -> functi on2() ..

комплекс данных Х-> function1() ..

НТН

1

Теоретически вы правы. Поиск ребер не является абсолютно необходимым для работы алгоритма Hough Line.

То, как работает Хью, в основном, он берет каждую точку и соединяет ее со всеми остальными точками, а любые точки имеют большинство линий, проходящих через них, эти линии остаются. Для этого нам нужны точки. The Canny создает эти точки. Теоретически вы можете использовать любой вид фильтра - изолировать все синие или фиолетовые точки и соединить их, что угодно, но края работают хорошо.

Хью также не имеет веса своих линий или точек. Для Hough изображение является двоичным - состоящим из 1 или 0 точек или точек. Нет необходимости в оттенках серого, и canny удобно возвращает двоичные изображения.

Таким образом, Canny всегда является частью Hough.

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