Какая польза от Canny до HoughLines (opencv)? - PullRequest
25 голосов
/ 16 февраля 2012

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

2 из прочитанных мной руководств:

  1. Обнаружение Imgproc Feature
  2. Преобразование линии Хафа

Ответы [ 4 ]

11 голосов
/ 16 февраля 2012

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

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

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

Ограничения Преобразования Хафа более подробно описаны в Википедии.

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

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

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

11 голосов
/ 16 февраля 2012

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

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

преобразование Хафа

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

3 голосов
/ 20 декабря 2012

Теоретически, вы правы.Поиск алгоритмов не обязательно необходим для работы алгоритма линии Хафа.

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

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

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

0 голосов
/ 16 февраля 2012

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

сложных данных -> (двоичные данные, b двоичных данных, c двоичных данных, ..) (с использованием canny (), sobel () и т. Д.)

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

b двоичные данные -> function2 ()

c двоичные данные -> function3 () ..

двоичные данные -X-> function2 () ..

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

HTH

...