Построение карт стереодиспаратности

Тип работы:
Лабораторная работа
Предмет:
Программирование


Узнать стоимость новой

Детальная информация о работе

Выдержка из работы

Лабораторная работа

Построение карт стереодиспаратности

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

Задачи:

1. Изучить теоретическую часть работы.

2. Реализовать корреляционный алгоритм стереозрения с использованием корреляции Пирсона.

3. Провести исследование разработанного алгоритма на нескольких стереопарах с различными характерными значениями диспаратности, используя разные размеры корреляционного окна и значения диапазона допустимых стереодиспаратностей.

Экспериментальная часть:

Листинг программы, реализующей построение карты диспаратности подаваемой на вход стереопары, представлен в приложении 1. На рис. 1−5 представлены примеры исходных стереопар.

Рис. 1. Исходная стереопара. Статуя льва

Рис. 2. Исходная стереопара. Березовая роща

Рис. 3. Исходная стереопара. Трехмерные фигуры

Рис. 4. Исходная стереопара. Смотровая башня

Рис. 5. Исходная стереопара. Помещение

стереозрение корреляция стереодиспаратность

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

На рис. 6−10 представлены результаты построения карт стереодиспаратностей для представленных выше стереопар при различных размерах корреляционного окна при нулевом пороге допустимого для сопоставления точек значения коэффициента корреляции.

Исходное изображение Окно: 20Ч2. Порог: 0

Окно: 20Ч4. Порог: 0 Окно: 20Ч10. Порог: 0

Окно: 20Ч20. Порог: 0 Окно: 40Ч4. Порог: 0

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

Исходное изображение Окно: 10Ч2. Порог: 0

Окно: 20Ч2. Порог: 0 Окно: 10Ч10. Порог: 0

Окно: 20Ч4. Порог: 0 Окно: 20Ч10. Порог: 0

Окно: 20Ч20. Порог: 0 Окно: 40Ч4. Порог: 0

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

Исходное изображение Окно: 10Ч2. Порог: 0

Окно: 20Ч2. Порог: 0 Окно: 10Ч10. Порог: 0

Окно: 20Ч4. Порог: 0 Окно: 20Ч10. Порог: 0

Окно: 20Ч20. Порог: 0 Окно: 40Ч4. Порог: 0

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

Исходное изображение Окно: 10Ч2. Порог: 0

Окно: 20Ч2. Порог: 0 Окно: 10Ч10. Порог: 0

Окно: 20Ч4. Порог: 0 Окно: 20Ч10. Порог: 0

Окно: 20Ч20. Порог: 0 Окно: 40Ч4. Порог: 0

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

Исходное изображение Окно: 20Ч2. Порог: 0

Окно: 20Ч4. Порог: 0 Окно: 20Ч10. Порог: 0

Окно: 20Ч20. Порог: 0 Окно: 40Ч4. Порог: 0

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

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

Наилучшие результаты были получены при длине окна (размер по оси абсцисс), равный 20 пикселям. При меньшем размере окна по оси абсцисс результаты построения карты стереодиспаратностей для некоторых изображений теряют репрезентативность. Это происходит из-за того, что расстояние между одними и теми же точками на двух изображениях больше размера корреляционного окна по оси абсцисс. Можно заметить, что дальнейшее увеличение размера корреляционного окна по оси абсцисс ведет к падению разрешения на восстановленной карте стереодиспаратностей.

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

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

На рис. 11−15 представлены результаты построения карт диспаратности при учете только тех точек, коэффициент корреляции которых при сопоставлении, превышает некоторый порог.

Исходное изображение

Окно: 20Ч4. Порог: 0 Окно: 20Ч10. Порог: 0

Окно: 20Ч4. Порог: 0.5 Окно: 20Ч10. Порог: 0. 5

Окно: 20Ч4. Порог: 0.9 Окно: 20Ч10. Порог: 0. 9

Рис. 11. Исходное изображение и набор карт стереодиспаратностей, полученных при различных порогах допустимого значения коэффициента корреляции

Исходное изображение

Окно: 10Ч2. Порог: 0 Окно: 10Ч10. Порог: 0

Окно: 10Ч2. Порог: 0.5 Окно: 10Ч10. Порог: 0. 5

Окно: 10Ч2. Порог: 0.9 Окно: 10Ч10. Порог: 0. 9

Окно: 20Ч4. Порог: 0 Окно: 20Ч10. Порог: 0

Окно: 20Ч4. Порог: 0.5 Окно: 20Ч10. Порог: 0. 5

Окно: 20Ч4. Порог: 0.9 Окно: 20Ч10. Порог: 0. 9

Рис. 12. Исходное изображение и набор карт стереодиспаратностей, полученных при различных порогах допустимого значения коэффициента корреляции

Исходное изображение

Окно: 10Ч2. Порог: 0 Окно: 10Ч10. Порог: 0

Окно: 10Ч2. Порог: 0.5 Окно: 10Ч10. Порог: 0. 5

Окно: 10Ч2. Порог: 0.9 Окно: 10Ч10. Порог: 0. 9

Окно: 20Ч4. Порог: 0 Окно: 20Ч10. Порог: 0

Окно: 20Ч4. Порог: 0.5 Окно: 20Ч10. Порог: 0. 5

Окно: 20Ч4. Порог: 0.9 Окно: 20Ч10. Порог: 0. 9

Рис. 13. Исходное изображение и набор карт стереодиспаратностей, полученных при различных порогах допустимого значения коэффициента корреляции

Исходное изображение

Окно: 10Ч2. Порог: 0 Окно: 10Ч10. Порог: 0

Окно: 10Ч2. Порог: 0.5 Окно: 10Ч10. Порог: 0. 5

Окно: 10Ч2. Порог: 0.9 Окно: 10Ч10. Порог: 0. 9

Окно: 20Ч4. Порог: 0 Окно: 20Ч10. Порог: 0

Окно: 20Ч4. Порог: 0.5 Окно: 20Ч10. Порог: 0. 5

Окно: 20Ч4. Порог: 0.9 Окно: 20Ч10. Порог: 0. 9

Рис. 14. Исходное изображение и набор карт стереодиспаратностей, полученных при различных порогах допустимого значения коэффициента корреляции

Исходное изображение

Окно: 20Ч4. Порог: 0 Окно: 20Ч10. Порог: 0

Окно: 20Ч4. Порог: 0.5 Окно: 20Ч10. Порог: 0. 5

Окно: 20Ч4. Порог: 0.9 Окно: 20Ч10. Порог: 0. 9

Рис. 15. Исходное изображение и набор карт стереодиспаратностей, полученных при различных порогах допустимого значения коэффициента корреляции

Полученные результаты показывают, что выбор порога допустимого коэффициента корреляции зависит от параметров изображений. Высокий порог, как показано на рис. 12 и 15 в значительной мере сократить влияние шумов и оставить только полезную информацию на восстановленной карте стереодиспаратностей. Однако данные на рис. 11, 13 и 14 показывают, что такой же высокий порог ведет и к отсечению полезной информации и значительно уменьшает плотность восстановленной карты стереодиспаратностей.

Вывод

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

Показано, что для различных сцен необходим адаптивный выбор размера корреляционного окна по оси абсцисс, который зависит от размера стереобазы и расстояния до объектов, диспаратность которых вычисляется. Рассмотрен эффект уменьшения разрешения построенной карты стереодиспаратностей при излишнем увеличении размера корреляционного окна по осям абсцисс и ординат (рис. 6−10). Рассмотрено положительное влияние увеличения размера корреляционного окна по оси ординат на плотность и качество построенной карты стереодиспаратностей (рис. 6−10).

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

Приложение

Листинг программы, реализующей построение карты стереодиспаратностей подаваемой на вход стереопары на языке программирования C++ с использованием библиотеки OpenCV версии 2.3. 1

Программа состоит из нескольких файлов. Исполняемая часть находится в конце приложения.

Файл «opencv2. h» (Содержит объявления некоторых общих вспомогательных функций и вход в пространство имен cv. Включен в каждый файл программы)

#ifndef OPENCV2_H_

#define OPENCV2_H_

#include «opencvcv. h»

#include «opencvhighgui. h»

using namespace cv;

void fillMat (Mat & mat, float color); // Закрасить матрицу типа float одним цветом

#endif

Файл «opencv2. cpp» (Содержит реализацию вспомогательных функций, объявленных в «opencv2. h»).

#include «opencv2. h»

#include < stdio. h>

#include < vector>

#include < math. h>

// Реализация вспомогательных функций, объявленных в opencv2. h

void fillMat (Mat & mat, float color)

{

for (int y = 0; y < mat. rows; y++)

for (int x = 0; x < mat. cols; x++)

mat. at<float>(y, x) = color;

}

Файл «correlation. h» (Содержит объявления функции вычисления коэффициента корреляции и вспомогательных функций)

#ifndef CORRELATION_H

#define CORRELATION_H

#include «opencv2. h»

#include < stdio. h>

#include < windows. h>

#include < math. h>

float getCorrelationCoef (const Mat & mat1, const Mat & mat2);

float var (const Mat & mat);

float getMax (const Mat & mat);

#endif

Файл «correlation. cpp» (Содержит определения функции вычисления коэффициента корреляции и вспомогательных функций, объявленных в «correlation. h»).

#include «correlation. h»

#include «opencv2. h»

#include < stdio. h>

#include < windows. h>

#include < math. h>

float getCorrelationCoef (const Mat & mat1, const Mat & mat2)

{

float m1 = 0;

float m2 = 0;

for (int y = 0; y < mat1. rows; y++)

{

for (int x = 0; x < mat1. cols; x++)

{

m1 += mat1. at<float>(y, x);

m2 += mat2. at<float>(y, x);

}

}

m1 /= mat1. rows*mat1. cols;

m2 /= mat2. rows*mat2. cols;

float d1 = 0;

float d2 = 0;

float c = 0;

for (int y = 0; y < mat1. rows; y++)

{

for (int x = 0; x < mat1. cols; x++)

{

float tmp1 = (mat1. at<float>(y, x) — m1);

float tmp2 = (mat2. at<float>(y, x) — m2);

d1 += tmp1*tmp1;

d2 += tmp2*tmp2;

c += tmp1*tmp2;

}

}

d1 = sqrt (d1);

d2 = sqrt (d2);

c /= d1*d2;

return c;

}

float var (const Mat & mat)

{

float m = 0;

for (int y = 0; y < mat. rows; y++)

for (int x = 0; x < mat. cols; x++)

m += mat. at<float>(y, x);

m /= mat. rows*mat. cols;

float d = 0;

for (int y = 0; y < mat. rows; y++)

for (int x = 0; x < mat. cols; x++)

d += (mat. at<float>(y, x) — m)*(mat. at<float>(y, x) — m);

d /= mat. rows*mat. cols;

return d;

}

float getMax (const Mat & mat)

{

float d = -100 000 000;

for (int y = 0; y < mat. rows; y++)

for (int x = 0; x < mat. cols; x++)

if (d < mat. at<float>(y, x))

d = mat. at<float>(y, x);

return d;

}

Файл «main. cpp» (Содержит основной код программы и функцию, строящую карту стереодиспаратностей с учетом заданных параметров).

#include «opencv2. h»

#include < stdio. h>

#include < windows. h>

#include «correlation. h»

Mat makeDispMap (Mat & mat1, Mat & mat2, int x_size, int y_size, float treshold)

{

Mat res (mat1. rows, mat1. cols, CV_32FC1);

for (int y = y_size/2; y < res. rows-y_size/2−1; y++)

{

printf («bbbbbbbbbbbbbbb%. 2f%%», (double) (y — y_size/2)/(res. rows-1)*100);

for (int x = x_size; x < res. cols-x_size-1; x++)

{

float max_value = -1;

int max_shift_x = 0;

float c = 0;

int dy = 0;

//for (int dy = - y_size/2; dy < y_size/2; dy++)

// {

for (int dx = - x_size; dx < 0; dx++)

{

c = getCorrelationCoef (

mat1 (Rect (x, y-y_size/2, x_size, y_size)),

mat2 (Rect (x+dx, y-y_size/2, x_size, y_size)));

//imshow («img1», mat1 (Rect (x, y-y_size/2, x_size, y_size)));

//imshow («img2», mat2 (Rect (x+dx, y-y_size/2, x_size, y_size)));

//waitKey (1);

//printf («%d % d % fn», x, dx, c);

if (max_value < c)

{

max_value = c;

max_shift_x = dx;

}

}

// }

//printf («%fn», max_value);

//imshow («img1», mat1 (Rect (x, y-y_size/2, x_size, y_size)));

//imshow («img2», mat2 (Rect (x+max_shift_x, y-y_size/2, x_size, y_size)));

//waitKey (1);

if (max_value > treshold)

res. at<float>(y, x) = - max_shift_x;

else

res. at<float>(y, x) = 0;

}

//imshow («map», res);

waitKey (1);

}

cvDestroyWindow («map»);

printf («n»);

return res;

}

void main ()

{

Mat img = imread («1. jpg», CV_LOAD_IMAGE_GRAYSCALE);

Mat img1 = img (Rect (0, 0, img. cols/2, img. rows));

Mat img2 = img (Rect (img. cols/2, 0, img. cols/2, img. rows));

Mat mat1;

Mat mat2;

img1. convertTo (mat2, CV_32FC1, 1. /255);

img2. convertTo (mat1, CV_32FC1, 1. /255);

imshow («img», mat1);

waitKey (0);

imshow («img», mat2);

waitKey (0);

cvDestroyWindow («img»);

Mat res = makeDispMap (mat1, mat2, 20, 4, 0);

normalize (res, res, 0, 1, CV_MINMAX);

imshow («res», res);

imshow («img», mat1);

normalize (res, res, 0, 255, CV_MINMAX);

normalize (mat1, mat1, 0, 255, CV_MINMAX);

imwrite («res. bmp», res);

imwrite («left. bmp», mat1);

waitKey (0);

}

ПоказатьСвернуть
Заполнить форму текущей работой