Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 13.08.2013, 15:10   #1
egorka2134
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 40
По умолчанию Сравнение изображения с ФРАГМЕНТОМ другого изображения

Добрый день! Выручите пожалуйста!
Задача:
Есть изображение 1 и изображение 2. Изображение 1 больше чем изображение 2. Как проверить есть ли на изображении 1 фрагменты, которые схожи с изображением 2 больше чем на 50%.
Помогите пожалуйста, заранее огромнейшее спасибо
egorka2134 вне форума Ответить с цитированием
Старый 13.08.2013, 15:12   #2
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Имеется ввиду, что 50% пикселей IMG2 должный находится на IMG1 в той же последовательности?
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 13.08.2013, 15:21   #3
egorka2134
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 40
По умолчанию

Хм... Просто происходит сравнивание фрагмента и изображения и определяется процент совпадений,
для этого использую код сравнения двух изображений:
for i:=1 to canvas1.width do
for j:=1 to canvas1.height do
if canvas1.pixels[i,j] = canvas2.pixels[i,j] then inc(n);
showmessage ('количество сходных пикселей = '+inttostr(n));

Допустим на изображении 1 изображен алфавит, а на изображении 2 - лишь буква А, причем может быть немного деформирована(тоесть не того же шрифта, что на рисунке 1).
Но как найти этот фрагмент?

Последний раз редактировалось egorka2134; 13.08.2013 в 15:31.
egorka2134 вне форума Ответить с цитированием
Старый 13.08.2013, 15:26   #4
egorka2134
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 40
По умолчанию

Есть такая идея:
Допустим изображение 1 10*10 пикселей, а изображение 2 4*4 пикселя.
Мы берем часть изображения 1 (начиная с верхнего левого угла) размером 4*4 пикселя, и сравниваем с изображением 2, определяем процент схожести, далее отступаем вправо на 1 пиксель и повторяем процедуру. и так весь рисунок 1.
Но как реализовать?
egorka2134 вне форума Ответить с цитированием
Старый 13.08.2013, 15:28   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Если просто в лоб, то сколько возможных комбинаций размещения изображения2 на изображении1? Правильно = (ширина1-ширина2+1)*(высота1-высота2+1). От этого и плясать при организации циклов по канве - цикл в цикле по возможным способам размещения и внутри циклы по канве
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.08.2013, 15:28   #6
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,227
По умолчанию

Если бы надо было 100% совпадение, то можно было бы воспользоваться простым поиском (типа pos).
А так, даже не знаю. Нейросети наверное надо использовать. Либо тупой перебор, но это очень ресурсоёмкая задача.
Kix.IV вне форума Ответить с цитированием
Старый 13.08.2013, 15:41   #7
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Самый топорный способ:

Код:
var
	SimilarAreas: array of TRect;
	
...

SetLength(SimilarAreas, 0);

LengthSimilarAreas := 0;
LimitPixels := canvas2.width * canvas1.height div 2;

for xOffset := 1 to canvas1.width - canvas2.width do
begin
	for yOffset := 1 to canvas1.height - canvas2.height do
	begin
		SamePixels := 0;
		
		for x := xOffset to canvas1.width do
		begin
			for y := yOffset to canvas1.height do
			begin
				if canvas1.pixels[x,y] = canvas2.pixels[x,y] then 
				begin
					Inc(SamePixels);
				end;
			end;
		end;
		
		if SamePixels >= LimitPixels then
		begin
			Inc(LengthSimilarAreas);
			SetLength(SimilarAreas, LengthSimilarAreas);
			
			with SimilarAreas[LengthSimilarAreas - 1] do
			begin
				Top := xOffset;
				Left := yOffset;
				Bottom := xOffset + canvas2.height;
				Right := yOffset + canvas2.width; 
			end;
		end;
	end;
end;
PS: Фигасе таб расперло О_о
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 13.08.2013, 16:06   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,455
По умолчанию

Как вариант:
Исходное изображение(что ищем), получаете его квадрат, внутри этого квадрата так же содержимое делите на квадраты по 3-5 пикселей.
У цели(Где ищем), накладываем квадрат исходного изображения, разбиваем на такие же группы и начинаем сравнивать, считаем % совпадения для каждого мини-квадрата. Далее анализируете в какой части квадрата временного изображения больше всего совпадений и расстояние меду ними минимально.
Если такие есть, то сдвигаете большой квадрат в ту сторону, и снова анализируете.

Таким образом скорость обработки в целом возрастет, равно как и результат найти или 100% совпадение.
Человек_Борща вне форума Ответить с цитированием
Старый 13.08.2013, 18:04   #9
egorka2134
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 40
По умолчанию

Bcem cnacubo
egorka2134 вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы. Чтение и создание .bmp изображения. Пропадает 1 пиксел при создании изображения. s-mumrik Visual C++ 3 12.04.2013 20:21
Изображения Tuman777 Мультимедиа в Delphi 10 16.10.2011 20:11
Изображения в C# MeTeOpA C# (си шарп) 11 25.05.2011 14:57
Чтение изображения из базы данных, Вместо изображения - "System.Byte[]" ruelCrow Общие вопросы .NET 3 10.07.2008 22:29
Изображения в БД alikon1 БД в Delphi 3 08.10.2007 12:13


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS