📄 imageprocessmainunit.~pas
字号:
pline[3*w+2]:=round(result);
pline[3*w+1]:=round(result);
pline[3*w+0]:=round(result);
result:=0;
GaborShowForm.image6.Picture.Bitmap.Assign(TestBMP);
GaborShowForm.Label6.Caption:='112.5度滤波图像';
end;
end;
temp5:=(1/8)*6*pi;costemp:=cos(temp5);sintemp:=sin(temp5);
for h:=0 to ProcessedBmp.height-1 do
begin
progressbar1.Position:=progressbar1.Position+1;
pline:=TestBMP.ScanLine[h];
for w:=0 to ProcessedBmp.Width-1 do
begin
if(w>=5) and(h>=5) and(w<=ProcessedBmp.Width-6)
and(h<=ProcessedBmp.Height-6) then
begin
for i:=-5 to 5 do
begin
for j:=-5 to 5 do
begin
plus:=power(i*costemp+j*sin(temp5),2)/9+
power(-i*sin(temp5)+j*costemp,2);
result:=result+(exp(-0.5*plus)*cos(1.0*
(i*costemp +j* sin(temp5) )))*II[w+1-i,h+1-j];
end;
end;
end else
result:=getrvalue(TestBMP.Canvas.Pixels[w,h]);
if(result>=255) then result:=255;
if(result<0) then result:=0;
pline[3*w+2]:=round(result);
pline[3*w+1]:=round(result);
pline[3*w+0]:=round(result);
result:=0;
GaborShowForm.image7.Picture.Bitmap.Assign(TestBMP);
GaborShowForm.Label7.Caption:='135度滤波图像';
end;
end;
temp5:=(1/8)*7*pi;costemp:=cos(temp5);sintemp:=sin(temp5);
for h:=0 to ProcessedBmp.height-1 do
begin
progressbar1.Position:=progressbar1.Position+1;
pline:=TestBMP.ScanLine[h];
for w:=0 to ProcessedBmp.Width-1 do
begin
if(w>=5) and(h>=5) and(w<=ProcessedBmp.Width-6)
and(h<=ProcessedBmp.Height-6) then
begin
for i:=-5 to 5 do
begin
for j:=-5 to 5 do
begin
plus:=power(i*costemp+j*sin(temp5),2)/9+
power(-i*sin(temp5)+j*costemp,2);
result:=result+(exp(-0.5*plus)*cos(1.0*
(i*costemp +j* sintemp )))*II[w+1-i,h+1-j];
end;
end;
end else
result:=getrvalue(TestBMP.Canvas.Pixels[w,h]);
if(result>=255) then result:=255;
if(result<0) then result:=0;
pline[3*w+2]:=round(result);
pline[3*w+1]:=round(result);
pline[3*w+0]:=round(result);
result:=0;
GaborShowForm.image8.Picture.Bitmap.Assign(TestBMP);
GaborShowForm.Label8.Caption:='157.5度滤波图像';
end;
end;
for h:=0 to ProcessedBmp.height-1 do
for w:=0 to ProcessedBmp.Width-1 do
begin //取八个方向滤波结果的最大值
progressbar1.Position:=progressbar1.Position+1;
RvalueArray[0]:=getrvalue(ProcessedBmp.Canvas.Pixels[w,h]);
RvalueArray[1]:=getrvalue(GaborShowForm.image1.Canvas.Pixels[w,h]);
RvalueArray[2]:=getrvalue(GaborShowForm.image2.Canvas.Pixels[w,h]);
RvalueArray[3]:=getrvalue(GaborShowForm.image3.Canvas.Pixels[w,h]);
RvalueArray[4]:=getrvalue(GaborShowForm.image4.Canvas.Pixels[w,h]);
RvalueArray[5]:=getrvalue(GaborShowForm.image5.Canvas.Pixels[w,h]);
RvalueArray[6]:=getrvalue(GaborShowForm.image6.Canvas.Pixels[w,h]);
RvalueArray[7]:=getrvalue(GaborShowForm.image7.Canvas.Pixels[w,h]);
RvalueArray[8]:=getrvalue(GaborShowForm.image8.Canvas.Pixels[w,h]);
SelectionSort(RvalueArray);
temp:=RvalueArray[8];
if(temp>=220) then temp:=255;
ProcessedBmp.Canvas.Pixels[w,h]:=RGB(temp,temp,temp);
end;
ChangedBmp.Assign(ProcessedBmp);
ShowChangedBmp;
end;
////////////////////////////////////////////////////////////
procedure TImageProcessForm.N8Gabor1Click(Sender: TObject);
begin
GaborShowForm.ShowModal;
end;
//////////////////////////////////////////////////////////
procedure TImageProcessForm.FourAnisotropicClick(Sender: TObject);
var //4向各向异性扩散程序
p1,p2,p3,p4,p5:pbytearray;
x,y:integer;
c:array[1..5]of real;
k,t:real;
i,n:integer;
begin
n:=StrToInt(ParameterForm.Edit1.Text);
k:=StrToFloat(ParameterForm.Edit2.Text);
t:=StrToFloat(ParameterForm.Edit3.Text);
ProcessedBmp.assign(WillbeChangedBmp);
TestBMP.Assign(WillbeChangedBmp);
for i:=1 to n do
begin
TestBMP.Assign(ProcessedBmp);
for y:=2 to ProcessedBmp.Height-3 do
begin
p1:=ProcessedBmp.ScanLine[y];
p2:=ProcessedBmp.ScanLine[y-1];
p3:=ProcessedBmp.ScanLine[y+1];
p4:=ProcessedBmp.ScanLine[y-2];
p5:=TestBMP.ScanLine[y];
for x:=2 to ProcessedBmp.Width-3 do
begin
c[1]:=1/(1+k*((p1[3*x]-p1[3*(x-1)])*(p1[3*x]-p1[3*(x-1)])+(p1[3*x]-p2[3*x])*(p1[3*x]-p2[3*x])));
c[2]:=1/(1+k*((p2[3*x]-p2[3*(x-1)])*(p2[3*x]-p2[3*(x-1)])+(p2[3*x]-p4[3*x])*(p2[3*x]-p4[3*x])));
c[3]:=1/(1+k*((p3[3*x]-p3[3*(x-1)])*(p3[3*x]-p3[3*(x-1)])+(p1[3*x]-p3[3*x])*(p1[3*x]-p3[3*x])));
c[4]:=1/(1+k*((p1[3*(x-1)]-p1[3*(x-2)])*(p1[3*(x-1)]-p1[3*(x-2)])+(p1[3*(x-1)]-p2[3*(x-1)])*(p1[3*(x-1)]-p2[3*(x-1)])));
c[5]:=1/(1+k*((p1[3*(x+1)]-p1[3*x])*(p1[3*(x+1)]-p1[3*x])+(p1[3*(x+1)]-p2[3*(x+1)])*(p1[3*(x+1)]-p2[3*(x+1)])));
p5[3*x]:=round(p1[3*x]+t*((c[4]+c[1])*p1[3*(x-1)]/2+(c[5]+c[1])*p1[3*(x+1)]/2+
(c[3]+c[1])*p3[3*x]/2+(c[2]+c[1])*p2[3*x]/2-(c[1]*4+c[2]+c[3]+c[4]+c[5])*p1[3*x]/2));
p5[3*x+1]:=p5[3*x];
p5[3*x+2]:=p5[3*x];
end;
end;
ProcessedBmp.Assign(TestBMP);
end;
ChangedBmp.Assign(TestBMP);
ShowChangedBmp;
end;
////////////////////////////////////////////////////////////
procedure TImageProcessForm.EightAnisotropicClick(Sender: TObject);
var //8向各向异性扩散程序
p1,p2,p3,p4,p5:pbytearray;
x,y,i,n:integer;
c:array[1..9]of real;
k,t:real;
begin
n:=StrToInt(ParameterForm.edit1.Text);
k:=StrToFloat(ParameterForm.edit2.Text);
t:=StrToFloat(ParameterForm.edit3.Text);
for i:=1 to n do
begin
TestBMP.Assign( ProcessedBmp);
for y:=2 to ProcessedBmp.Height-3 do
begin
p1:= ProcessedBmp.ScanLine[y];
p2:= ProcessedBmp.ScanLine[y-1];
p3:= ProcessedBmp.ScanLine[y+1];
p4:= ProcessedBmp.ScanLine[y-2];
p5:=TestBMP.ScanLine[y];
for x:=2 to ProcessedBmp.Width-3 do
begin
c[1]:=1/(1+k*((p1[3*x]-p1[3*(x-1)])*(p1[3*x]-p1[3*(x-1)])+(p1[3*x]-p2[3*x])*(p1[3*x]-p2[3*x]))); //u[i,j]
c[2]:=1/(1+k*((p2[3*x]-p2[3*(x-1)])*(p2[3*x]-p2[3*(x-1)])+(p2[3*x]-p4[3*x])*(p2[3*x]-p4[3*x]))); //u[i,j-1]
c[3]:=1/(1+k*((p3[3*x]-p3[3*(x-1)])*(p3[3*x]-p3[3*(x-1)])+(p1[3*x]-p3[3*x])*(p1[3*x]-p3[3*x]))); //u[i,j+1]
c[4]:=1/(1+k*((p1[3*(x-1)]-p1[3*(x-2)])*(p1[3*(x-1)]-p1[3*(x-2)])+(p1[3*(x-1)]-p2[3*(x-1)])*(p1[3*(x-1)]-p2[3*(x-1)])));//u[i-1,j]
c[5]:=1/(1+k*((p1[3*(x+1)]-p1[3*x])*(p1[3*(x+1)]-p1[3*x])+(p1[3*(x+1)]-p2[3*(x+1)])*(p1[3*(x+1)]-p2[3*(x+1)])));//u[i+1,j]
c[6]:=1/(1+k*((p2[3*(x-1)]-p2[3*(x-2)])*(p2[3*(x-1)]-p2[3*(x-2)])+(p2[3*(x-1)]-p4[3*(x-1)])*(p2[3*(x-1)]-p4[3*(x-1)])));//u[i-1,j-1]
c[7]:=1/(1+k*((p2[3*(x+1)]-p2[3*x])*(p2[3*(x+1)]-p2[3*x])+(p2[3*(x+1)]-p4[3*(x+1)])*(p2[3*(x+1)]-p4[3*(x+1)])));//u[i+1,j-1]
c[8]:=1/(1+k*((p3[3*(x-1)]-p3[3*(x-2)])*(p3[3*(x-1)]-p3[3*(x-2)])+(p3[3*(x-1)]-p2[3*(x-1)])*(p3[3*(x-1)]-p2[3*(x-1)])));//u[i-1,j+1]
c[9]:=1/(1+k*((p3[3*(x+1)]-p3[3*x])*(p3[3*(x+1)]-p3[3*x])+(p3[3*(x+1)]-p2[3*(x+1)])*(p3[3*(x+1)]-p2[3*(x+1)])));;//u[i+1,j+1]
p5[3*x]:=round(p1[3*x]+t*((c[4]+c[1])*p1[3*(x-1)]/2+(c[5]+c[1])*p1[3*(x+1)]/2+ (c[3]+c[1])*p3[3*x]/2+
(c[2]+c[1])*p2[3*x]/2+ (c[6]+c[1])*p2[3*(x-1)]/2+(c[7]+c[1])*p2[3*(x+1)]/2+(c[8]+c[1])*p3[3*(x-1)]/2+
(c[9]+c[1])*p2[3*(x+1)]/2-(c[1]*8+c[2]+c[3]+c[4]+c[5]+c[6]+c[7]+c[8]+c[9])*p1[3*x]/2));
p5[3*x+1]:=p5[3*x];
p5[3*x+2]:=p5[3*x];
end;
end;
ProcessedBmp.Assign(TestBMP);
end;
ChangedBmp.Assign(TestBMP);
ShowChangedBmp;
end;
procedure TImageProcessForm.GrayErodeClick(Sender: TObject);
var //灰度化图像腐蚀处理
p1, p2, p3, p4,p5,p6: pbytearray;
RvalueArray:array[0..24]of Integer;
i, j: integer;
begin
Self.DoubleBuffered := True; //设置双缓冲
ProcessedBmp.assign(WillbeChangedBmp);
TestBMP.Assign(WillbeChangedBmp);
for j := 2 to ProcessedBmp.Height - 3 do
begin //处理相邻五条扫描线
p1 := TestBMP.ScanLine[j];
p2 := ProcessedBmp.ScanLine[j - 1];
p3 := ProcessedBmp.ScanLine[j];
p4 := ProcessedBmp.ScanLine[j + 1];
p5 := ProcessedBmp.ScanLine[j + 2];
p6 := ProcessedBmp.ScanLine[j - 2];
for i := 2 to ProcessedBmp.Width - 3 do
begin //对存储25个R分量的数组进行赋值
RvalueArray[0] := p2[3 * (i - 2) + 2];
RvalueArray[1] := p2[3 * (i-1) + 2];
RvalueArray[2] := p2[3 * i + 2];
RvalueArray[3] := p2[3 * (i+1) + 2];
RvalueArray[4] := p2[3 * (i+2) + 2];
RvalueArray[5] := p3[3 * (i - 2) + 2];
RvalueArray[6] := p3[3 * (i - 1) + 2];
RvalueArray[7] := p3[3 * i + 2];
RvalueArray[8] := p3[3 * (i + 1) + 2];
RvalueArray[9] := p3[3 * (i + 2) + 2];
RvalueArray[10] := p4[3 * (i - 2) + 2];
RvalueArray[11] := p4[3 * (i - 1) + 2];
RvalueArray[12] := p4[3 * i + 2];
RvalueArray[13] := p4[3 * (i + 1) + 2];
RvalueArray[14] := p4[3 * (i + 2) + 2];
RvalueArray[15] := p5[3 * (i -2) + 2];
RvalueArray[16] := p5[3 * (i -1) + 2];
RvalueArray[17] := p5[3 * i + 2];
RvalueArray[18] := p5[3 * (i + 1) + 2];
RvalueArray[19] := p5[3 * (i + 2) + 2];
RvalueArray[20] := p6[3 * (i - 2) + 2];
RvalueArray[21] := p6[3 * (i - 1) + 2];
RvalueArray[22] := p6[3 * i + 2];
RvalueArray[23] := p6[3 * (i + 1) + 2];
RvalueArray[24] := p6[3 * (i + 2) + 2];
SelectionSort(RvalueArray); //获取R分量的最小值
p1[3 * i + 2] := RvalueArray[0];
p1[3 * i + 1] := RvalueArray[0];
p1[3 * i] := RvalueArray[0];
end;
end;
ChangedBmp.Assign(TestBMP);
ShowChangedBmp;
end;
procedure TImageProcessForm.GrayDilateClick(Sender: TObject);
var //灰度化图像膨胀处理
p1, p2, p3, p4,p5,p6: pbytearray;
RvalueArray:array[0..24]of Integer;
i, j: integer;
begin
Self.DoubleBuffered := True; //设置双缓冲
ProcessedBmp.assign(WillbeChangedBmp);
TestBMP.Assign(WillbeChangedBmp);
for j := 2 to ProcessedBmp.Height - 3 do
begin //处理相邻五条扫描线
p1 := TestBMP.ScanLine[j];
p2 := ProcessedBmp.ScanLine[j - 1];
p3 := ProcessedBmp.ScanLine[j];
p4 := ProcessedBmp.ScanLine[j + 1];
p5 := ProcessedBmp.ScanLine[j + 2];
p6 := ProcessedBmp.ScanLine[j - 2];
for i := 2 to ProcessedBmp.Width - 3 do
begin //对存储25个R分量的数组进行赋值
RvalueArray[0] := p2[3 * (i - 2) + 2];
RvalueArray[1] := p2[3 * (i-1) + 2];
RvalueArray[2] := p2[3 * i + 2];
RvalueArray[3] := p2[3 * (i+1) + 2];
RvalueArray[4] := p2[3 * (i+2) + 2];
RvalueArray[5] := p3[3 * (i - 2) + 2];
RvalueArray[6] := p3[3 * (i - 1) + 2];
RvalueArray[7] := p3[3 * i + 2];
RvalueArray[8] := p3[3 * (i + 1) + 2];
RvalueArray[9] := p3[3 * (i + 2) + 2];
RvalueArray[10] := p4[3 * (i - 2) + 2];
RvalueArray[11] := p4[3 * (i - 1) + 2];
RvalueArray[12] := p4[3 * i + 2];
RvalueArray[13] := p4[3 * (i + 1) + 2];
RvalueArray[14] := p4[3 * (i + 2) + 2];
RvalueArray[15] := p5[3 * (i -2) + 2];
RvalueArray[16] := p5[3 * (i -1) + 2];
RvalueArray[17] := p5[3 * i + 2];
RvalueArray[18] := p5[3 * (i + 1) + 2];
RvalueArray[19] := p5[3 * (i + 2) + 2];
RvalueArray[20] := p6[3 * (i - 2) + 2];
RvalueArray[21] := p6[3 * (i - 1) + 2];
RvalueArray[22] := p6[3 * i + 2];
RvalueArray[23] := p6[3 * (i + 1) + 2];
RvalueArray[24] := p6[3 * (i + 2) + 2];
SelectionSort(RvalueArray); //获取R分量的最大值
p1[3 * i + 2] := RvalueArray[24];
p1[3 * i + 1] := RvalueArray[24];
p1[3 * i] := RvalueArray[24];
end;
end;
ChangedBmp.Assign(TestBMP);
ShowChangedBmp;
end;
procedure TImageProcessForm.N1Click(Sender: TObject);
var
w,h:integer;
m ,var1 :double;
I:array[0..500,0..500] of integer;
begin
Image10.AutoSize:=false;
m:=0;
var1:=0;
for w:=0 to image10.Picture.Bitmap.Width-1
do
begin
for h:=0 to image10.Picture.Bitmap.Height-1
do
begin
m:=getrvalue(image10.Canvas.Pixels[w,h])+m;
I[w,h]:=getrvalue(image10.Canvas.Pixels[w,h]);
end;
end;
m:=m / ((image10.Picture.Bitmap.Width)* (image10.Picture.Bitmap.Height)); //图象的平均灰度值
for w:=0 to image10.Picture.Bitmap.Width-1
do
begin
for h:=0 to image10.Picture.Bitmap.Height-1
do
begin
var1:=var1+trunc(power((getrvalue(image10.Canvas.Pixels[w,h])-m),2));
end;
end;
var1:=var1 /((image10.Picture.Bitmap.Width)* (image10.Picture.Bitmap.Height));
for w:=0 to image10.Picture.Bitmap.Width-1
do
begin
for h:=0 to image10.Picture.Bitmap.Height-1
do
begin
if I[w,h]>m then
begin
I[w,h]:= 210+trunc(sqrt(600*power((I[w,h]-m),2)/m ));
if I[w,h]>256 then I[w,h]:=250;
end else
begin
I[w,h]:= 210-trunc(sqrt(600*power((I[w,h]-m),2)/m));
end;
end;
end;
for w:=0 to image10.Picture.Bitmap.Width-1
do
begin
for h:=0 to image10.Picture.Bitmap.Height-1
do
begin
Image10.Canvas.Pixels[w,h]:=rgb(I[w,h],I[w,h],I[w,h]);
end;
end ;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -