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

Сегментация изображения

Recommended Posts

Изображение уже разбито на однотоновые области. Каким образом можно найти контуры cvseq этих областей?

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


Ссылка на сообщение
Поделиться на других сайтах
Изображение уже разбито на однотоновые области. Каким образом можно найти контуры cvseq этих областей?

Можно разбить на несколько изображений, по количеству слоев (делается сравнением со значением цвета), затем, для каждого слоя выделить контуры (cvCanny) и потом cvFindContours. Получите cvSeq.

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

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


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

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

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


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

Можно попробовать применить блоб-анализ: http://www.compvision.ru/forum/index.php?showtopic=62

Там есть такое (файл blob.h):

//! аrea de memтria on es desaran els punts de contorn del blob

//! storage which contains the edges of the blob

CvMemStorage *m_storage;

//! Sequиncia de punts del contorn del blob

//! Sequence with the edges of the blob

CvSeq *edges;

Насколько я понимаю, это границы блоба - то есть то что Вам нужно.

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


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

Спасибо, надо будет посмотреть на эти либы, еще один вопрос в догонку о конурах:как отличить внутренний от внешнего? Офф. ман полистал - не нашел

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


Ссылка на сообщение
Поделиться на других сайтах
Спасибо, надо будет посмотреть на эти либы, еще один вопрос в догонку о конурах:как отличить внутренний от внешнего? Офф. ман полистал - не нашел

Можно получить дерево контуров. См. пример: C:\Program Files\OpenCV\samples\c\contours.с

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


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

Честно говоря по этому примеру не понял. Используя cvDrawContours внешние и внутрен. контуры можно нарисовать разным цветом, но по какому значению можно понять внутрений это контур или внешний?

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


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

Неплохой проект сегментации изображений на основе EM+GrabCut (MATLAB)

http://code.google.com/p/cgworkshop/downloads/list

Плюс пара статей на эту тему и достаточно понятная презентация.

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


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

т.е. как в задачах сегментации все раскрашено несколькими цветами?

а если сделать канни сразу по такому изображению обведется только внешний контур чтоли?

можно еще свой велосипедный попиксельный обход написать. :)

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

как отличить внутренний от внешнего?

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

либо проверить находится ли внутри контура каждая точка внутреннего контура, вроде в Opencv есть функция pointPolygonTest.

т.к. скорее всего придется смотреть контуры все против всех, то надо пользоваться изначальным отсечением контуров, которые не могут и теоретически пересекаться, можно использовать minAreaRect,minEnclosingCircle и смотреть пересечение сначала их. а потом гуглить polygon intersection.

//пересечение прямоугольников стороны которых параллельны координатным осям.

//если 1 вложен в другой защитывается как пересечение 

bool RectIntersection(int x1,int y1,int w1, int h1, int x2, int y2, int w2,int h2)

{

	if ((min (x1+w1, x2+w2) >= max (x1, x2)) && (max (y1, y2) <= min(y1+h1, y2+h2)))

		return true;

	else

		return false;

}
про cvBlob (есть 2 библиотеки одна которая хостится на гугл код, а вторая на которую есть ссылка с самого сайта opencv) http://code.google.com/p/cvblob/ мне больше эта понравилась. http://opencv.willowgarage.com/wiki/cvBlobsLib http://code.google.com/p/cvblob/source/browse/trunk/cvBlob/cvblob.h
struct CvBlob

  {

    CvLabel label; ///< Label assigned to the blob.


    union

    {

      unsigned int area; ///< Area (moment 00).

      unsigned int m00; ///< Moment 00 (area).

    };


    unsigned int minx; ///< X min.

    unsigned int maxx; ///< X max.

    unsigned int miny; ///< Y min.

    unsigned int maxy; ///< y max.


    CvPoint2D64f centroid; ///< Centroid.


    double m10; ///< Moment 10.

    double m01; ///< Moment 01.

    double m11; ///< Moment 11.

    double m20; ///< Moment 20.

    double m02; ///< Moment 02.


    double u11; ///< Central moment 11.

    double u20; ///< Central moment 20.

    double u02; ///< Central moment 02.


    double n11; ///< Normalized central moment 11.

    double n20; ///< Normalized central moment 20.

    double n02; ///< Normalized central moment 02.


    double p1; ///< Hu moment 1.

    double p2; ///< Hu moment 2.


    CvContourChainCode contour;           ///< Contour.

    CvContoursChainCode internalContours; ///< Internal contours.

  };

соответственно Contour и Internal contours.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×