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

расстояние Хаусдорфа

Recommended Posts

Добрый день у меня вопрос правильно ли я понял само расстояние как оно считается

Пусть есть два изображения X и Y вытягиваем эти два изображения в вектор длина которого пусть N

H(X,Y)- это расстояние Хаусдорфа,

H(X,Y)=max(h1,h2)

h1=maximinj|xi-yj|

h2=maxjmini|xi-yj|

то есть само расстояние разница берётся по пикселям изображений ниже приведён код


double calcHausdorff(const Mat &v1,const Mat &v2)

{

	double res=0,h1=-100000,h2=-100000;

	int n=v1.size().area();


	//calc h1

	for(int i=0; i<n; i++)

	{

		double xi = v1.at<double>(i);

		double dmj=100000;

		for(int j=0; j<n; j++)

		{

			double yj = v2.at<double>(j);

			dmj=MIN(dmj,abs(xi-yj))

		}

		h1=MAX(h1,dmj);

	}


	//calc h2

	for(int j=0; j<n; j++)

	{

		double yj = v2.at<double>(j);

		double dmj=100000;

		for(int i=0; i<n; i++)

		{

			double xi = v1.at<double>(i);

			dmj=MIN(dmj,abs(xi-yj))

		}

		h2=MAX(h2,dmj);

	}


	res=MAX(h1,h2);

	return res;

}

похоже ли на правду ну что я реализовал или где-то ошибаюсь?...

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


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

Что то у Вас как то просто слишком :)

Хотя по смыслу похоже.

Вот тут как то сложнее:

http://www.cs.cornell.edu/~dph/papers/HKR-TPAMI-93.pdf

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


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

Всё правильно.

Smorodov Метрика простая, а вот в способ применения надо вникать.

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


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

Ну да, контекст применения метода часто намного сложнее самого метода.

ЗЫ:

Чтобы не писать в таком духе:

 double res=0,h1=-100000,h2=-100000;
в заголовочнике float.h определены удобные константы:

#define DBL_DIG 15 /* # of decimal digits of precision */
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define DBL_MANT_DIG 53 /* # of bits in mantissa */
#define DBL_MAX 1.7976931348623158e+308 /* max value */
#define DBL_MAX_10_EXP 308 /* max decimal exponent */
#define DBL_MAX_EXP 1024 /* max binary exponent */
#define DBL_MIN 2.2250738585072014e-308 /* min positive value */
#define DBL_MIN_10_EXP (-307) /* min decimal exponent */
#define DBL_MIN_EXP (-1021) /* min binary exponent */
#define _DBL_RADIX 2 /* exponent radix */
#define _DBL_ROUNDS 1 /* addition rounding: near */

#define FLT_DIG 6 /* # of decimal digits of precision */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define FLT_GUARD 0
#define FLT_MANT_DIG 24 /* # of bits in mantissa */
#define FLT_MAX 3.402823466e+38F /* max value */
#define FLT_MAX_10_EXP 38 /* max decimal exponent */
#define FLT_MAX_EXP 128 /* max binary exponent */
#define FLT_MIN 1.175494351e-38F /* min positive value */
#define FLT_MIN_10_EXP (-37) /* min decimal exponent */
#define FLT_MIN_EXP (-125) /* min binary exponent */
#define FLT_NORMALIZE 0
#define FLT_RADIX 2 /* exponent radix */
#define FLT_ROUNDS 1 /* addition rounding: near */
[/code]

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


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

ЗЫ:

Чтобы не писать в таком духе:

 double res=0,h1=-100000,h2=-100000;

в заголовочнике float.h определены удобные константы:

...

А для С++-эстетов есть std::numeric_limits<>

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


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

У меня один вопрос: что за расстояние Хаусдорфа и как его применить к изображению ?

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


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

ok, спасибо)

я применяю её для сравнения двух изображений к примеру дорожных знаков, и что-то как то не особо успешно... на одном и том же изображении она даёт 0 в других случаях всё как-то не особо понятно... к примеру при сравнении этой мерой 3-х прикреплённых изображений первые два из одного класса а второе из другого такие результаты

первое с третьим 0.0352941

первое со вторым 0.117647

на мой взгляд это странно я думал для более похожих изображений расстояние будет меньше чем для более отличающихся изображений

post-2515-0-62687800-1327480226_thumb.jp

post-2515-0-04721100-1327480273_thumb.jp

post-2515-0-98388100-1327480320_thumb.jp

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


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

на мой взгляд это странно я думал для более похожих изображений расстояние будет меньше чем для более отличающихся изображений

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

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


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

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

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


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

эти результаты уже с приведением изображений в градации серого, при бинаризации почему-то у меня всегда 0 получается....

фон пока не пробовал вычитать..., но я как то думал, что она и так должна бы работать ну пусть хуже чем с контурами объектов, но всё равно должна бы давать какие-то разумные реультаты... а эти что-то не особо понятны...

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


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

такие результаты имхо из-за того что фон в одном случае белый, а в другом чёрный.

и вообще просто сравнивать пиксели изображений или там гистограммы это как мне кажется очень не точный метод.

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


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

согласен, что такие методы не особо точны

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


dmj=MIN(dmj,abs(xi-yj))

не стоит ли брать не только разность интенсивностей у пикселей, но и их расположение ну т.е.

dmj=MIN(dmj,abs(xi-yj)+abs(i-j))

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


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

попробовал вроде бы результаты лучше... также картинки очистил от фона т.е. остались только знаки

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


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

Сравнение можно упростить размыв, или сильнее уменьшив изображение.

И почему бы здесь просто по дескрипторам не сравнивать?

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


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

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

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

  • Like 1

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


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

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

найти границы и для каждой точки границы посчитать shape context дескрипторы только еще с доп. информацией о цветах в пространстве HSV.

потом для сравнения векторов дескрипторов уже применять какую либо метрику.

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


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

вообще говоря странно как SIFT используется для CBIR (но как бы публикации на эту тему есть и с результатами)

например

http://caim.uib.no/publications/Bakken_N30-2007.pdf

http://www.ic.unicamp.br/~siome/papers/FSMA_SI_2009_2_Principal_2.pdf

и т.д. google-> cbir+sift

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

или например тут недавно была тема с самолётами, там тоже если вырезать 1 самолет то найдет только его самого.( + с продуктами на полках+с одеждой).

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×