Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

Окнтуривание изображений   Найти похожие ветки 

 
vitaliy14   (2005-12-25 10:37) [0]

помогите найти пример реализации оконтуривания изображений (с порогом или без) и операторов Собеля и Робертса!

зы не суть важен конкретный алгоритм, важнее сам результат

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


 
vitaliy14   (2005-12-25 16:32) [1]

Никто не сталкивался с подобным :( я думал задача известная?


 
Glex ©   (2005-12-25 16:46) [2]

Воскресенье сегодня. Да и Рождество к тому же =)


 
programania ©   (2005-12-25 23:12) [3]

Размыть и разница с исходным будет контур
однако для фотографии реального мира эти контура бесполезны


 
vitaliy14   (2005-12-26 10:08) [4]

Воскресенье сегодня. Да и Рождество к тому же =)

Мы ж не католики!  ну очень нужно


 
DVM ©   (2005-12-26 10:35) [5]

Ищи в инете компонент TMED (TMotionDetector) там одна из функции как раз то что надо


 
Чапаев ©   (2005-12-26 10:53) [6]


> функция должна получатьв качестве параметра битмэп (цветное
> изображение bmp переведенное в серый полутон) на выходе
> должен быть битмэп, который представляет из себя изображение
> с выделенными контурами!

Поищи книгу Прэтта "Цифровая обработка изображений".

В общем, тебе нужно провести свёртку исходного изображения и матрицы вида
((1,1,1),
(1,-8,1),
(1,1,1))


 
Анонимщики ©   (2005-12-26 13:37) [7]

Реализация есть в матлабе и интелловском OpenCV


 
Danemon ©   (2005-12-26 22:49) [8]

Я сделал в своей программке такой код:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
a:=true;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
if a=true then
  begin
  getcursorpos(pt);
  form1.Image1.Canvas.LineTo(координаты курсора мыши);
  end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
a:=false;
image1.Canvas.Brush.Color:=$ffffff;
image1.Canvas.FillRect(canvas.ClipRect);
end;

а - глобальная переменная логическая. При нажатии на image1 ей присваивается true, при отпускании - false. Дальше при перемещении курсора над image1 проверяется, нажата ли кнопка мыши, и если так - рисуется линия вслед за курсором.
Таким образом я сам указываю все нужные границы. Просто картинки мои имеют много границ, которые никаким алгоритмом не возьмешь - только человеческим могом ::)


 
DVM ©   (2005-12-27 10:21) [9]


> которые никаким алгоритмом не возьмешь - только человеческим
> могом ::)

возьмешь еще как.


 
Кефир87 ©   (2005-12-27 23:10) [10]

В прошлом году один знакомый моего знакомого защитил дисертацию в МГУ по этой теме. Я был на его защите. Впечатляет. Несколько лет над дисертацией работал... Тема была... что-то в духе "Фрагментация изображений... бла-бла-бла ... выделение объектов ... бла-бла-бла ... для алгоритмов сжатия ... бла-бла-бла"... ВМК...


 
Danemon ©   (2005-12-28 21:23) [11]

Мне показывали алгоритм в MatLAB который этим "оконтуриванием" занимается - бред полный, совершенно не подходил под мое задание. Работал долго, находил не все а самое явное, и вообще - нехороший алгоритм короче.


 
Gorger ©   (2005-12-29 01:25) [12]

Лови функцию, которая строит регион по битмапу. Вместо setWindowRgn напиши Bmp.Canvas.Polygon(Pointz) и сохрани Bmp - задача решена!
В этом примере в качестве исходного береться файл Panel.Bmp (переменная Pbmp)

type DotPointer=^TPoint;
var
Pointz:array of TPoint;
dp:DotPointer;
contourList:TList;
dL:Tlist;
nulldp:DotPointer;
C,C1:COLORREF;
Bwork:Tbitmap;
i,j,jj,k,n:integer;
Reg2:HRGN;
begin
New(nulldp);
dl:=TList.Create;
ContourList:=Tlist.Create;
C:=0;
i:=1;n:=1;k:=0;
C:=clBlack;
Bwork:=TBitmap.Create;
Bwork.Assign(Pbmp);
for i:=0 to Bwork.Height-1 do begin
Pba:=Bwork.ScanLine[i];
for j:=0 to (Bwork.Width*3)-1 do begin
If (Pba[j]=255) then Pba[j]:=0 else Pba[j]:=255;
end;
end;
i:=0;
BitBlt(Form2.Canvas.Handle,0,0,PbMp.Width,PBmp.Height,Pbmp.Canvas.Handle,0,0,SRCCOPY);
Bwork.SaveToFile("1mas.bmp");
for i:=1 to Bwork.Width do begin
for j:= 1 to Bwork.Height do begin
C:=GetPixel(Bwork.Canvas.Handle,i,j);
C1:=GetPixel(Bwork.Canvas.Handle,i,j+1);
if (C1 <> C) then begin
if j<>Bwork.height-1 then begin
New(dp);
dp^.X:=i;
dp^.Y:=j;
dl.Add(dp);
end;
end;
end;
end;
i:=0;
n:=dl.Count;
k:=0;
nulldp.X:=0;
nulldp.Y:=0;
While i<=Dl.Count-5 do begin
j:=i+1;
k:=0;
While j<=i+5   do begin
if j<Dl.Count then begin
if TPoint(dl.Items[j]^).X=TPoint(dl.Items[i]^).X+1 then begin
if k=0 then begin
inc(k);
new(nulldp);
nulldp^:=TPoint(dl.Items[j]^);
ContourList.Add(nulldp);
end else inc(k);
end;
end;
inc(j);
end;
inc(i,k);
end;
For i:=0 to dl.Count-1 do begin
if i<Dl.Count then begin
For j:=0 to ContourList.Count-1 do begin
if (TPoint(Dl.Items[i]^).X =TPoint(ContourList.Items[j]^).X )and  (TPoint(Dl.Items[i]^).Y =TPoint(ContourList.Items[j]^).Y)
then dl.Delete(i);
end;
end;
end;
For i:=dl.Count-1 downto 0 do ContourList.Insert(ContourList.Count,dl.Items[i]);
i:=0;
While i<ContourList.Count-1 do begin
n:=i+1;
nulldp:=nil;
if n+1<ContourList.Count-1 then begin
While (TPoint(ContourList.Items[n]^).Y=TPoint(ContourList.Items[n+1]^).Y) and (n<ContourList.Count-1)
do begin ContourList.Delete(n); inc(n);
end;
end;
inc(i);
end;
SetLength(Pointz,ContourList.Count);
For i:=0 to ContourList.Count-1 do Pointz[i]:=TPoint(ContourList.Items[i]^);
Form2.Canvas.Brush.Color:=clGreen;
Form2.Canvas.Polygon(Pointz);
for i:=0 to Length(Pointz)-1 do Pointz[i].Y:=Pointz[i].Y+50;
Bwork.LoadFromFile("Panel.bmp");
SetWindowRgn(Form2.Handle,Reg2,True);
BitBlt(Form2.Canvas.Handle,-5,0+24,Bwork.Width,Bwork.Height,Bwork.Canvas.Handle,0,0,SRCCOPY);
dl.Free;
ContourList.Free;

end;



 
Gorger ©   (2005-12-29 01:37) [13]

вместо
Form2.Canvas.PolyGon(Pointz)
напиши

MyResultBmp.Canvas.PolyGon(Pointz)

SetWindowRgn убери, последний BitBlt тоже

BitBlt(Form2.Canvas.Handle,0,0,PbMp.Width,PBmp.Height,Pbmp.Canvas.Handle,0,0,SRCCOPY);

тоже ни к чему, это просто была проверка правильности работы программы.


 
Grief ©   (2005-12-31 16:14) [14]

http://grief-postal.narod.ru/archives/cartoonizer.zip
Это делал я, но алгоритм хреновенький, да и GDI используетсЯ, поэтому медленно, но, если надо, сорсы дам.



Страницы: 1 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.048 c
2-1147931585
Tempora
2006-05-18 09:53
2006.06.04
Application.terminate а программа продолжает работать


15-1147080257
Барабан
2006-05-08 13:24
2006.06.04
С какой целью интересуются?


9-1130920156
Zadiakas
2005-11-02 11:29
2006.06.04
Анимация для модели


3-1144488504
beglec
2006-04-08 13:28
2006.06.04
MS SQL или MySQL


2-1147842279
Officeman
2006-05-17 09:04
2006.06.04
<> или =