Форум 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, но это не суть, так как относится уже к реализации.

Старый 01.03.2013, 12:47
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Я бы с blend mode поэксперементировал. Первое что пришло в голову.

Старый 01.03.2013, 12:54
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 3  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Попытаться перед сравнением вырезать водяной знак из картинки оригинала (где его нет) и картинки теста (где он есть) и потом уже сравнивать, если на оригинальной картинке фон четко белый, а на тестируемой пестрый, то из белого фона оригинальной картинки можно сделать маску и наложить на пестрый фон исследуемой картинки и таким образом он из пестрого тоже станет белым.
__________________
Гоночка

Старый 01.03.2013, 12:55
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 4  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
"Накладываем" попарно картинки друг на друга с каким-то блендмодом (точно не могу сказать, каким именно), смотрим область "разности" изображений. Если она очень близка к области вотермарка — считаем, это эти изображения идентичны. Я бы попробовал бы сначала так.
__________________
hauts.ru

Старый 01.03.2013, 13:02
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 5  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Есть метод BitmapData#compare
Потом получаем прямоугольник через getColorBoundsRect и смотрим его размер - если он близок к размеру ватермарка - значит изображения идентичные.
Правда это не сработает если идентичные картинки имеют разные размеры (правда какие же тогда они идентичные?)
__________________
Отряд Котовскага

Старый 01.03.2013, 13:05
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
2) Если картинки совпадают, как на примере выше, то они точно имеют одинаковые размеры и отличаются, по сути, только наличием водяного знака.
Почему просто не скопировать область с ватермарком на предполагаемый исходник перед сравнением?

Добавлено через 8 минут
Есть только нюанс, что если картинки в jpeg, при сохранении после наложения ватермарка некоторые пиксели могут не соответствовать исходным (артефакты оптимизации). Поэтому коэфициент соответствия все же не будет 100%, надо подбирать.
__________________
Reality.getBounds(this);

Старый 01.03.2013, 13:27
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 7  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Alex Lexcuk, вы немного неправильно поняли про пестрый фон. Совпадающие картинки не будут отличаться фоном. То есть и вы и Wolsh предложили одну и ту же схему – удаление либо вставка ватермарки, т.е. попытка сведения изображений к абсолютно идентичным. А caseyryan, Hauts и Котяра предлагают несколько иной подход (хотя в общем-то тоже сравнение, но встроенными функциями). Хотя оба подхода можно объединить
Спасибо всем большое вывели из тупика, пойду экспериментировать. Позже отпишусь о результатах. (да, про getColorBoundsRect я не знал)

Старый 01.03.2013, 13:42
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 8  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Может быть придумать "похожесть"? Например, если картинка похожа на 90%, то с ней и работаем.

Старый 01.03.2013, 14:03
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 9  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Dip52, как бы про это и речь, как эту "похожесть" придумать.
__________________
hauts.ru

Старый 01.03.2013, 15:39
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 10  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от Hauts Посмотреть сообщение
Dip52, как бы про это и речь, как эту "похожесть" придумать.
Программным образом нарисовать контуры мольбертов. Рисование будет происходить таким образом: чертим линию, допустим снизу, на коричневом цвете (если 1 пиксель коричневый, а 2 белый, то ищем в какой стороне есть коричневый). Сначала чертим эти линии на исходном, потом с ватермарком.
Потом полученные конторы помещаем в специальный объект (он уже там идёт по координате x=0 и y=0). Эти конторы сравниваем по признакам: если углы у линий похожи, то вероятность "похожести" повышается".

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

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

Теги
распознавание изображений

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

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


 


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


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