Форум: "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.053 c