|
Обработка изображений с использованием расширения процессора |
ivps xmm1,xmm0//K.Weights[j]/tempmovups xmm_n,xmm1end;for na:=0 to nmax do beginif (j<=_high) thenK.Weights[j]:=xmm_n[na]else break; inc(j);end;end;//whileasmpop edxpop ecxpop ebxpop eaxend;end;//TrimInt - округление по указаным границам Integerfunction TrimInt(Lower, Upper, theInteger: integer): integer;beginif (theInteger <= Upper) and (theInteger >= Lower) thenresult := theIntegerelse if theInteger > Upper thenresult := Upperelseresult := Lower;end;//TrimReal - округление по указанным рамкам Realfunction TrimReal(Lower, Upper: integer; x: double): integer;beginif (x < upper) and (x >= lower) thenresult := trunc(x)else if x > Upper thenresult := Upperelseresult := Lower;end;//BlurRow - размытие строки без SSEprocedure BlurRow(var theRow: array of TPxlC; K: TKernel; P: PRow);varj, n: integer;tr, tg, tb: double; //tempRed и др.w: double;beginfor j := 0 to High(theRow) dobegintb := 0;tg := 0;tr := 0;for n := -K.Size to K.Size dobeginw := K.Weights[n];//TrimInt задает отступ от края строки...with theRow[TrimInt(0, High(theRow), j - n)] dobegintb := tb + w * b;tg := tg + w * g;tr := tr + w * r;end;//withend;//forwith P[j] dobeginb := TrimReal(0, 255, tb);g := TrimReal(0, 255, tg);r := TrimReal(0, 255, tr);end;end; Move(P[0], theRow[0], (High(theRow) + 1) * Sizeof(TPxlC));end;//GBlur - полное размытие картинкиprocedure GBlur(theBitmap: TBitmap; radius: double; withSSE:boolean);varRow, Col: integer;theRows: PPRows;K: TKernel;ACol: PRow;P: PRow;beginif (theBitmap.HandleType <> bmDIB) or (theBitmap.PixelFormat <> pf24Bit) thenraiseexception.Create('GBlur может работать только с 24-битными изображениями');if (withSSE) then MakeGaussianKernelSSE(K, radius, 255, 1)else MakeGaussianKernel(K, radius, 255, 1);GetMem(theRows, theBitmap.Height * SizeOf(PRow));GetMm(ACol, theBitmap.Height * SizeOf(TPxlC));frm_img.img_pbar.Max:=theBitmap.Height+theBitmap.Width+4;//запись позиции данных изображения:for Row := 0 to theBitmap.Height - 1 dotheRows[Row] := theBitmap.Scanline[Row];//размываем каждую строчку:P := AllocMem(theBitmap.Width * SizeOf(TPxlC));if (frm_imgbluropts.CheckBox1.Checked) then beginfor Row := 0 to theBitmap.Height - 1 do beginBlurRow(Slice(theRows[Row]^, theBitmap.Width), K, P);frm_img.img_pbar.StepBy(1);end;end;//теперь размываем каждую колонкуReAllocMem(P, theBitmap.Height * SizeOf(TPxlC));if (frm_imgbluropts.CheckBox2.Checked) then beginfor Col := 0 to theBitmap.Width - 1 dobegin//- считываем первую колонку в TRow:frm_img.img_pbar.StepBy(1);for Row := 0 to theBitmap.Height - 1 doACol[Row] := theRows[Row][Col];BlurRow(Slice(ACol^, theBitmap.Height), K, P);//теперь помещаем обработанный столбец на свое место в данные изображения:for Row := 0 to theBitmap.Height - 1 dotheRows[Row][Col] := ACol[Row];end;end; FreeMem(theRows);FreeMem(ACol);ReAllocMem(P, 0);frm_img.img_pbar.Max:=0;end;//end blur--------------------------------------------------------------------- //открыть картинкуprocedure Tfrm_img.act_srcOpenImageExecute(Sender: TObject);beginif (img_OpenPictureDialog.Execute) then beginimg_src.Picture.LoadFromFile(img_OpenPictureDialog.FileName);img_lblImageSizeV.Caption:=format('%d - %d',[img_src.Picture.Width,img_src.Picture.Height]);img_log.Lines.Add(format('open file "%s"',[img_OpenPictureDialog.FileName]));img_log.Lines.Add(format('image width="%d" height="%d"',[img_src.Picture.Width,img_src.Picture.Height]));end;end;//по высоте картинку - источникprocedure Tfrm_img.act_srcProportionalImgExecute(Sender: TObject);beginwith (sender as taction) do beginimg_src.Proportional:=Checked;end;end;//по высоте картинку - результатprocedure Tfrm_img.act_desProportionalImgExecute(Sender: TObject);beginwith (sender as taction) do beginimg_des.Proportional:=Checked;end;end;//копировать - цветовое копирование картинки с умножением на выбранный цветprocedure Tfrm_img.act_srcCopyExecute(Sender: TObject);constxcount=16;varmx,nx,ny,nw,nh:word;citm:^TPxlC;axmm:TSSERegLines;xmm_0:TXMMArrByte;nn,xn:byte;np1,np2,np3:byte;ncolor:tcolor;xc:array[0..3] of byte;timebefore:Cardinal;beginif (frm_optsimgcopy.ShowModal=mrYes) then begintimebefore:=MilliSecondOfTheHour(Now);if (img_src.Picture.Width > MAX_imageSize) or (img_src.Picture.Height > MAX_imageSize) then beginMessageDlg(img_errmsg[0].Text,mtError,[mbok],0);end else beginnw:=img_src.Picture.Width;//n sizenh:=img_src.Picture.Height;img_des.Picture.Bitmap.Width:=nw;//set n sizeimg_des.Picture.Bitmap.Height:=nh;img_pbar.Max:=nh+1;//set progressbarncolor:=frm_optsimgcopy.Shape1.Brush.Color;np1:=frm_optsimgcopy.ComboBox1.ItemIndex;np2:=frm_optsimgcopy.ComboBox2.ItemIndex;np3:=frm_optsimgcopy.ComboBox3.ItemIndex;for xn:=0 to 4 do beginxmm_0[xn*3+0]:=GetBValue(ncolor);//bluexmm_0[xn*3+1]:=GetGValue(ncolor);//greenxmm_0[xn*3+2]:=GetRValue(ncolor);//redend;asmpush eaxpush ebxpush ecxpush edxmovups xmm1,xmm_0end;for ny:=0 to (nh-1) do begincitm:=img_src.Picture.Bitmap.ScanLine[ny];nx:=0;while (nx<=nw) do beginFillChar(xmm_0,16,0);//clearfor nn:=0 to 4 do beginif ((nx+nn)<=nw) then beginxmm_0[nn*3+0]:=citm.b;xmm_0[nn*3+1]:=citm.g;xmm_0[nn*3+2]:=citm.r;end else break;//ifinc(citm);end;//forasm//write,make,readmovups xmm0,xmm_0andps xmm0,xmm1//multiply color'smovups xmm_0,xmm0end;//asmfor nn:=0 to 4 do beginif (nx<=nw) thenimg_des.Canvas.Pixels[nx,ny]:=rgb(xmm_0[nn*3+np3],xmm_0[nn*3+np2],xmm_0[nn*3+np1])else break;inc(nx); end;//forend;//while...img_pbar.StepBy(1);end;//for...asmpop edxpop ecxpop ebxpop eaxend;end;//if...img_pbar.Max:=0;timebefore:=MilliSecondOfTheHour(Now)-timebefore;Label1.Caption:=format('%d %s',[timebefore,delay_names]);img_log.Lines.Add(format('make action="copy image" at="%d" milliseconds',[timebefore]));end;end;//инициализация операцийprocedure Tfrm_img.FormCreate(Sender: TObject);beginimg_errmsg[0]:=tstringlist.create;//error msgimg_errmsg[0].Add('Изображение слишком большое.');//err maxsize imageimg_errmsg[0].Add(format('Максимальный размер не должен превышать %d.',[MAX_imageSize]));img_errmsg[0].Add('Попробуйте выбрать другое.');img_tabs.ActivePage:=img_tab1;//pageLabel1.Caption:=format('0 %s',[delay_names]);end;//уборка мусораprocedure Tfrm_img.FormDestroy(Sender: TObject);beginimg_errmsg[0].Free;end;//Гауссово размытие с применением расширения SSEprocedure Tfrm_img.act_effBlurGauseExecute(Sender: TObject);varb: TBitmap;fticks:Cardinal;beginif (frm_imgbluropts.ShowModal=mrYes) then beginfticks:=MilliSecondOfTheDay(Now);img_des.Picture.LoadFromFile(img_OpenPictureDialog.FileName);GBlur(img_des.Picture.Bitmap,frm_imgbluropts.ComboBox1.ItemIndex,True);fticks:=MilliSecondOfTheDay(Now)-fticks;img_log.lines.add(format('make action="copy blur SSE" at="%d" milliseconds',[fticks]));Label1.Caption:=format('%d %s',[fticks,delay_names]);end;end;//сохранить результатprocedure Tfrm_img.act_desSaveImageExecute(Sender: TObject);beginif (img_SavePictureDialog.Execute) then beginimg_des.Picture.SaveToFile(img_SavePictureDialog.FileName);end;end;//центрировать результатprocedure Tfrm_img.act_desCenterImgExecute(Sender: TObject);beginwith (sender as taction) do beginimg_des.Center:=Checked;end;end;//растянуть результатprocedure Tfrm_img.act_desStrechImgExecute(Sender: TObject);beginwith (sender as taction) do beginimg_des.Stretch:=Checked;end;end;//центрировать источникprocedure Tfrm_img.act_srcCenterImgExecute(Sender: TObject);beginwith (sender as taction) do beginimg_src.Center:=Checked;end;end;//растянуть источникprocedure Tfrm_img.act_srcStrechImgExecute(Sender: TObject);beginwith (sender as taction) do beginimg_src.Stretch:=Checked;end;end;//Гауссово размытие без SSE (простое)procedure Tfrm_img.act_effBlurGauseNoSSEExecute(Sender: TObject);varb: TBitmap;fticks:Cardinal;beginif (frm_imgbluropts.ShowModal=mrYes) then beginfticks:=MilliSecondOfTheDay(Now);img_des.Picture.LoadFromFile(img_OpenPictureDialog.FileName);GBlur(img_des.Picture.Bitmap,frm_imgbluropts.ComboBox1.ItemIndex,False);fticks:=MilliSecondOfTheDay(Now)-fticks;img_log.lines.add(format('make action="copy blur" at="%d" milliseconds',[fticks]));Label1.Caption:=format('%d %s',[fticks,delay_names]);end;end;Скриншот программы Рисунок 3-1 вкладка "источник" Рисунок 3-2 вкладка "результат" ВыводСравним производительность при использовании оптимизации кода приложения под расширение SIMD процессора SSE и CPU. Тест производился на процессоре Intel® Core™2 Duo CPU T8300 2,4Ghz с поддержкой MMX,SSE-SSE4, EM64T.Таблица 4-1|
Сравнение времени обработки изображения 800х800 | | № | время обработки с SSE, мс | время обработки на ЦП, мс | коэфициент ускорения | отклонение от среднего | | 1 | 840 | 1 032 | 1,2286 | 0,0071 | | 2 | 841 | 1 047 | 1,2449 | 0,0093 | | 3 | 832 | 1 033 | 1,2416 | 0,0059 | | 4 | 839 | 1 028 | 1,2253 | 0,0104 | | 5 | 836 | 1 035 | 1,2380 | 0,0024 | | | Таблица 4-2|
Сравнение времени обработки изображения 1024х768 | | № | время обработки с SSE, мс | время обработки на ЦП, мс | коэфициент ускорения | отклонение от среднего | | 1 | 1 589 | 1 940 | 1,2209 | 0,0331 | | 2 | 1 529 | 1 955 | 1,2786 | 0,0246 | | 3 | 1 560 | 1 956 | 1,2538 | 0,0002 | | 4 | 1 551 | 1 954 | 1,2598 | 0,0058 | | 5 | 1 545 | 1 942 | 1,2570 | 0,0029 | | | Таблица 4-3|
Сравнение времени обработки изображения 1600х1200 | | № | время обработки с SSE, мс | время обработки на ЦП, мс | коэфициент ускорения | отклонение от среднего | | 1 | 2 369 | 3 037 | 1,2820 | 0,0195 | | 2 | 2 403 | 3 021 | 1,2572 | 0,0053 | | 3 | 2 406 | 3 005 | 1,2490 | 0,0135 | | 4 | 2 389 | 2 989 | 1,2512 | 0,0113 | | 5 | 2 374 | 3 022 | 1,2730 | 0,0105 | | | Таблица 4-4|
Сравнение времени обработки изображения 2560х1600 | | № | время обработки с SSE, мс | время обработки на ЦП, мс | коэфициент ускорения | отклонение от среднего | | 1 | 5 054 | 6 332 | 1,2529 | 0,0062 | | 2 | 5 058 | 6 365 | 1,2584 | 0,0007 | | 3 | 5 050 | 6 376 | 1,2626 | 0,0035 | | 4 | 5 024 | 6 321 | 1,2582 | 0,0009 | | 5 | 4 968 | 6 277 | 1,2635 | 0,0044 | | |
Страницы: 1, 2, 3
|
|
|
© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент. |
|
|