Перейти к содержимому
Compvision.ru
mrgloom

более интеллектуальные детекторы линий

Recommended Posts

наткнулся на статью об разных методах позволяющих выделить линии лучше чем преобразование Хафа.

line segment detector (LSD)

http://www.ipol.im/pub/algo/gjmr_line_segment_detector/

там есть код, демо и сравнение с другими алгоритмами.

Hough transform method

Burns method

Desolneux method

Etemadi method

Multisegment detection

видимо т.к. использует канни, получаются двойные границы.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо интересный сайт.

То что находит по 2 линии, связано с тем, что определяется перпендикуляр к градиенту яркости. А у каждой линии (не идеальной), имеется четыре таких перепада. И тут еще вопрос: что считаем линией? Если нарисованный на экране отрезок, то 2 (4) границы, или границу какого-то объекта, то 1 граница.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
LSD is aimed at detecting locally straight contours on images. This is what we call line segments.

и там даже выдается не столько линия, сколько прямоугольник который имеет толщину.

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

у алгоритма оказалось аж 9 параметров, но и на полном дефолте хорошо работает.

но получается много разрывных линий и главный вопрос как их потом использовать?

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

image.png

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я как-то переводил кусок одной книги касающийся проблемы группировки отрезков:

http://www.compvision.ru/forum/index.php?app=core&module=attach&section=attach&attach_id=89

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

+более интеллектуальные edge detectors

http://www.icgst.com/gvip/Volume6/Issue4/p1150649005.pdf

Boie-Cox edge detector

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.896

Canny Canny edge detector uses smoothing before edge detection and thresholding.

Frei

Kirsch Performs convolution with 8 masks calculating gradients.

Marr (Marr-Hildreth) edge detector. Performs two convolutions with Laplacian of Gaussian and then detects zero crossings.

Prewitt Calculates the Prewitt compass gradient filters. Returns the result for the largest filter response.

Roberts calculates the square root of the magnitude squared of the convolution with the Robert's row and column edge detectors.

Shen (Shen-Castan) optimized edge detector. Supposed to be effective in the presence of noise.

Sobel Sobel edge detector using convolutions with row and column edge gradient masks.

Детектор Канни-Дерише (Derish)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

есть какие то алгоритмы или соображения для выделения только горизонтальных и вертикальных линий? возможно с некоторой погрешностью в смысле небольшое отклонение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Построить уравнение прямой и посмотреть на коэффициенты?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну это только позволяет отсеить ненужные.

не знаю может пройтись edge detector' ом каким либо и потом объединить\апроксимировать каким либо образом в горизонтальные\вертикальные линии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно попробовать большим ядром (собелем) свернуть по X , найдем частную производную по Х. Затем бинаризация по порогу.

Аналогично с Y.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

пробовал так

	IplImage* dest_dx = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); 

	IplImage* dest_dy = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);

	IplImage* dest = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); 


	/*create temp images*/ 

	IplImage* df_dx = cvCreateImage(cvGetSize(src),IPL_DEPTH_16S,1); 

	IplImage* df_dy = cvCreateImage(cvGetSize(src),IPL_DEPTH_16S,1); 


	/* use sobel to find derivatives */ 

	cvSobel( src, df_dx, 1, 0, 3); 

	cvSobel( src, df_dy, 0, 1, 3); 


	/* Convert signed to unsigned 8*/ 

	cvConvertScaleAbs( df_dx , dest_dx, 1, 0); 

	cvConvertScaleAbs( df_dy , dest_dy, 1, 0); 


	cvAdd(dest_dx,dest_dy,dest);

получается очень шумно и куда надо впихивать фильтрацию и какую именно не очень понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

или не надо биться с идеальной бинаризацией? а анализировать на последующих шагах.

в итоге надо что то типа такого

http://www.mmorph.com/mxmorph/html/mmdemos/mmdairport.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×