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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2010, 12:47   #21
koshel
Пользователь
 
Аватар для koshel
 
Регистрация: 03.02.2010
Сообщений: 38
Печаль

Блин уже третий день ламаю голову как выделить елипсом или кругом на оригинале те области которые были отфильтрованые и ничего не могу придумать. Ни у кого нет никаких идей по реализации этой проблемы???
koshel вне форума Ответить с цитированием
Старый 23.02.2010, 13:12   #22
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

как вариант:
1) находишь черную точку
2) рекурсивно пробегаешь по рядом стоящим точкам
3) из полученных координат находишь минимальные и максимальные X и Y для построения прямоугольной области
4) имеешь прямоугольник или рассчитываешь вписанную окружность
x128 вне форума Ответить с цитированием
Старый 23.02.2010, 17:00   #23
koshel
Пользователь
 
Аватар для koshel
 
Регистрация: 03.02.2010
Сообщений: 38
По умолчанию

чет все равно я не могу догнать.
Цитата:
рекурсивно пробегаешь по рядом стоящим точкам
это просто по ряду Х и У??
а как найти следующую зону??
koshel вне форума Ответить с цитированием
Старый 23.02.2010, 17:43   #24
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Цитата:
Сообщение от koshel Посмотреть сообщение
чет все равно я не могу догнать.
это просто по ряду Х и У??
просто обходишь все пикселы в окружении найденного
Цитата:
а как найти следующую зону??
как логика подскажет, можно просто проверенные пикселы обнулять и после нахождения очередной зоны переходить к следующим пикселам.

Последний раз редактировалось x128; 23.02.2010 в 17:54.
x128 вне форума Ответить с цитированием
Старый 23.02.2010, 17:51   #25
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

попробовал реализовать предложенную схему, в общем работает =)
test.png

Последний раз редактировалось x128; 23.02.2010 в 17:57.
x128 вне форума Ответить с цитированием
Старый 23.02.2010, 18:54   #26
koshel
Пользователь
 
Аватар для koshel
 
Регистрация: 03.02.2010
Сообщений: 38
По умолчанию

А код можно глянуть???
Я попробовал обеденить мелкие зоны,что бы кусков не было, и потом по этим зонам выделять так ничего не вышло(( опыта маловато наверное что то пропускаю((
koshel вне форума Ответить с цитированием
Старый 23.02.2010, 19:59   #27
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Код:
var
  xmax,ymax: integer;
  pnt: array of TPoint;
  rects: array of TRect;
...

procedure RegionSearch(x,y: integer);
var
  src: pByteArray;
begin
  if (x<0) or (x>=xmax) or (y<0) or (y>=ymax) then exit;
  src:=form1.Image1.Picture.Bitmap.ScanLine[y];
  if src[x*3]=0 then begin
    SetLength(pnt, length(pnt)+1);
    pnt[length(pnt)-1]:=Point(x,y);
    src[x*3]:=255;

    RegionSearch(x+1,y+0);
    RegionSearch(x+0,y+1);
    RegionSearch(x+1,y+1);
    RegionSearch(x-1,y+0);
    RegionSearch(x+0,y-1);
    RegionSearch(x-1,y-1);
    RegionSearch(x+1,y-1);
    RegionSearch(x-1,y+1);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x,y,i: integer;
  minx,miny,maxx,maxy: integer;
  src: pByteArray;
begin
  if OpenPictureDialog1.Execute then begin
    image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    xmax:=image1.Width;
    ymax:=image1.Height;
    rects:=nil;
    for y:=0 to ymax-1 do begin
      src:=image1.Picture.Bitmap.ScanLine[y];
      for x:=0 to xmax-1 do begin
        if src[x*3]=0 then begin
          pnt:=nil;
          RegionSearch(x,y);
          minx:=maxint; miny:=maxint; maxx:=0; maxy:=0;
          for i:=0 to length(pnt)-1 do if pnt[i].X<minx then minx:=pnt[i].X;
          for i:=0 to length(pnt)-1 do if pnt[i].X>maxx then maxx:=pnt[i].X;
          for i:=0 to length(pnt)-1 do if pnt[i].Y<miny then miny:=pnt[i].Y;
          for i:=0 to length(pnt)-1 do if pnt[i].Y>maxy then maxy:=pnt[i].Y;
          SetLength(rects, length(rects)+1);
          rects[length(rects)-1]:=Rect(minx, miny, maxx+1, maxy+1);
        end;
      end;
    end;
    image1.Canvas.Pen.Color:=clRed;
    image1.Canvas.Brush.Style:=bsClear;
    for i:=0 to length(rects)-1 do image1.Canvas.Ellipse(rects[i]);
  end;
end;
x128 вне форума Ответить с цитированием
Старый 23.02.2010, 20:26   #28
koshel
Пользователь
 
Аватар для koshel
 
Регистрация: 03.02.2010
Сообщений: 38
По умолчанию

СПАСИБО ОГРОМНОЕ!

Последний раз редактировалось mihali4; 10.03.2010 в 18:40.
koshel вне форума Ответить с цитированием
Старый 09.03.2010, 16:09   #29
koshel
Пользователь
 
Аватар для koshel
 
Регистрация: 03.02.2010
Сообщений: 38
По умолчанию

Не могли бы вы еще раз мне помоч, не подскажите как из вашей процедуры поочереди вытянуть кординаты всех елипсов и по их кординатам вернуть из орегинала изображения??
koshel вне форума Ответить с цитированием
Старый 10.03.2010, 10:24   #30
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Код:
for i:=0 to length(rects)-1 do image1.Canvas.Ellipse(rects[i]);
В этой строчке вывод эллипсов, rects это массив с координатами, т.е. все уже есть. Какая сложность скопировать оригинальные данные по имеющимся координатам?
x128 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выявление повторяющихся лиц из таблицы Ferrari-51 Помощь студентам 5 26.10.2009 18:49
Распознание формул в Delphi mud girl Компоненты Delphi 5 29.05.2009 09:27
Распознавание(обнаружение) лиц на фотографии Бзик Мультимедиа в Delphi 4 18.02.2009 23:15
Распознание цифр на изображении slashy Помощь студентам 4 29.04.2008 16:14
Распознание текста DOLBY Общие вопросы Delphi 13 14.02.2008 13:31