Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Попиксельное сравнение картинок 
:(
    Опции темы
buena_suerte
Дата 21.4.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) buena_suerte - 21.4.2007, 16:40
PM MAIL   Вверх
Klin
Дата 21.4.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Сравнение изображений сложный процесс (если делать качественно), главное составить граммотный алгоритм. Вот элементарное опредение цвета в точке:
Код

 Image1->Canvas->Pixels[X][Y];



--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
mr.Anderson
Дата 21.4.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Klin, а чем плохо, например, элементарно сравнить все пикселы первой картинки и второй (по цвету) ? Затем вычислить процент совпадений. Если алг плох, скажите, чем.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
buena_suerte
Дата 21.4.2007, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



Klin,спасибо и за это smile 
Цитата(mr.Anderson @ 21.4.2007,  20:08)
Klin, а чем плохо, например, элементарно сравнить все пикселы первой картинки и второй (по цвету) ? Затем вычислить процент совпадений. Если алг плох, скажите, чем.

плизз,а можно чуть поподробней ваш алгоритм,если не трудно?))

PM MAIL   Вверх
Klin
Дата 21.4.2007, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Цитата(mr.Anderson @  21.4.2007,  21:08 Найти цитируемый пост)
чем плохо, например, элементарно сравнить все пикселы первой картинки и второй (по цвету) ? Затем 

Очень мудро, попробуйте сравнить две картинки одинакового размера, состоящие из двух равных прямоугольников. В первой картинке сверху будет черный, снизу белый. А во второй сверху белый, а с низу черный. И что это даст? Обратные изображения будут совподать на 100%. Вот вам и элементарное попиксельное сравнение.


Цитата(buena_suerte @  21.4.2007,  22:56 Найти цитируемый пост)
плизз,а можно чуть поподробней ваш алгоритм,если не трудно?))

Этот способ подойдет вам, если вам нужно определить закрашен ли квадрат (стоит ли галка в пунке)


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Grom
Дата 22.4.2007, 00:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 17.8.2006
Где: Москва

Репутация: 1
Всего: 1



Klin, 
Цитата

А во второй сверху белый, а с низу черный. И что это даст? Обратные изображения будут совподать на 100%. Вот вам и элементарное попиксельное сравнение.


так ведь сравнение попиксельное. т.е. пиксель с координатой x=1 y=1 должен быть равен пикселю с такими же координатами в другой картинке. по этому верх - них тут значения не имеет ведь  smile 
--------------------
Хостинг, Vds, Dedicated serve, регистрация доменов (RU,com,net,org) - обращаться в icq.
PM MAIL   Вверх
mr.Anderson
Дата 22.4.2007, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Именно так. Мы сравниваем именно каждый конкретный пиксел с точно таким же пикселом на другой картинке. Если они по цвету совпадут, то ставим + в количество совпадений. При чем тут обратные изображения? Короче, я думаю, что вот это будет работать вполне неплохо (код не проверял, правда). Только сначала попробуйте, прежде чем делать выводы.
Код

int __fastcall CompareImages( TImage *Src1, TImage *Src2 )
{
 if( ( Src1->Width != Src2->Width ) || ( Src1->Height != Src2->Height ) )
 {
  Application->MessageBox( "Можно сравнивать только изображения одинаковых размеров", "Ошибка сравнения изображений", MB_OK );
  return;
 }

 long allPixels = Src1->Height * Src1->Width; //общее количество пикселов
 long equalPixels = 0; //количество совпадений

 for( int i=0; i<Src1->Width; i++ )
  for( int j=0; j<Src1->Height; j++ )
   if( Src1->Canvas->Pixels[ i ][ j ] == Src2->Canvas->Pixels[ i ][ j ] )
    ++equalPixels;

 return ( equalPixels * 100 / allPixels ); //возвращаем процент совпадения картинок
}

Функция вернет процент совпадения картинок. Есть только два минуса - картинки должны быть одинакового размера и только в формате *BMP.

Это сообщение отредактировал(а) mr.Anderson - 22.4.2007, 12:39


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
buena_suerte
Дата 22.4.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



mr.Anderson, заранее огромное вам человеческое спасибо,сейчас попробую)


ребята, а может вы знаете как лучше сделать привязку к координатом на картинке,чтобы точно сравнивать определенный фрагмент,загружаемой картинки и той что хранится в памяти?
а в общем по идее у них размеры одинаковые, но чтоб по положению всё совпадало...
PM MAIL   Вверх
mr.Anderson
Дата 22.4.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



buena_suerte, я уже попробовал, функция возвращает процент совпадений картинок. Работает отлично. smile 

Насчет вашего вопроса о привязке - просто нужно начинать сравнение пикселов не с нуля (как в моем примере), а с того места, с которого вам нужно. Ну и, соответственно, заканчивать нужно тоже в определенном месте.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
mr.Anderson
Дата 22.4.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Ну, помогло ли?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Klin
Дата 22.4.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Цитата(Grom @  22.4.2007,  01:51 Найти цитируемый пост)
так ведь сравнение попиксельное. т.е. пиксель с координатой x=1 y=1 должен быть равен пикселю с такими же координатами в другой картинке. по этому верх - них тут значения не имеет ведь  

Сорри, что-то я по ночам туго мыслить стал.  smile  Что-то с памятью мою сталось... smile


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
buena_suerte
Дата 22.4.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



Цитата(mr.Anderson @ 22.4.2007,  12:38)
buena_suerte, я уже попробовал, функция возвращает процент совпадений картинок. Работает отлично. smile 

Насчет вашего вопроса о привязке - просто нужно начинать сравнение пикселов не с нуля (как в моем примере), а с того места, с которого вам нужно. Ну и, соответственно, заканчивать нужно тоже в определенном месте.

да, очень вам благодарен)))))))
а по поводу привязки, там еще имелось ввиду как лучше определить координаты той области,чтобы ввести их, ну да ладно
спасибо
PM MAIL   Вверх
fish9370
Дата 22.4.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Цитата(mr.Anderson @ 21.4.2007,  20:08)
Klin, а чем плохо, например, элементарно сравнить все пикселы первой картинки и второй (по цвету) ? Затем вычислить процент совпадений. Если алг плох, скажите, чем.

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

хотя тут, конечно, все зависит от задачи.. проигнорируйте этот пост..

Добавлено через 2 минуты и 54 секунды
Цитата(buena_suerte @ 22.4.2007,  17:33)
а по поводу привязки, там еще имелось ввиду как лучше определить координаты той области,чтобы ввести их, ну да ладно
спасибо

а по поводу привязки, думаю, никто не понял, что ты имеешь ввиду.. какая еще привязка?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
buena_suerte
Дата 22.4.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) buena_suerte - 22.4.2007, 19:03
PM MAIL   Вверх
fish9370
Дата 22.4.2007, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Цитата(buena_suerte @ 22.4.2007,  19:00)
ну мы загрузили допустим картинку в Image, и нам нужна не вся картина для сравнения,а определенный её фрагмент,так вот,нужно вычислить координаты этого фрагмента,чтобы с другой загружаемой картинкой можно было производить сравнение точно, в этом же месте...

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

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

Код

int __fastcall CompareImages( TImage *Src1, TImage *Src2, int nLeft, int nTop, int nWidth, int nHeight )
{
 long allPixels = nHeight * nWidth; //общее количество пикселов
 long equalPixels = 0; //количество совпадений

 for( int i=0; i<nWidth; i++ )
  for( int j=0; j<nHeight; j++ )
   if( Src1->Canvas->Pixels[ i+nLeft ][ j+nHeight ] == Src2->Canvas->Pixels[ i+nLeft ][ j+nHeight ] )
    ++equalPixels;

 return ( equalPixels * 100 / allPixels ); //возвращаем процент совпадения картинок
}


P.S.  тут попрежднему не реализована аппроксимация.. и такие одинаковые цвета как 0xFF0000 и 0xFE0000 будут считаться разными.. результат получишь отрицательный.. учти это..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0621 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.