Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.08.2014, 12:24   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос Алгоритм поиска картики в картинке

Доброго времени суток!

Есть целое изображение:

фоновый цвет, это: Fuchsia

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

Моя задача:
Юзер мышкой выбирает картинку, и её края подсвечиваются, записываются координаты этой картинки.

Как это делает волшебная палочка в Paint.Net и фотошопе.

Какой алгоритм применить, как лучше искать?

Последний раз редактировалось Человек_Борща; 01.09.2014 в 10:15.
Человек_Борща вне форума Ответить с цитированием
Старый 31.08.2014, 13:29   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

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

Последний раз редактировалось Аватар; 31.08.2014 в 13:40.
Аватар вне форума Ответить с цитированием
Старый 31.08.2014, 14:06   #3
blackstrip
Форумчанин
 
Аватар для blackstrip
 
Регистрация: 21.01.2012
Сообщений: 240
По умолчанию

Изображение состоит по сути из 2 цветов: ярко-фиолетового и другого. Алгоритм заливки третьим цветом с затравкой в месте клика обозначит площадь конкретного объекта, на который кликнули. После этого у нас получилось изображение из 3 цветов: фиолетового, другого, 3-го цвета объекта. А потом 1 пиксельная обрисовка в прямоугольнике в пределах этого объекта (по пикселям 3-го цвета можно определить размер, т.е. по их наиболее дальнему расположению относительно места клика) с проверкой разнообразных условий "если этот пиксель не 3-го цвета, а правее на один - 3-го цвета", "если этот пиксель 3-го цвета, а правее на один - не 3-го либо граница рисунка", и также в другие стороны (левее, выше, ниже) позволит нарисовать 1-пиксельный контур снаружи объекта 3-го цвета либо на краю внутри объекта 3-го цвета, и, таким образом, подсветить его.
blackstrip вне форума Ответить с цитированием
Старый 31.08.2014, 16:27   #4
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

Можно вот так сделать, из исходника думаю понятно(но это только для прямоугольных изображений):
Вложения
Тип файла: rar img.rar (59.8 Кб, 14 просмотров)

Последний раз редактировалось DIONISKA; 31.08.2014 в 16:33.
DIONISKA вне форума Ответить с цитированием
Старый 31.08.2014, 17:15   #5
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

А может дело в том, что каждая картинка является отдельным битмапом? Так можно через координаты проверить.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 01.09.2014, 10:21   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Можно вот так сделать, из исходника думаю понятно(но это только для прямоугольных изображений):
Цитата:
Изображения могут быть любой формы.
Цитата:
А может дело в том, что каждая картинка является отдельным битмапом? Так можно через координаты проверить.
Имея координаты картинок, я могу и сам подсветить отдельные картинки. Мне надо не имея координат, подсветить картинку и получить регион полигонов границы объекта, который является картинкой X и формы Y.

Цитата:
Изображение состоит по сути из 2 цветов: ярко-фиолетового и другого. Алгоритм заливки третьим цветом с затравкой в месте клика обозначит площадь конкретного объекта, на который кликнули. После этого у нас получилось изображение из 3 цветов: фиолетового, другого, 3-го цвета объекта. А потом 1 пиксельная обрисовка в прямоугольнике в пределах этого объекта (по пикселям 3-го цвета можно определить размер, т.е. по их наиболее дальнему расположению относительно места клика) с проверкой разнообразных условий "если этот пиксель не 3-го цвета, а правее на один - 3-го цвета", "если этот пиксель 3-го цвета, а правее на один - не 3-го либо граница рисунка", и также в другие стороны (левее, выше, ниже) позволит нарисовать 1-пиксельный контур снаружи объекта 3-го цвета либо на краю внутри объекта 3-го цвета, и, таким образом, подсветить его.
Идея хорошая, но с какой вероятностью на 32хбитном изображении я встречу 3й цвет?
Вместо 3го цвета попробую пропускать пиксели цвета не BGCOLOR.

Последний раз редактировалось Человек_Борща; 01.09.2014 в 10:24.
Человек_Борща вне форума Ответить с цитированием
Старый 01.09.2014, 13:25   #7
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 514
По умолчанию

а зачем третий цвет, не лучше ли хранить в памяти исходное изображение, и в нем искать Fuchsia или не Fuchsia, а на имедж выводить уже с обводкой?!
Пишу на Delphi за еду
Toxa вне форума Ответить с цитированием
Старый 01.09.2014, 14:13   #8
blackstrip
Форумчанин
 
Аватар для blackstrip
 
Регистрация: 21.01.2012
Сообщений: 240
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Идея хорошая, но с какой вероятностью на 32хбитном изображении я встречу 3й цвет?
Вместо 3го цвета попробую пропускать пиксели цвета не BGCOLOR.
Все дела с 2 или 3 цветами делаются на отдельной маске либо на логике if (цвет = ). На исходном рисунке конечно не надо помечать ничего цветами, т.к. можно налететь на цвет какой нибудь точки, точно совпадающий с выбранным для пометки цветом. Т.е. можно это вообще превратить в отдельную маску 3-х цветную. Делаем новый рисунок, в него в цикле перекопируем пиксели все с первоначального рисунка с условиями:
1) если пиксель фиолетовый Fuchsia - то кладем в точку 0
2) если пиксель не фиолетовый Fuchsia, а другой - то кладем в точку 1.

Затем при работе алгоритма заливки лазим по этой маске и помечаем залитые точки цветом 2.

Вот и получается трехцветная маска. Просто если время работы алгоритма критично, тогда лучше не делать этих лишних действий, а сделать так:
1) создаем новый рисунок, заливаем цветом 0 весь этот рисунок.
2) при работе алгоритма заливки цвета 0 (Fuchsia) и 1 (не Fuchsia) отличаем на исходном рисунке с помощью простого условия (цвет = Fuchsia), а результат заливки кладем не в исходный рисунок, а в новый, созданный в п.1, при том помечаем залитые точки на этом новом рисунке, допустим, цветом 1.

В итоге получим в новом рисунке 2-х цветную маску выбранного объекта. Дальше уже дело техники: обрисовка 1-пиксельная цветом 2 на этом рисунке и перенос всех пикселей цвета 2 (т.е. полученного контура) в цикле на исходный рисунок в виде пикселей уже нужного цвета (rgb-шного, желтого какого-нибудь, смотря какого цвета контур нужен).

Примерно так:


Последний раз редактировалось blackstrip; 01.09.2014 в 14:38.
blackstrip вне форума Ответить с цитированием
Старый 01.09.2014, 15:05   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Интересный метод. Попробую сегодня Ещё нагуглил волновой алгоритм. Если водна будет идти в 4 стороны, исходя из точки клика, то вполне успешно можно будет добиться и скорости и результата, когда волна дойдет до берегов озера(1) в земле(0), подсветить края земли. НО это пока теория..
Человек_Борща вне форума Ответить с цитированием
Старый 01.09.2014, 15:58   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Такое подойдёт ? Исходник откопаю
Если нет реги на кибере, прикреплю попозже.
Комбо-брейк! посты2260-1130репа
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм поиска Sylar9 Общие вопросы C/C++ 0 03.04.2012 12:38
A* алгоритм поиска Nicko_mt Помощь студентам 2 04.10.2011 02:24
алгоритм поиска незнайка_на_земле Помощь студентам 4 08.03.2011 10:46
Алгоритм поиска!!!! vit1990 Помощь студентам 14 29.01.2011 21:18
Алгоритм поиска... Johnson Общие вопросы Delphi 1 26.10.2008 08:35