Какое использование Canny перед HoughLines (opencv)?
Я новичок в обработке изображений, и я работаю над обнаружением строк в документе. Я прочитал теорию преобразования линии Hough, но я не понимаю, почему я должен использовать Canny, прежде чем называть эту функцию в opencv, как говорится во многих учебниках. Какова точка поиска ребер в этом случае? Дело в том, что если я не использую Canny или порог перед HoughLines(), результаты будут очень грязными. Я надеюсь, что кто-то объяснит мне причину, почему.
2 учебных пособий, которые я прочитал:
Ответы
Ответ 1
Короткий ответ
cvCanny используется для обнаружения краев, а также для увеличения контраста и устранения шума изображения.
HoughLines, использующий преобразование Hough, используется для определения того, являются ли эти ребра линиями или нет. Hough Transform требует, чтобы ребра были хорошо распознаны, чтобы быть эффективными и предоставлять результаты.
Длинный ответ
Ограничения Hough Transform описаны более подробно в Википедии.
Эффективность преобразования Hough зависит от того, что бункер accuctumated pixel отличается, например. прямой контраст между пикселем и окружающими его соседями или при использовании области маски область пикселей и ее окружающие области. Если бы все пиксели имели похожие значения, то ничто не выделялось бы как линия или круг. Это приводит к уменьшению цвета (цвет в оттенки серого, оттенки серого до черного и белого), чтобы увеличить контракт.
Количество параметров для преобразования Hough также увеличивает распространение голосов в ячейках пикселей и увеличивает сложность преобразования, а это означает, что обычно только линии или круги надежно обнаруживаются с использованием, так как они имеют менее 3 параметров.
Края должны быть обнаружены задолго до запуска преобразования Хафа, иначе его эффективность будет еще больше. Также шумные изображения не очень хорошо работают с преобразованием Hough, если только шум не удаляется перед началом работы.
Ответ 2
Прежде всего, чтобы обнаружить линии, которые вам нужно использовать для матричного изображения boolean
(или двоичного), я имею в виду: цвет черный или белый, нет оттенков серого.
HoughLines()
Требование к правильной работе - иметь такой вид изображения в качестве входного. Это причина, по которой вам нужно использовать Canny
или Treshold
, чтобы преобразовать матрицу цветного изображения в логическую.
Преобразование hough
Линия на одном снимке на самом деле является краем. Преобразование Hough сканирует все изображение и использует преобразование, которое преобразует все белые пиксельные декартовы координаты в полярных координатах; черные пиксели не учитываются. Таким образом, вы не сможете получить строку, если сначала не обнаруживаете ребра, потому что HoughLines()
не знает, как вести себя, когда есть оттенки серого.
Ответ 3
Теоретически, вы правы. Поиск ребер не является абсолютно необходимым для работы алгоритма Hough Line.
То, как работает Хью, в основном, берет каждую точку и связывает ее со всеми остальными точками, и в тех точках, которые имеют большинство линий, проходящих через них, эти линии остаются. Для этого нам нужны точки. The Canny создает эти точки. Теоретически вы можете использовать любой вид фильтра - изолировать все синие или фиолетовые точки и соединить их, что угодно, но края работают хорошо.
Хью также не взвешивает свои линии или точки. Для Hough изображение является двоичным - состоящим из 1 или 0 точек или точек. Нет необходимости в оттенках серого, и canny удобно возвращает двоичные изображения.
Таким образом, Canny всегда является частью Hough.
Ответ 4
все относится к обработке двоичных данных,
сложные данные → (двоичные данные, b двоичные данные, c двоичные данные,..) (с использованием canny(), sobel() и т.д.)
двоичные данные → function1() (используя houghlines())
b двоичные данные → function2()
c двоичные данные → function3()..
двоичные данные -X- > function2()..
сложные данные -X- > function1()..
НТН