unit SmthMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls,SmthChd;
type
TSmthform1 = class(TForm)
Button1: TButton;
Button2: TButton;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TemplateArray = array [0..7] of double;
TempAArray = array [0..19] of double;
TempBArray = array [0..19] of double;
TempUArray = array [0..17] of double;
TempMArray = array [0..13] of double;
var
oldbuf,newbuf:buf1;
winbuf:winarray;
Smthform1: TSmthform1;
CurrentFile,currentcaption:string;
Imgwidth,Imglenth:word;
ta:TemplateArray;
procedure InitTemplate();
function GetMax(ra:TemplateArray):double;
implementation
uses CommFunction;
{$R *.DFM}
procedure juanji(var oldbuf,newbuf:buf1);
var
i,j,k:Integer;
r:double;
x:Integer;
ra:TemplateArray;
filename:String;
begin
InitTemplate();
for i:=1 to 254 do
begin
for j:=1 to 254 do
begin
for k:=0 to 7 do
begin
r:=0;
r:=r+(oldbuf[i-1,j-1])*(ta[k mod 8]);
r:=r+(oldbuf[i-1,j])*(ta[(1+k) mod 8]);
r:=r+(oldbuf[i-1,j+1])*(ta[(2+k) mod 8]);
r:=r+(oldbuf[i,j+1])*(ta[(3+k) mod 8]);
r:=r+(oldbuf[i+1,j+1])*(ta[(4+k) mod 8]);
r:=r+(oldbuf[i+1,j])*(ta[(5+k) mod 8]);
r:=r+(oldbuf[i+1,j-1])*(ta[(6+k) mod 8]);
r:=r+(oldbuf[i,j-1])*(ta[(7+k) mod 8]);
ra[k]:=r;
end;
newbuf[i,j]:=Round(GetMax(ra));
end;
end;
end;
procedure kuaisu(var oldbuf,newbuf:buf1);
var
a:TempAArray;
b:TempBArray;
u:TempUArray;
m:TempMArray;
i,j,k:Integer;
r:double;
ra:TemplateArray;
begin
initTemplate();
b[0]:=ta[0]+ta[4];
b[1]:=ta[1]+ta[5];
b[2]:=ta[2]+ta[6];
b[3]:=ta[3]+ta[7];
b[4]:=b[0]+b[2];
b[5]:=b[1]+b[3];
b[6]:=((-(ta[0]-ta[4])+(ta[2]-ta[6]))-((ta[1]-ta[5])-(ta[3]-ta[7])))/2;
b[7]:=((-(ta[0]-ta[4])+(ta[2]-ta[6]))+((ta[1]-ta[5])+(ta[3]-ta[7])))/2;
b[8]:=(((ta[0]-ta[4])+(ta[2]-ta[6]))+((ta[1]-ta[5])+(ta[3]-ta[7])))/2;
b[9]:=(((ta[0]-ta[4])+(ta[2]-ta[6]))+((ta[1]-ta[5])-(ta[3]-ta[7])))/2;
b[10]:=(-(b[0]-b[2])+(b[1]-b[3]))/4;
b[11]:=((b[0]-b[2])+(b[1]-b[3]))/4;
b[12]:=(b[4]+b[5])/8;
b[13]:=(b[4]-b[5])/8;
b[14]:=((ta[0]-ta[4])-(ta[3]-ta[7]))/2;
b[15]:=((ta[0]-ta[4])+(ta[1]-ta[5]))/2;
b[16]:=(ta[0]-ta[4])/2;
b[17]:=((ta[0]-ta[4])+(ta[2]-ta[6]))/2;
b[18]:=(-(ta[0]-ta[4])+(ta[2]-ta[6]))/2;
b[19]:=(b[0]-b[2])/4;
for i:=1 to 254 do
begin
for j:=1 to 254 do
begin
r:=0;
a[0]:=oldbuf[i-1,j-1]+oldbuf[i+1,j+1];
a[1]:=oldbuf[i-1,j]+oldbuf[i+1,j];
a[2]:=oldbuf[i-1,j+1]+oldbuf[i+1,j-1];
a[3]:=oldbuf[i,j+1]+oldbuf[i,j-1];
a[4]:=a[0]+a[2];
a[5]:=a[1]+a[3];
a[6]:=oldbuf[i-1,j-1]-oldbuf[i+1,i+1];
a[7]:=oldbuf[i-1,j]-oldbuf[i+1,j];
a[8]:=oldbuf[i-1,j+1]-oldbuf[i+1,j-1];
a[9]:=oldbuf[i,j+1]-oldbuf[i,j-1];
a[10]:=a[0]-a[2];
a[11]:=a[1]-a[3];
a[12]:=a[4]+a[5];
a[13]:=a[4]-a[5];
a[14]:=a[7]+a[9];
a[15]:=a[6]+a[8];
a[16]:=a[15]-a[14];
a[17]:=a[8]-a[9];
a[18]:=a[6]-a[7];
a[19]:=a[10]+a[11];
for k:=0 to 13 do
m[k]:=a[k+6]*b[k+6];
u[0]:=m[8]+m[10];
u[1]:=m[9]-m[10];
u[2]:=m[8]+m[11];
u[3]:=m[11]-m[2];
u[4]:=m[1]+m[12];
u[5]:=m[0]-m[12];
u[6]:=m[13]-m[5];
u[7]:=m[13]+m[4];
u[8]:=m[7]+m[6];
u[9]:=m[6]-m[7];
u[10]:=u[0]-u[2];
u[11]:=u[6]+u[8];
u[12]:=u[1]+u[3];
u[13]:=u[7]+u[9];
u[14]:=u[0]+u[4];
u[15]:=-u[6]+u[8];
u[16]:=u[1]+u[5];
u[17]:=-u[7]+u[9];
ra[0]:=u[10]+u[11];
ra[1]:=u[12]+u[13];
ra[2]:=u[14]+u[15];
ra[3]:=u[16]+u[17];
ra[4]:=-u[10]+u[11];
ra[5]:=-u[12]+u[13];
ra[6]:=-u[14]+u[15];
ra[7]:=-u[16]+u[17];
newbuf[i,j]:=Round(GetMax(ra));
end;
end;
end;
procedure TSmthform1.Button1Click(Sender: TObject);
{This is the open_image procedure}
begin
OpenDialog1.InitialDir:=ExtractFilePath(Application.Name);
OpenDialog1.Filter:='BMP Files (*.bmp)|*.bmp';
if opendialog1.execute then
begin
Smthform2:=TSmthform2.Create(self);//产生子窗体。
Smthform2.open(opendialog1.filename); //打开图象文件
Smthform2.Left:=Smthform1.left div 5;
Smthform2.Top:=Smthform1.Top div 3;
Smthform2.ClientHeight:=Imglenth;
Smthform2.ClientWidth:=Imgwidth;
end;
Button2.Enabled:=True;
Button3.Enabled:=True;
end;
procedure TSmthform1.Button2Click(Sender: TObject);
var
left,top:word;
lastTime:Integer;
begin
Button3.Enabled:=False;
left:=2;top:=3;
bitmap:=activeMDIChild.GetFormImage;
Smthform2.readimg(oldbuf);
LastTime:=GetTickCount;
juanji(oldbuf,newbuf); //调用卷积算法
LastTime:=GetTickCount-LastTime;
Smthform2.creat(left,top,imglenth,imgwidth);
Smthform2.caption:='卷积算法'+inttostr(MDIchildcount-1);
SmthForm2.StatusBar1.Panels[0].Text:='使用时间:'+IntToStr(lastTime)+'毫秒';
Smthform2.showimg(newbuf);
end;
procedure TSmthform1.Button3Click(Sender: TObject);
var
left,top:word;
lasttime:Integer;
begin
Button2.Enabled:=False;
left:=4;top:=3;
bitmap:=activeMDIChild.GetFormImage;
Smthform2.readimg(oldbuf);
lastTime:=GetTickcount;
kuaisu(oldbuf,newbuf); //调用快速算法
lastTime:=GetTickCount-LastTime;
Smthform2.creat(left,top,imglenth,imgwidth);
Smthform2.caption:='快速算法'+inttostr(MDIchildcount-1);
SmthForm2.StatusBar1.Panels[0].Text:='使用时间:'+IntToStr(lastTime)+'毫秒';
Smthform2.showimg(newbuf);
end;
procedure TSmthform1.FormActivate(Sender: TObject);
begin
if MDIChildCount>0
then begin
Button2.Enabled:=True;
Button3.Enabled:=True;
end
else begin
Button2.Enabled:=False;
Button3.Enabled:=False;
end;
end;
procedure TSmthform1.Button4Click(Sender: TObject);
begin
Close;
end;
procedure InitTemplate;
var
i:Integer;
begin
for i:=0 to 2 do
ta[i]:=1/3;
for i:=3 to 7 do
ta[i]:=-1/5;
end;
function GetMax(ra:TemplateArray):double;
var
i:Integer;
begin
Result:=abs(ra[0]);
for i:=1 to 7 do
begin
ra[i]:=abs(ra[i]);
if Result<ra[i] then
Result:=ra[i];
end;
end;