|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
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 |
Форумчанин
Регистрация: 21.01.2012
Сообщений: 240
|
Изображение состоит по сути из 2 цветов: ярко-фиолетового и другого. Алгоритм заливки третьим цветом с затравкой в месте клика обозначит площадь конкретного объекта, на который кликнули. После этого у нас получилось изображение из 3 цветов: фиолетового, другого, 3-го цвета объекта. А потом 1 пиксельная обрисовка в прямоугольнике в пределах этого объекта (по пикселям 3-го цвета можно определить размер, т.е. по их наиболее дальнему расположению относительно места клика) с проверкой разнообразных условий "если этот пиксель не 3-го цвета, а правее на один - 3-го цвета", "если этот пиксель 3-го цвета, а правее на один - не 3-го либо граница рисунка", и также в другие стороны (левее, выше, ниже) позволит нарисовать 1-пиксельный контур снаружи объекта 3-го цвета либо на краю внутри объекта 3-го цвета, и, таким образом, подсветить его.
|
31.08.2014, 16:27 | #4 |
Форумчанин
Регистрация: 07.11.2011
Сообщений: 161
|
Можно вот так сделать, из исходника думаю понятно(но это только для прямоугольных изображений):
Последний раз редактировалось DIONISKA; 31.08.2014 в 16:33. |
31.08.2014, 17:15 | #5 |
Участник клуба
Регистрация: 12.09.2012
Сообщений: 1,030
|
А может дело в том, что каждая картинка является отдельным битмапом? Так можно через координаты проверить.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби. |
01.09.2014, 10:21 | #6 | ||||
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Цитата:
Цитата:
Цитата:
Цитата:
Вместо 3го цвета попробую пропускать пиксели цвета не BGCOLOR. Последний раз редактировалось Человек_Борща; 01.09.2014 в 10:24. |
||||
01.09.2014, 13:25 | #7 |
Форумчанин Подтвердите свой е-майл
Регистрация: 01.12.2006
Сообщений: 514
|
а зачем третий цвет, не лучше ли хранить в памяти исходное изображение, и в нем искать Fuchsia или не Fuchsia, а на имедж выводить уже с обводкой?!
Пишу на Delphi за еду
|
01.09.2014, 14:13 | #8 | |
Форумчанин
Регистрация: 21.01.2012
Сообщений: 240
|
Цитата:
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. |
|
01.09.2014, 15:05 | #9 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Интересный метод. Попробую сегодня Ещё нагуглил волновой алгоритм. Если водна будет идти в 4 стороны, исходя из точки клика, то вполне успешно можно будет добиться и скорости и результата, когда волна дойдет до берегов озера(1) в земле(0), подсветить края земли. НО это пока теория..
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Алгоритм поиска | 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 |