Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 01.03.2013, 12:34
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 1  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
По умолчанию Поиск совпадающих картинок

Привет, ребята
Вот в чем суть проблемы: есть папка A, в которой имеется порядка 10 000 изображений такого вида:
Название: photo_1.jpg
Просмотров: 632

Размер: 13.4 Кб Название: photo_2.jpg
Просмотров: 584

Размер: 18.4 Кб
и есть папка B, в которой имеется порядка 100 изображений такого вида:
Название: photo_1_wm.jpg
Просмотров: 592

Размер: 14.6 Кб Название: photo_2_wm.jpg
Просмотров: 601

Размер: 14.4 Кб
И задача состоит в том, что нужно среди изображений из папки A найти совпадающие с изображениями из папки B. Также известно следующее:
1) Водяной знак присутствует только на картинках из папки B, располагается в центре изображения и имеет фиксированные размеры.
2) Если картинки совпадают, как на примере выше, то они точно имеют одинаковые размеры и отличаются, по сути, только наличием водяного знака.
3) Картинки из папки A могут иметь различные размеры.
4) Фон картинки необязательно белый и может быть сколь угодно пестрым.
5) И самое коварное – неизвестно, есть ли в папке A изображение совпадающее с изображением из папки B.

Я попробовал решить задачу в лоб:
1) Берем очередную картинку из папки B и последовательно сравниваем ее со всеми картинками из папки A.
2) Если их размеры не совпадают, то переходим к следующей картинке из папки A.
3) Если размеры совпадают начинаем сравнивать их попиксельно. И если (кол-во совпавших пикселей / полное кол-во пикселей) > 0.8, то считаем изображения совпадающими.
Код AS3:
if (WMBitmapData.width == picBitmapData.width && WMBitmapData.height == picBitmapData.height)
{
	var coinCount:int = 0;
	var w:int = WMBitmapData.width;
	var h:int = WMBitmapData.height;
	for (var a:int = 0; a < w; ++a)
		for (var b:int = 0; b < h; ++b)
		{
			if (WMBitmapData.getPixel32(a, b) == picBitmapData.getPixel32(a, b))
				++coinCount;
		}
	if (Number(coinCount) / Number(w * h) > 0.8)
	{
		// Фиксируем совпадение
		...
	}
}
Столь монструозное количество сравнений некритично.
Проблема в том, что иногда алгоритм ошибается, неверно определяя совпадение картинок. Думаю здесь дело в большом количестве белого фона, что гарантирует превышение лимита совпадения в 0.8. Но дело в том, что я не представляю как подобрать нужную константу вместо 0.8, потому что картинка может быть и меньших размеров (приведенные выше были 500x500), и тогда водяной знак будет занимать значительную площадь изображения.

Подскажите, как быть?

P.S. Также вместо getPixel32 я использовал BitmapData.compare, но это не суть, так как относится уже к реализации.

Создать новую тему   Часовой пояс GMT +4, время: 20:10.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
распознавание изображений
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 20:10.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.