Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Задание на лабораторную работу




 

В таблице 2.2 представлены варианты заданий на лабораторную работу.

Необходимо:

- ознакомится с работой демонстрационной программы распознавания ГО, предложенной преподавателем;

- построить СГ вычислительного процесса распознавания местоположения фрагмента ГО;

- построить временную диаграмму событий сетевого графика с распределением процессоров по операциям.

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

Способ 1: по цветовым признакам модели RGB.

Способ 2: по зонам поиска, число которых вычисляется по формуле (2.1).

Способ 3: по вычислению выражений (2.2) – (2.6).

 

Варианты заданий

 

Варианты заданий для выполнения лабораторной работы представлены в таблице 2.2.

 

 

Таблица 2.2 – Варианты заданий для выполнения лабораторной работы №3

Вариант

Способ

распараллеливания

Общее число

процессоров

Вариант

Способ

распараллеливания

Общее число

процессоров

1

1 и 2

7

11

1 и 2

10

2

1 и 3

6

12

1 и 3

6

3

2 и 3

8

13

2 и 3

8

4

1 и 2

10

14

1 и 2

5

5

1 и 3

6

15

1 и 3

6

6

2 и 3

8

16

2 и 3

8

7

1 и 2

8

17

1 и 2

10

8

1 и 3

6

18

1 и 3

6

9

2 и 3

5

19

2 и 3

5

10

1 и 2

10

20

1 и 2

7

 

3.5 Контрольные вопросы

 

1. Опишите модель распознавания образа и дайте определение коэффициенту парной корреляции и укажите диапазон его изменения.

2. Определите основные способы распараллеливания вычислительного процесса и дайте определение основным элементам сетевого графика.

3. Дайте определение критического пути.

4. Объясните алгоритм оптимизации сетевого графика.


Лабораторная работа № 3. Распознавание контуров геометрических объектов на графических изображениях

 

Цель работы: получить навыки использования методов контурного анализа при распознавания  контуров геометрических объектов

 

Теоретическая часть

В общем случае контур – замкнутая линия, очерчивающая некоторый предмет на плоскости. Поскольку изображение дискретно, т.е. состоит из пикселей, то контур будет состоять из точек, ограничивающих какой-либо участок изображения. При этом сами точки можно получать двумя вариантами: а) точки описываемого объекта; б) точки фона. Принципиальной разницы между этими вариантами нет, и в любом случае особенностью этих точек является то, что их соседними точками являются как точки объекта, так и точки фона. Поэтому перед использованием контурного анализа необходимо выделить эти граничные точки.

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

Другим методом является применение известных операторов вычисления контуров, таких как, Робертса, Собела, Марра, Лапласа и Кенни. Данные операторы позволяют оценить перепады яркости на изображении, которые скорее всего и будут указывать на контур.

Для проверки работы некоторых операторов можно использовать следующую простую программу (Листинг 3.1), которая оперирует изображением.

 

Листинг 3.1. Пример работы с операторами Собела, Лапласа и Кенни в OpenCV

#include "opencv2/highgui/highgui_c.h"

#include "opencv2/core/core_c.h"

#include "opencv2/imgproc/imgproc_c.h"

 

int main()

{

        IplImage *img = cvLoadImage("lena.jpg", 1); // Загрузка изображения

        IplImage *img_gray = cvCreateImage(cvGetSize(img), 8, 1); // Создание 8-битного изображения

        IplImage *img_gray2 = cvCreateImage(cvGetSize(img), 8, 1);

        cvCvtColor(img, img_gray,CV_BGR2GRAY); // Перевод из полноцветного в градации серого

        cvSobel(img_gray,img_gray2,1,0);

        cvSaveImage("SobelX.jpg", img_gray2);         

        cvSobel(img_gray,img_gray2,0,1);

        cvSaveImage("SobelY.jpg", img_gray2);         

        cvCanny(img_gray,img_gray2,50,100,3);

        cvSaveImage("Canny.jpg", img_gray2);          

        IplImage* img16 = cvCreateImage(cvGetSize(img),IPL_DEPTH_16S,1);

        cvLaplace(img_gray, img16, 3);

        cvConvertScale(img16, img_gray2);                 

        cvSaveImage("Laplace.jpg", img_gray2);                    

        return 0;

}

 

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

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

(а) (б)
(в) (г)

Рисунок 3.1 – Операторы выделения границ:

(а) Собела (по X); (б) Собела (по Y); (в) Лапласа; (г) Кенни

 

Для нахождения контуров обычно используют метод «жука», однако гораздо проще использовать уже готовые функции, которые есть в существующих бесплатных библиотеках, например в OpenCV. Ниже приведено описание функции cvFindContours () из данной библиотеки:

int cvFindContours(CvArr* image, CvMemStorage* storage,

CvSeq** first_contour,int header_size=sizeof(CvContour),

int mode=CV_RETR_LIST,

int method=CV_CHAIN_APPROX_SIMPLE,

CvPoint offset=cvPoint(0,0));

 

Параметр «image». Исходное 8-битное изображение. Отличные от нуля пиксели обрабатываются как 1, нулевые пиксели остаются 0 – т.е. изображение является монохромным. Чтобы получить такое изображение, можно использовать cvThreshold, cvAdaptiveThreshold или cvCanny. Функция изменяет исходное содержание изображения.

Параметр «storage». Контейнер найденных контуров.

Параметр «first_contour». Указатель на первый найденный контур.

Параметр «header_size». Размер заголовка последовательности, > = sizeof (CvChain) если method=CV_CHAIN_CODE, и > sizeof (CvContour) в противном случае.

Параметр «mode». CV_RETR_EXTERNAL – находятся только критические внешние контуры; CV_RETR_LIST – находятся все контуры, и помещает их в список; CV_RETR_CCOMP – находятся все контуры, и записывают их в иерархию с двумя уровнями: верхний уровень – внешние границы компонентов, второй уровень – границы отверстий; CV_RETR_TREE – находятся все контуры, и записывается полная иерархия вложенных контуров.

Параметр «method». Метод аппроксимации (для всех режимов, кроме CV_RETR_RUNS, который использует встроенную аппроксимацию). CV_CHAIN_CODE – на выходе очерчивает контур в цепном коде Фримена. Все другие методы выводят многоугольники; CV_CHAIN_APPROX_NONE – переводит все точки с цепного кода в точки; CV_CHAIN_APPROX_SIMPLE – сжимает горизонтальные, вертикальные, и диагональные доли; CV_CHAIN_APPROX_TC89_L1, CV_CHAIN_APPROX_TC89_KCOS – применяет одну из разновидностей алгоритма аппроксимации цепочки Teh-Chin. CV_LINK_RUNS – использует полностью различный алгоритм поиска контура через соединение горизонтальных долей. Только CV_RETR_LIST режим поиска может использоваться с этим методом.

Параметр «offset». Смещение, с которым каждая точка контура сдвинута. Это полезно, если контуры извлечены из изображения ROI, и затем они должны быть проанализированы в целом контексте изображения.

Функция cvFindContours () отыскивает контуры от монохромного изображения и возвращает число найденных контуров. Указатель first_contour заполняется функцией. Он будет содержать указатель на первый наиболее внешний контур или пустой указатель, если никакие контуры не обнаружены (если изображение полностью черно). Другие контуры могут быть достигнуты от first_contour, используя h_next и связей v_next. Последовательность контуров описана интересной структурой CvSeq, которая предоставляет интерфейс для всех динамических структур в OpenCV.

После того, как контуры обнаружены – их можно вывести в изображение с помощью функции cvDrawContours (). Пример нахождения контуров и вывод их на изображение представлен в листинге 3.2.

 

Листинг 3.2. Нахождение контуров с использованием функций OpenCV

IplImage* image = cvLoadImage("image.jpg", 1);

//Создание изображения в градациях серого

IplImage* img_gray= cvCreateImage(cvSize(image->width,image->height), 8, 1);

CvSeq* contours = 0;

CvMemStorage* storage = cvCreateMemStorage(0);

cvCvtColor(image, img_gray, CV_BGR2GRAY);

cvThreshold(img_gray, img_gray, 128, 255, CV_THRESH_BINARY);

/*cvAdaptiveThreshold(img_gray, img_gray, 255,       

  CV_ADAPTIVE_THRESH_GAUSSIAN_C,CV_THRESH_BINARY, 21, 7);*/

cvFindContours(img_gray, storage, &contours, sizeof(CvContour),

  CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

cvDrawContours(image, contours, CV_RGB(255,0,0), CV_RGB(0,255,0),2, 1, CV_AA,

cvPoint(0,0));

cvSaveImage("out.jpg",image);

cvReleaseImage(&image);

 

Результат выделения контуров при использовании функции cvThreshold () представлен на рисунке 3.2 (а), а при использовании адаптивного построения монохромного изображения cvAdaptiveThreshold (), представлен на рисунке 3.2 (б).

Часто необходимо сгладить контуры. Для сглаживания контуров в OpenCV есть функция cvApproxPoly ().

Результат сглаживания показан на рисунке 3.3.

(а) (б)

Рисунок 3.2 – Выделение контуров после приведения изображения к монохромному с помощью: (а) порогового преобразования; (б) адаптивного преобразования

Рисунок 3.3 – Сглаженные контуры

 

Для анализа контуров используются так называемые моменты (полностью реализованные в OpenCV). Момент – это характеристика контура, объединённая (суммированная) со всеми пикселями контура. Момент (p, q) определяется как:

, (3.3)

где p – порядок x; q – порядок y, где порядок означает мощность, на которой соответствующий компонент взят в сумме с другими отображенными; I (x, y) – пиксель контура (изображения); n – количество точек контура.

Существуют центральные моменты, которые вычисляются по следующей формуле:

, (3.4)

где xср и yср определяются из моментов, полученных в выражении (4.3), соответственно как m 10/ m 00 и m 01/ m 00. Центральные моменты можно нормализовать с помощью функции cvGetNormalizedCentralMoment ().

Нормализованные моменты вычисляются следующим образом:

. (3.5)

Комбинируя различные нормализованные центральные моменты, можно создавать инвариантные функции, представляющие различные аспекты изображения, которые не зависят от масштабов, вращения и отражения:

h 1= η 20+ η 02, h 2=(η 20- η 02)²+4 η 11², h 3=(η 30-3 η 12)²+ (3 η 21- η 03)², h 4=(η 30+ η 12)²+ (η 21+ η 03)², h 5=(η 30-3 η 12)(η 30+ η 12)[(η 30+ η 12)²-3(η 21+ η 03)²]+(3 η 21- η 03)(η 21+ η 03)[3(η 30+ η 12)²-(η 21+ η 03)²], h 6=(η 20- η 02)[(η 30+ η 12)²- (η 21+ η 03)²]+4 η 11(η 30+ η 12)(η 21+ η 03), h 7=(3 η 21- η 03)(η 21+ η 03)[3(η 30+ η 12)²-(η 21+ η 03)²]-(η 30-3 η 12)(η 21+ η 03)[3(η 30+ η 12)²-(η 21+ η 03)²]. (3.6)

Для получения моментов от контура или изображения в OpenCV есть ряд функций: cvMoments (), cvGetHuMoments (). Для сравнения – функция cvMatchShapes ().

Поддерживаются три метода сравнения инвариантных моментов.

CV_CONTOURS_MATCH_I1:

, (3.7)

где A и B – первое и второе изображение (контур).

CV_CONTOURS_MATCH_I2:

. (3.8)

CV_CONTOURS_MATCH_I3:

. (3.9)

Параметры m для выражений (4.7) – (4.9) высчитываются по следующим формулам:

, (3.10) . (3.11)

Чем меньше возвращаемое значение выражений (3.7) – (3.9), тем более похожи изображения (контуры).

Одним из направлений использования моментов и их сравнений является распознавания текста.

 

Порядок выполнения работы

 

1. Используя любую среду программирования (например, Visual Studio версии 2005 или старше и язык C/C++) и создайте новый проект.

2. Создайте файлы с эталонными образами в редакторе Paint в соответствии с вариантом. Размеры файлов 200 на 200 пикселей.

3. Напишите процедуру загрузки изображений в оперативную память.

4. Используя библиотеку OpenCV, найдите контуры всех эталонных образов и выведите информацию об этом или на экран или в графический файл.

5. Используя функции OpenCV cvMoments (), cvGetHuMoments (), определите моменты для каждого из образов в соответствии с постановкой задачи. Выведите эти значения на экран или в текстовый файл.

6. Модифицируете эталонные образы в соответствии с постановкой задачи и получите значения моментов.

7. Сравните значения эталонных и измененных образов. Определите, какие моменты можно использовать для отличия одного контура от другого.

8. Сделайте выводы о проделанной работе и составьте отчет.

9. Ответьте на контрольные вопросы.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...