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

Выделение объектов по текстуре (текстурная сегментация)

Recommended Posts

Продолжая тему фильтров Габора, допилил текстурный сегментатор до рабочего состояния.
GaborTextureSegmentation.rar

post-1-0-91968000-1338135926_thumb.jpg
post-1-0-89923400-1338135927_thumb.jpg

Годится не на все случаи жизни, но в некоторых задачах вещь весьма полезная.
Я использовал кластеризацию k-means, количество кластеров задается вторым параметром функции:
SegmentImage(img,2,labels);

Метки кластеров хранятся в матрице labels.

Вот результат работы программы при количестве кластеров равном 6.

Вход:
post-1-0-19022200-1338138657_thumb.jpg
Выход (метки):
post-1-0-85740800-1338138655_thumb.jpg

Если нужно обучить программу узнавать какой-нибудь определенный тип текстуры, а не просто различать их, нужно обучить какой-нибудь классификатор (SVM например), подсовывая ему в качестве обучающих пар вектор Descriptors и метку класса.
Аналогично тому что сделано в этой теме http://www.compvision.ru/forum/index.php?showtopic=861
(10 пост), только вместо трехмерного цвета, будет 40 мерный Descriptors.

  • Like 2

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


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

не очень понятно как это работает.

фильтры габора это типа как у хаара фиксированный набор фильтров и для каждой точки изображения мы можем посчитать вектор признаков длиной 40?

потом загнать это в классификатор?

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


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

Так и есть, фильтр Габора позволяет охарактеризовать пространственную структуру изображения. Природа фильтра вейвлетная.

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

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


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

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

хотя это немного не в ту тему(но зато тоже про фильтры), но на текстуры наверно тоже можно обучить.

http://www.cs.nyu.edu/~yann/research/deep/

да оказывается это еще называется sparse code или sparse coding

sparsecoding_ng.png?w=640&h=479

  • Like 1

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


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

Интересные ссылки, с первого взгляда напоминает метод 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/

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


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

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

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


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

немного поправил код для отрисовки.

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 переполнения, зато получается красиво. post-701-0-33140800-1345623865_thumb.jpg
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];

		}

	}

так норм но без картинки оригинальной.

post-701-0-57341800-1345623876_thumb.jpg

надо бы прикрутить еще SVM

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×