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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2009, 17:44   #1
Cerebrum
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 24
По умолчанию Как найти координаты всех пиксели объекта?

Встал перед задачей:
На bmp изображении есть тела черного цвета самой причудливой формы, надо узнать координаты пикселей, которые входят в тот или иной объект изображения.перебераю пиксели пока не встречу первый черный.Потом думал рекурсивную функцию закинуть, но вот не знаю как организовать обработку того что соседе белые или черные(соседей 8). Перебирать все 256 вариантов для рекурсии нет смысла, а вот что-то более рациональное на ум не приходит.Может кто и сталкивался с такого рода задачами...Bmp можно перекрашивать на серый тон...

P.S. Если что-то непонятно, уточню.
Cerebrum вне форума Ответить с цитированием
Старый 05.05.2009, 17:59   #2
Iceman
Форумчанин
 
Регистрация: 08.07.2007
Сообщений: 154
По умолчанию

тоесть те надо знать линию граници ? можно попробовать найти 1.(любую) точьку етой линии и идти по ней проверая в куда она ведет. сгодитса только если границу обекта можно высказать как одну линию.
Iceman вне форума Ответить с цитированием
Старый 05.05.2009, 18:05   #3
Cerebrum
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 24
По умолчанию

У меня бинаризованное изображение(черный и белый цвета).Также я и с jpeg работаю(перевожу все равно в bmp). Но тут маленькая проблемка, он немного смазывает граничные пиксели.Я просто фильтрую не полностью черные пиксели и все захватывается. А вообще надо найти цент масс этого объекта(если можно так это назвать). Полюбому надо будет знать координаты всех пикселей, чтоб это посчитать. Или есть еще какой-то способ, о котором я не знаю?
Cerebrum вне форума Ответить с цитированием
Старый 05.05.2009, 18:32   #4
Cerebrum
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 24
По умолчанию

Вот придумал идиотский, но,на мой взгляд, рабочий может метод...
Можно создать массив из 8-ми элементов, каждый отвечает за свой пиксель-сосед. производить проверку по кругу. Если черный, то тру и т.д.
А потом проходиться по массиву и добавлять к к формуле текстового вида(именно текстового, а то начнет считать сразу) нужное обращение к самой функции. Вот только 1 проблема возникла: кто-то знает как из текстового вида формулу перевести в нормальный и потом посчитать?
Cerebrum вне форума Ответить с цитированием
Старый 05.05.2009, 19:10   #5
Лукманов Александр
работа не волк....
Форумчанин
 
Аватар для Лукманов Александр
 
Регистрация: 09.06.2008
Сообщений: 337
По умолчанию

Посмотри тута пятый пост. Там объясняется как узнать координаты пикселей изображения с помощью фотошоп.
Цель, для которой требуются неправые средства, не есть неправая цель.
Лукманов Александр вне форума Ответить с цитированием
Старый 05.05.2009, 19:29   #6
Cerebrum
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 24
По умолчанию

Решил проблему сам алгоритмически, там надо ветвить направления, пока все не перебирутся и все)
Cerebrum вне форума Ответить с цитированием
Старый 05.05.2009, 19:36   #7
Cerebrum
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 24
По умолчанию

один баг нашел( поспешил)

Последний раз редактировалось Cerebrum; 05.05.2009 в 19:41.
Cerebrum вне форума Ответить с цитированием
Старый 05.05.2009, 22:51   #8
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
Радость

Сам занимался подобной проблемой(кода нету - все в голове), основной смысл:
Заводим двумерный массив записей ( одла логическая и одна типа integer переменная, где логическая указывает что этот пиксель не фон, а другая идентификатор группы).
Потом в цикле по всем клеткам : каждой клетки присваиваем свой id, а если рядом клетка с меньшим id, то все пиксели с текущий id приравниваем к меньшему id.а если рядом клетка с большим id, то все большие id сравниваем с текущим id.
Надеюсь Вы хоть что-то поняли(у меня сегодня не очень "описательное" настроение), если нет обращайтесь!
Levsha100 вне форума Ответить с цитированием
Старый 06.05.2009, 16:40   #9
Cerebrum
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 24
По умолчанию

В общем написал сам)
Вот код(тут еще чуть лишнего кода, но это уже к моей программе отностится)
Код:
procedure sosed(a,b:integer);
begin
  with otpec[q] do begin
    if (GetRValue(bm.Canvas.Pixels[a-1,b])<=predelchern) and (GetGValue(bm.Canvas.Pixels[a-1,b])<=predelchern) and (GetBValue(bm.Canvas.Pixels[a-1,b])<=predelchern) then
    begin
      bm.Canvas.Pixels[a-1,b]:=clred;  //перекрашиваю, чтоб по кругу не гулять
      qp:=1+qp;                  //кол-во пикселей в нашем q-м объекте
      sosed(a-1,b);
    end;
    if (GetRValue(bm.Canvas.Pixels[a-1,b+1])<=predelchern) and (GetGValue(bm.Canvas.Pixels[a-1,b+1])<=predelchern) and (GetBValue(bm.Canvas.Pixels[a-1,b+1])<=predelchern) then
    begin
      bm.Canvas.Pixels[a-1,b+1]:=clred;
      qp:=1+qp;
      sosed(a-1,b+1);
    end;
    if (GetRValue(bm.Canvas.Pixels[a,b+1])<=predelchern) and (GetGValue(bm.Canvas.Pixels[a,b+1])<=predelchern) and (GetBValue(bm.Canvas.Pixels[a,b+1])<=predelchern) then
    begin
      bm.Canvas.Pixels[a,b+1]:=clred;
      qp:=1+qp;
      sosed(a,b+1);
    end;
    if (GetRValue(bm.Canvas.Pixels[a+1,b+1])<=predelchern) and (GetGValue(bm.Canvas.Pixels[a+1,b+1])<=predelchern) and (GetBValue(bm.Canvas.Pixels[a+1,b+1])<=predelchern) then
    begin
      bm.Canvas.Pixels[a+1,b+1]:=clred;
      qp:=1+qp;
      sosed(a+1,b+1);
    end;
    if (GetRValue(bm.Canvas.Pixels[a+1,b])<=predelchern) and (GetGValue(bm.Canvas.Pixels[a+1,b])<=predelchern) and (GetBValue(bm.Canvas.Pixels[a+1,b])<=predelchern) then
    begin
      bm.Canvas.Pixels[a+1,b]:=clred;
      qp:=1+qp;
      sosed(a+1,b);
    end;
    if (GetRValue(bm.Canvas.Pixels[a+1,b-1])<=predelchern) and (GetGValue(bm.Canvas.Pixels[a+1,b-1])<=predelchern) and (GetBValue(bm.Canvas.Pixels[a+1,b-1])<=predelchern) then
    begin
      bm.Canvas.Pixels[a+1,b-1]:=clred;
      qp:=1+qp;
      sosed(a+1,b-1);
    end;
    if (GetRValue(bm.Canvas.Pixels[a,b-1])<=predelchern) and (GetGValue(bm.Canvas.Pixels[a,b-1])<=predelchern) and (GetBValue(bm.Canvas.Pixels[a,b-1])<=predelchern) then
    begin
      bm.Canvas.Pixels[a,b-1]:=clred;
      qp:=1+qp;
      sosed(a,b-1);
    end;
    if (GetRValue(bm.Canvas.Pixels[a-1,b-1])<=predelchern) and (GetGValue(bm.Canvas.Pixels[a+1,b-1])<=predelchern) and (GetBValue(bm.Canvas.Pixels[a+1,b-1])<=predelchern) then
    begin
      bm.Canvas.Pixels[a-1,b-1]:=clred;
      qp:=1+qp;
      sosed(a-1,b-1);
    end;
  end;
end;
Вот вроде и все, вот только еще бы научится пользоваться динамическими массивами...

Последний раз редактировалось Cerebrum; 06.05.2009 в 16:57.
Cerebrum вне форума Ответить с цитированием
Старый 07.05.2009, 17:25   #10
Cerebrum
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 24
По умолчанию

Данный метод очень медленный...и ресурсов много ест если в объекте много пикселей. Нашел алгоритм намного быстрее без использования рекурсии, если кому будет интересно - обращайтесь.
Cerebrum вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Координаты всех точек в в фигуре 5naip Мультимедиа в Delphi 5 21.12.2008 18:13
Как поменять одну из текстур объекта не меняя все остальные и без повторной загрузки объекта в GLScene DomKr@t Мультимедиа в Delphi 0 14.12.2008 01:52
Найти координаты хотя бы одной точки, попадающей в область, образованную тремя пересекающимися линиями. Zibiv Помощь студентам 1 03.10.2008 17:55
Как найти размер объекта Sibedir Общие вопросы Delphi 12 21.11.2007 06:17
Координаты курсора относительно объекта на форме CoDeR Общие вопросы Delphi 4 01.08.2007 22:49