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

Работа с контурами

Recommended Posts

Может это будет интересно, картинки интересные, правда немного по-японски :), но это мак кого сейчас останавливает.

http://echinocactus.blogspot.com/2009_02_01_archive.html

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


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

ну в итоге я пользуюсь Zhang-Suen algorithm для скелетизации, это помогает в плане того, что не надо работать с толщиной, но потом то все равно надо как то обрабатывать, хотя бы как то спрямить линии.

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

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

+ еще коментарии не отображаются нормально.

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

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


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

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


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

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


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

ну там не та векторизация.

вот еще нашел http://faculty.nps.edu/ncrowe/oldstudents/cardosothesis.htm

но такое ощущение, что все это пляски с бубном.

вот еще нечто похожее на интересное, но там вроде заранее надо знать форму объекта.

http://users.ntua.gr/karank/Demos/2D.htm

т.е. детектор границ никак не будет нормально работать, если не знает чего мы хотим на этой картинке найти.

я сейчас филтьтрую,делаю otsu threshold, потом скелет делаю чтобы получить однопиксельные границы(вот это я может делаю зря, ибо возможно можно как то блобы сразу преобразовать в линии) , потом эти границы я фильтрую и связанные отрезки заменяю на ортогональные линии (хотя по-хорошему то их надо заменять наклонными линями, т.к. линии у меня действительно немного наклонные(0.3-0.5 град))

постоянные проблемы с маленькими элементами и с разрывами.

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


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

+ еще бывает, что контуры как бы немного округлые у углов.

вообщем вот эти картинки должны быть квадратами.

image.png

image.png

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


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

при применении детектора границ Кении не всегда выделаются все границы (рис1).

post-4987-0-87395500-1332668129_thumb.jp

тогда я решил использовать dilate в несколько итераций(рис2) как видно, пол определился относительно нормально.

post-4987-0-06431800-1332668135_thumb.jp

теперь нужно применить erode так, чтобы изменения, привнесенные dilate, были устранены: линии стали тоньше.

но erode не дает нужного эффекта(рис3).

post-4987-0-87983200-1332668139_thumb.jp

мне нужно чтобы после erode оставалась линия толщиной минимум в 1 пиксель. тогда все будет камильфо.

что же делать?

возможно есть другие подходы?

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


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

Можно попробовать определять границы при помощи вейвлет-преобразования:

http://www.nbuv.gov.ua/portal/natural/Vkhdtu/2009_1/01_fundamentalnie_nauki.htm

там статья (чтобы посмотреть результат)

СЕГМЕНТАЦИЯ КОМПЬЮТЕРНЫХ ТОМОГРАММ НА ОСНОВЕ

ВЕЙВЛЕТ-ПРЕОБРАЗОВАНИЯ

или еще интересный подход:

http://www.svgopen.org/2007/papers/RaveGrid/index.html

  • Like 1

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


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

интересует лишь то что реализовано в opencv, либо самые простейшие алгоритмы

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


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

Вот тут есть готовая реализация вейвлет-преобразования, если интересно.

http://www.compvision.ru/forum/index.php?showtopic=734

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


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

можно делать не erode, a скелетонизацию или что то самописное.

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

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

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

п.с. какое преимущество от вейвлетов?

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


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

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

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

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

как вариант, использовать findcontours, и там все просто. позже попробую

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


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

Так навскидку не скажу, просто видел результаты работы, визуально мне они больше нравятся.

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


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

можно как-нибудь сделать противоположное эквализации: нужно более темные и более светлые участки сделать однотипными.

еще: есть ли готовый алгоритм постеризации?

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


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

Сегментация Вам нужна.

Например, meanshift сегментация (в примерах есть).

ms_results.thumbnail.jpg

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


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

эта сегментация очень медленная. к тому же на границах появляются много "несегментированных" пикселей. watershed требует предварительных маркеров.

возможно нужна предобработка? я делал blur (5). можно ли применить ее на серое изображение? (не получилось)

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


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

что-то не понимаю что означают пороги у этой функции?

немного поигрался, мне кажется рез-т намного хуже чем у meanshift.

в принципе, если уменьшить изображение и применять meanshift, то рез-т неплох, но проблема в другом: у камеры нужно вручную настраивать яркость, контрастность и тд. я это делаю на глаз, и не всегда получается оптимально. т.е. для каждого изображения нужно подбирать параметры для meanshift вручную. а т.к. работает она долго, это может занять слишком много времени. к тому же программа претендует на некоторую самостоятельную работу.

но это конечно гораздо круче чем то что я предлагал делать dilate :)

можно ли как-то автоматически подгонять яркость и тд к заданным параметрам?

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


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

По поводу скорости, вроде есть версия meanshift для GPU.

Для улучшения контрастности можно попробовать

cvEqualizeHist

Тут пример использования:

http://dasl.mem.drexel.edu/~noahKuntz/openCVTut5.html

opencvtut5-3.png

PS: А что такое "заданные параметры" и чему они равны?

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


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

нужно согласовать параметры meanshift с парамтерами картинки так, чтобы сегментация выполнилась качественно за 1 раз . если не получается, что-то поменять, и за 2-3 уж точно.

т.е. все картинки приводить к каким-то параметрам яркости, контрастности и уже для них подобрать параметры meanshift.

эквализация делает не совсем то, мне кажется.

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


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

Что это значит для компьютера?

сегментация выполнилась качественно

Попробуйте определить это строго.

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


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

Что это значит для компьютера?

Попробуйте определить это строго.

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

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

нужно грубо говоря "автовыравнивание яркости". что-то вроде. может быть не только яркости.

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


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

Тогда, вероятно стоит посмотреть здесь:

http://www.compvision.ru/forum/index.php?showtopic=818

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


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

Продолжу тему с моментами в Opencv.

Допустим, есть две матрицы 8х8 с числами от 0 до 255.

Задача - вычислить моменты такой матрицы и сравнить их.


Mat M_Block_yPrev(8,8,CV_8UC1);

Moments moments_Block_yPrev = moments(M_Block_yPrev,false);

double Hu_moments_Block_yPrev[7];

HuMoments(moments_Block_yPrev,Hu_moments_Block_yPrev);

В moments_Block_yPrev и Hu_moments_Block_yPrev я получу данные.

Для второй матрицы - аналогично.

Теперь, каким образом сравнить моменты двух матриц с помощью matchShapes() ?

Спасибо.

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


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

что за матрица 8х8? моменты вычисляются для контуров же

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×