Smorodov 579 Жалоба Опубликовано May 27, 2012 Продолжая тему фильтров Габора, допилил текстурный сегментатор до рабочего состояния.GaborTextureSegmentation.rar Годится не на все случаи жизни, но в некоторых задачах вещь весьма полезная. Я использовал кластеризацию k-means, количество кластеров задается вторым параметром функции: SegmentImage(img,2,labels); Метки кластеров хранятся в матрице labels. Вот результат работы программы при количестве кластеров равном 6. Вход: Выход (метки): Если нужно обучить программу узнавать какой-нибудь определенный тип текстуры, а не просто различать их, нужно обучить какой-нибудь классификатор (SVM например), подсовывая ему в качестве обучающих пар вектор Descriptors и метку класса. Аналогично тому что сделано в этой теме http://www.compvision.ru/forum/index.php?showtopic=861 (10 пост), только вместо трехмерного цвета, будет 40 мерный Descriptors. 2 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 28, 2012 не очень понятно как это работает. фильтры габора это типа как у хаара фиксированный набор фильтров и для каждой точки изображения мы можем посчитать вектор признаков длиной 40? потом загнать это в классификатор? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 28, 2012 Так и есть, фильтр Габора позволяет охарактеризовать пространственную структуру изображения. Природа фильтра вейвлетная. Выявлено, что первые слои нейронов человеческого мозга, обрабатывающих зрительную информацию, выдают отклик, очень похожий на отклик банка фильтров Габора. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано June 6, 2012 в продолжении темы еще есть некие learned filters, т.е.они не заданы жестко заранее, а как бы обучаются по данным. хотя это немного не в ту тему(но зато тоже про фильтры), но на текстуры наверно тоже можно обучить. http://www.cs.nyu.edu/~yann/research/deep/ да оказывается это еще называется sparse code или sparse coding 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 6, 2012 Интересные ссылки, с первого взгляда напоминает метод Bag of words, где на первой стадии все объекты пропускаются через детектор особенностей, найденные особенности сваливаются в одну кучу, затем кластеризуются (выделяются центры). Таким образом формируется словарь. На второй стадии идет обучение с учителем. Опять пропускаем все объекты через детектор признаков, но теперь по классам, и для каждого класса строим гистограмму признаков (находим признак, определяем к какому кластеру он принадлежит, и добавляем в соответствующий этому кластеру столбец). В результате получаем гистограммы признаков, по которым можно достаточно точно определить принадлежность объекта. На стадии распознавания находим признаки, составляем гистограмму, сравниваем гистограмму с имеющейся базой. SPARSE CODING: http://ai.stanford.edu/~hllee/nips06-sparsecoding.pdf http://people.seas.harvard.edu/~igkiou/sparseldr.html И еще один текстурный сегментатор на основе фильтра Габора (документация и матлабовские исходники): http://cvsp.cs.ntua.gr/software/texture/ Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано July 24, 2012 http://habrahabr.ru/post/146077/#habracut http://habrahabr.ru/post/134950/ продолжение темы про unsupervised learning и spatial autoencoder self-taught learning Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано August 22, 2012 можно определить фильтр габора для точки не просчитывая всё изображение? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано August 22, 2012 немного поправил код для отрисовки. CvScalar random_color(CvRNG* rng) { int color = cvRandInt(rng); return CV_RGB(color&255, (color>>8)&255, (color>>16)&255); } CvRNG rng(35435345); CvScalar Colors[256]; for (int i=0;i<256;i++) { Colors[i]=random_color(&rng); } for(int i=0;i<img.rows;i++) { for(int j=0;j<img.cols;j++) { result.at<Vec3b>(i,j)[0]+=Colors[labels.at<int>(i,j)].val[0]; result.at<Vec3b>(i,j)[1]+=Colors[labels.at<int>(i,j)].val[1]; result.at<Vec3b>(i,j)[2]+=Colors[labels.at<int>(i,j)].val[2]; } } хотя похоже он не правильно работает, там нет защиты от 255 переполнения, зато получается красиво. for(int i=0;i<img.rows;i++) { for(int j=0;j<img.cols;j++) { result.at<Vec3b>(i,j)[0]=Colors[labels.at<int>(i,j)].val[0]; result.at<Vec3b>(i,j)[1]=Colors[labels.at<int>(i,j)].val[1]; result.at<Vec3b>(i,j)[2]=Colors[labels.at<int>(i,j)].val[2]; } } так норм но без картинки оригинальной. надо бы прикрутить еще SVM Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано August 22, 2012 http://www.stat.ucla.edu/~zzsi/ABEllipsoid/AER.html вот еще интересная вещь 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах