Морфологический градиент и анализ цветных изображений / OpenCV / Recog.ru - Распознавание образов для программистов


Морфологический градиент и анализ цветных изображений

Очень часто при анализе изображений необходимо выделить границы объекта. При этом во многих случаях разработчики предпочитают работать с изображениями в градациях серого, поскольку это намного быстрее. Однако не всегда, работая в градациях серого можно выделить искомый объект. Например, есть изображение:

Его серое представление:

Видно, что зеленый прямоугольник слился с фоном. А желтый с голубым.
В качестве примера используем следующую программу, которая работает с обоими форматами:
IplImage* Image = cvLoadImage( "a.png" );
IplImage* ImageClone = cvCloneImage( Image );

IplImage* Gray = cvCreateImage( cvGetSize( Image ), 8, 1 );
cvCvtColor( Image, Gray, CV_BGR2GRAY );
cvSaveImage( "a00.png", Gray );
IplConvKernel* structuringElement;
int rows = 3;
int columns = 3;
structuringElement = cvCreateStructuringElementEx( rows, columns, 
	cvFloor(rows / 2), cvFloor(columns / 2), CV_SHAPE_RECT, NULL );

IplImage *GrayTemp = cvCreateImage( cvGetSize( Gray ), 8, 1 );

cvMorphologyEx( Gray, Gray, GrayTemp, structuringElement, CV_MOP_GRADIENT, 1 );	

cvSaveImage( "a1.png", Gray );

cvMorphologyEx( Image, ImageClone, GrayTemp, structuringElement, CV_MOP_GRADIENT, 1 );	
cvCvtColor( ImageClone, Gray, CV_BGR2GRAY );
cvSaveImage( "a2.png", ImageClone );
cvSaveImage( "a3.png", Gray );

cvReleaseImage( &GrayTemp );
cvReleaseImage( &Gray );
cvReleaseImage( &Image );
cvReleaseImage( &ImageClone );


Результат морфологического градиента для серого:

Видно, что далеко не все границы выделяются. И для цветного:


С точки зрения точности нахождения границ работа с цветом предпочтительна. Однако то, что работа происходит с 3-мя компонентами + необходимость конвертации в серое для последующего анализа приводит к тому, что время обработки изображения увеличивается примерно в 3.5 раза.
Естественно возникают идеи обрабатывать не 3 компоненты, а к примеру 2. Например, G и B:


Или B и G:

И видно, что результат будет лучше, чем просто для градаций серого. Однако в этом случае необходимо будет модифицировать самостоятельно функцию морфологического градиента, поскольку использование функций:
cvSplit( Image, chanel1, chanel2, chanel3, NULL );

Для выделения каналов и
cvMerge( 0, chanel2, chanel3, 0, ImageClone );

Затем для объединения, а потом и перевода в градации серого замедлит программу еще больше.
  • 0
  • 06 февраля 2014, 10:19
  • vidikon

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.