Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.045 c
2-1147451540
mixa
2006-05-12 20:32
2006.06.04
DBGrid


3-1144930044
RomanH
2006-04-13 16:07
2006.06.04
Использование User Defined Functions


2-1147931585
Tempora
2006-05-18 09:53
2006.06.04
Application.terminate а программа продолжает работать


2-1147960022
Mozgan
2006-05-18 17:47
2006.06.04
Работа с модемом


2-1148045632
tort
2006-05-19 17:33
2006.06.04
Запуск программы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский