📄 imageprocessmainunit.~pas
字号:
p4[3 * (i + 1) + 2]))));
G := min(255, max(0, ((-p2[3 * (i - 1) + 1] - 2 * p2[3 * i +
1] - p2[3 * (i + 1) + 1] - 0 * p3[3 * (i - 1) + 1]
+ 0 * p3[3 * i + 1]- 0 * p3[3 * (i + 1) + 1]
+ p4[3 * (i - 1) + 1] + 2 * p4[3 * i + 1]
+ p4[3 * (i + 1) + 1]))));
B := min(255, max(0, ((-p2[3 * (i - 1)] - 2 * p2[3 * i]
- p2[3* (i + 1)]- 0 * p3[3 * (i - 1)]
+ 0 * p3[3 * i] - 0 * p3[3 * (i + 1)]
+ p4[3 * (i - 1)] + 2 * p4[3 * i + 2] + p4[3 * (i + 1)]))));
// 采用检测水平边缘的sobel算子[-1,-2,1,0,0,0,1,2,1]
p1[3 * i + 2] := min(255, max(0, ((-p2[3 * (i - 1) + 2] + 0 *
p2[3* i + 2] + P2[3 * (i + 1) + 2] - 2 * p3[3 * (i - 1) + 2] + 0 * p3[3
* i + 2] + 2 * p3[3 * (i+ 1) + 2] - p4[3 * (i - 1) + 2]
- 0 * p4[3 * i + 2] + p4[3* (i + 1) + 2]))));
p1[3 * i + 1] := min(255, max(0, ((-p2[3 * (i - 1) + 1] + 0 *
p2[3* i + 1]+ p2[3 * (i + 1) + 1] - 2 * p3[3 * (i - 1) + 1]
+ 0 * p3[3* i + 1] + 2 * p3[3 * (i+ 1) + 1] -
p4[3 * (i - 1) + 1] - 0 * p4[3 * i + 1] +
p4[3* (i + 1) + 1]))));
p1[3 * i] := min(255, max(0, ((-p2[3 * (i - 1)] + 0 * p2[3 *
i] + p2[3 * (i + 1)] - 2 * p3[3 * (i - 1)] + 0 * p3[3 * i] + 2
* p3[3 * (i + 1)] - p4[3 * (i - 1)] - 0 * p4[3 * i]
+ p4[3 * (i +1)]))));
//采用检测水平边缘的sobel算子[-1,0,1,-2,0,2,-1,0,1]
p1[3 * i + 2] := (Max(R, p1[3 * i + 2]));
p1[3 * i + 1] := (Max(G, p1[3 * i + 1]));
p1[3 * i] := (Max(B, p1[3 * i]));
end;
end;
ChangedBmp.Assign(TestBMP);
ShowChangedBmp;
end;
procedure TImageProcessForm.PrewittClick(Sender: TObject);
var
p1, p3, p2, p4: pByteArray;
I,J: integer;
R,G,B: Byte;
begin
self.DoubleBuffered := true; //采用双缓冲模式
TestBMP.Assign(WillbeChangedBmp);
ProcessedBmp.Assign(WillbeChangedBmp);
for j := 1 to TestBMP.Height - 2 do
begin
p1 := TestBMP.ScanLine[j];
p2 := ProcessedBmp.ScanLine[j - 1];
p3 := ProcessedBmp.ScanLine[j];
p4 := ProcessedBmp.ScanLine[j + 1];
for i := 1 to TestBMP.Width - 2 do
begin
//采用sobal边缘算子 {( -1 -1 -1)
// (0 0 0 ) ( 1 1 1) }和{(1 0 -1)(1 0 -1)(1 0 -1)
r := min(255, max(0, ((-p2[3 * (i - 1) + 2] - p2[3 * i + 2] -
p2[3 * (i + 1) + 2] - 0 * p3[3 * (i - 1) + 2] + 0 * p3[3 * i + 2]
- 0 * p3[3 * (i + 1)+ 2] + p4[3 * (i - 1) + 2] + p4[3 * i + 2]
+ p4[3 * (i + 1) +2]))));
g := min(255, max(0, ((-p2[3 * (i - 1) + 1] - p2[3 * i + 1] -
p2[3* (i + 1) + 1] - 0 * p3[3 * (i - 1) + 1] + 0 * p3[3 * i + 1]
- 0 * p3[3 * (i+ 1)+ 1] + p4[3 * (i - 1) + 1] + p4[3 * i + 1]
+ p4[3 * (i + 1) + 1]))));
b := min(255, max(0, ((-p2[3 * (i - 1)] - p2[3 * i] - p2[3 *
(i + 1)] - 0* p3[3 * (i - 1)] + 0 * p3[3 * i] - 0 * p3[3 * (i + 1)]
+ p4[3* (i - 1)]+ p4[3 * i + 2] + p4[3 * (i + 1)]))));
begin
p1[3 * i + 2] := min(255, max(0, ((p2[3 * (i - 1) + 2] - 0
* p2[3 * i + 2] - p2[3 * (i + 1) + 2] + p3[3 * (i - 1) + 2] + 0 *
p3[3 * i + 2] - p3[3* (i + 1) + 2] + p4[3 * (i - 1) + 2] +
0 * p4[3 * i + 2] - p4[3 * (i + 1)+ 2]))));
p1[3 * i + 1] := min(255, max(0, ((p2[3 * (i - 1) + 1] - 0* p2[3 * i +
1] - p2[3 * (i + 1) + 1] + p3[3 * (i - 1) + 1] + 0 *
p3[3 * i + 1] - p3[3* (i + 1) + 1] + p4[3 * (i - 1) + 1] +
0 * p4[3 * i + 1] -p4[3 * (i+ 1)+ 1]))));
p1[3 * i] := min(255, max(0, ((p2[3 * (i - 1)] - 0 * p2[3
* i]- p2[3 *(i + 1)] + p3[3 * (i - 1)] + 0 * p3[3 * i] - p3[3 * (i
+ 1)]+ p4[3 * (i - 1)] + 0 * p4[3 * i] - p4[3 * (i + 1)]))));
p1[3 * i + 2] := (max(r, p1[3 * i + 2]));
p1[3 * i + 1] := (max(g, p1[3 * i + 1]));
p1[3 * i] := (max(b, p1[3 * i]));
end;
end;
end;
ChangedBmp.Assign(TestBMP);
ShowChangedBmp;
end;
procedure TImageProcessForm.ExchangeToolButtonClick(Sender: TObject);
begin
WillbeChangedBmp.Assign(ChangedBmp);
showOriginalbmp;
end;
procedure TImageProcessForm.MarrClick(Sender: TObject);
var
i,j:integer;
p1,p2,p3,p4,p5,p:pByteArray;
begin
self.DoubleBuffered := true; //采用双缓冲模式
TestBMP.Assign(WillbeChangedBmp);
ProcessedBmp.Assign(WillbeChangedBmp);
for j:=2 to TestBMP.Height-3 do
begin
p:=TestBMP.ScanLine[j];
p1:=ProcessedBmp.ScanLine[j-2];
p2:=ProcessedBmp.ScanLine[j-1];
p3:=ProcessedBmp.ScanLine[j];
p4:=ProcessedBmp.ScanLine[j+1];
p5:=ProcessedBmp.ScanLine[j+2];
for i:=2 to TestBMP.Width-3 do
begin
p[i*3]:=min(255,max(0,(
-2*p1[(i-2)*3]-4*p1[(i-1)*3]- 4*p1[i*3]-4*p1[(i+1)*3]-2*p1[(i+2)*3]
-4*p2[(i-2)*3] + 8*p2[i*3] -4*p2[(i+2)*3]
-4*p3[(i-2)*3]+8*p3[(i-1)*3]+24*p3[i*3]+8*p3[(i+1)*3]-4*p3[(i+2)*3]
-4*p4[(i-2)*3] + 8*p4[i*3] -4*p4[(i+2)*3]
-2*p5[(i-2)*3]-4*p5[(i-1)*3]- 4*p5[i*3]-4*p5[(i+1)*3]-2*p5[(i+2)*3])
));
p[i*3+1]:=min(255,max(0,(
-2*p1[(i-2)*3+1]-4*p1[(i-1)*3+1]-4*p1[i*3+1]-4*p1[(i+1)*3+1]-2*p1[(i+2)*3+1]
-4*p2[(i-2)*3+1]+8*p2[i*3+1]-4*p2[(i+2)*3+1]
-4*p3[(i-2)*3+1]+8*p3[(i-1)*3+1]+24*p3[i*3+1]+8*p3[(i+1)*3+1]-4*p3[(i+2)*3+1]
-4*p4[(i-2)*3+1]+8*p4[i*3+1]-4*p4[(i+2)*3+1]
-2*p5[(i-2)*3+1]-4*p5[(i-1)*3+1]-4*p5[i*3+1]-4*p5[(i+1)*3+1]-2*p5[(i+2)*3+1])
));
p[i*3+2]:=min(255,max(0,(
-2*p1[(i-2)*3+2]-4*p1[(i-1)*3+2]-4*p1[i*3+2]-4*p1[(i+1)*3+2]-2*p1[(i+2)*3+2]
-4*p2[(i-2)*3+2]+8*p2[i*3+2]-4*p2[(i+2)*3+2]
-4*p3[(i-2)*3+2]+8*p3[(i-1)*3+2]+24*p3[i*3+2]+8*p3[(i+1)*3+2]-4*p3[(i+2)*3+2]
-4*p4[(i-2)*3+2]+8*p4[i*3+2]-4*p4[(i+2)*3+2]
-2*p5[(i-2)*3+2]-4*p5[(i-1)*3+2]-4*p5[i*3+2]-4*p5[(i+1)*3+2]-2*p5[(i+2)*3]+2)
));
end;
end;
ChangedBmp.Assign(TestBMP);
ShowChangedBmp;
end;
procedure TImageProcessForm.CannyClick(Sender: TObject);
var
x,y,i,g: integer;
LowBmp,HighBmp: TBitmap;
p0,p1,p2,p3,p4,plow,phigh: pByteArray;
p,q,m,angle: array [0..2] of Extended;
tlow,thigh: Extended;
gray:array [0..255] of integer;
begin
self.DoubleBuffered := true; //采用双缓冲模式
TestBMP.Assign(WillbeChangedBmp);
ProcessedBmp.Assign(WillbeChangedBmp);
LowBmp:=TBitmap.Create;
LowBmp.Assign(TestBMP);
LowBmp.PixelFormat:=pf24bit;
LowBmp.Height:=TestBMP.Height;
LowBmp.Width:=TestBMP.Width;
HighBmp:=TBitmap.Create;
HighBmp.Assign(TestBMP);
HighBmp.PixelFormat:=pf24bit;
HighBmp.Height:=TestBMP.Height;
HighBmp.Width:=TestBMP.Width;
g:=0;
for x:=0 to 255 do Gray[x]:=0;
for y:=1 to TestBMP.Height-3 do
begin
p0:=ProcessedBmp.ScanLine[y];
plow:=lowBmp.ScanLine[y];
phigh:=HighBmp.ScanLine[y];
p1:=TestBMP.ScanLine[y-1];
p2:=TestBMP.ScanLine[y];
p3:=TestBMP.ScanLine[y+1];
p4:=TestBMP.ScanLine[y+2];
for x:=1 to TestBMP.Width-3 do
begin
inc(g);
for i:=0 to 2 do
begin
p[i]:=0; q[i]:=0;
m[i]:=0; angle[i]:=0;
end;
p[0]:=(p2[3*(x+1)]-p2[3*x]+p3[3*(x+1)]-p3[3*x])/2;
q[0]:=(p2[3*(x+1)]+p2[3*x]-p3[3*(x+1)]-p3[3*x])/2;
m[0]:=sqrt(sqr(p[0])+sqr(q[0]));
Inc(Gray[round(m[0])]);
if m[0]<>0 then //若m=0,则x点灰度已经最小,不必再处理
begin
if ((q[0]<>0) and (p[0]=0)) then angle[0]:=90 //angle为90度
else angle[0]:=ArcTan(q[0]/p[0])*4*45/pi;
if (angle[0]<-22.5) then angle[0]:=angle[0]+180;
//NMS区域判断
if ((angle[0]>=-22.5) and (angle[0]< 22.5)) then
begin
p[1]:=(p2[3*(x+2)]-p2[3*(x+1)]+p3[3*(x+2)]-p3[3*(x+1)])/2;
q[1]:=(p2[3*(x+1)]+p2[3*(x+2)]-p3[3*(x+1)]-p3[3*(x+2)])/2;
m[1]:=sqrt(sqr(p[1])+sqr(q[1]));
p[2]:=(p2[3*x]-p2[3*(x-1)]+p3[3*x]-p3[3*(x-1)])/2;
q[2]:=(p2[3*x]+p2[3*(x-1)]-p3[3*x]-p3[3*(x-1)])/2;
m[2]:=sqrt(sqr(p[2])+sqr(q[2]));
end;
if ((angle[0]>= 22.5) and (angle[0]< 67.5)) then
begin
p[1]:=(p1[3*(x+2)]-p1[3*(x+1)]+p2[3*(x+2)]-p2[3*(x+1)])/2;
q[1]:=(p1[3*(x+2)]+p2[3*(x+2)]-p1[3*(x+1)]-p2[3*(x+1)])/2;
m[1]:=sqrt(sqr(p[1])+sqr(q[1]));
p[2]:=(p3[3*x]-p3[3*(x-1)]+p4[3*x]-p4[3*(x-1)])/2;
q[2]:=(p3[3*x]+p3[3*(x-1)]-p4[3*x]-p4[3*(x-1)])/2;
m[2]:=sqrt(sqr(p[2])+sqr(q[2]));
end;
if ((angle[0]>= 67.5) and (angle[0]<112.5)) then
begin
p[1]:=(p1[3*(x+1)]-p1[3*x]+p2[3*(x+1)]-p2[3*x])/2;
q[1]:=(p1[3*(x+1)]+p1[3*x]-p2[3*(x+1)]-p2[3*x])/2;
m[1]:=sqrt(sqr(p[1])+sqr(q[1]));
p[1]:=(p3[3*(x+1)]-p3[3*x]+p4[3*(x+1)]-p4[3*x])/2;
q[1]:=(p3[3*(x+1)]+p3[3*x]-p4[3*(x+1)]-p4[3*x])/2;
m[2]:=sqrt(sqr(p[2])+sqr(q[2]));
end;
if ((angle[0]>=122.5) and (angle[0]<157.5)) then
begin
p[1]:=(p1[3*x]-p1[3*(x-1)]+p2[3*x]-p2[3*(x-1)])/2;
q[1]:=(p1[3*x]+p1[3*(x-1)]-p2[3*x]-p2[3*(x-1)])/2;
m[1]:=sqrt(sqr(p[1])+sqr(q[1]));
p[1]:=(p3[3*(x+2)]-p3[3*(x+1)]+p4[3*(x+2)]-p4[3*(x+1)])/2;
q[1]:=(p3[3*(x+2)]+p3[3*(x+1)]-p4[3*(x+2)]-p4[3*(x+1)])/2;
m[2]:=sqrt(sqr(p[2])+sqr(q[2]));
end;
//若不是局部最大值,则将x点灰度设置为0
if ((m[0]<m[1]) or (m[0]<m[2])) then
begin
p0[3*x]:=0;
p0[3*x+1]:=0;
p0[3*x+2]:=0;
plow[3*x]:=0;
plow[3*x+1]:=0;
plow[3*x+2]:=0;
phigh[3*x]:=0;
phigh[3*x+1]:=0;
phigh[3*x+2]:=0;
end else
begin
tlow:=m[0]*0.8;
thigh:=2*tlow;
//设置低阈值图像
if plow[3*x]<tlow then
begin
plow[3*x]:=0; plow[3*x+1]:=0; plow[3*x+2]:=0;
end
else
begin
// plow[3*x]:=255;
// plow[3*x+1]:=255;
// plow[3*x+2]:=255;
end;
//设置高阈值图像
if phigh[3*x]<thigh then
begin
phigh[3*x]:=0;
phigh[3*x+1]:=0;
phigh[3*x+2]:=0;
end
else
begin
// phigh[3*x]:=255;
// phigh[3*x+1]:=255;
// phigh[3*x+2]:=255;
end;
end;
end;//end m[0] judge
end;
end;
ChangedBmp.Assign(lowBMP);
ShowChangedBmp;
end;
//////////////////////////////////////////////////////////////
procedure TImageProcessForm.GaussFilterClick(Sender: TObject);
var //图像高斯滤波处理程序
i,j: integer;
p1, p2, p3, p4: pByteArray;
begin
TestBMP.Assign(WillbeChangedBmp);
ProcessedBmp.Assign(WillbeChangedBmp);
for j:=1 to TestBMP.Height-2 do
begin
p1:=ProcessedBmp.ScanLine[j];
p2:=TestBMP.ScanLine[j-1];
p3:=TestBMP.ScanLine[j];
p4:=TestBMP.ScanLine[j+1];
for i:=1 to TestBMP.Width-2 do
begin
p1[3*i+2]:=min(255,max(0,((p2[3*(i-1)+2]+2*p2[3*i+2]+p2[3*(i+1)+2]+2*p3[3*(i-1)+2]+4*p3[3*i+2]
+2*p3[3*(i+1)+2]+p4[3*(i-1)+2]+2*p4[3*i+2]+p4[3*(i+1)+2])) div 16));
p1[3*i+1]:=min(255,max(0,((p2[(i-1)+1]+2*p2[3*i+1]+p2[3*(i+1)+1]+2*p3[3*(i-1)+1]+4*p3[3*i+1]
+2*p3[3*(i+1)+1]+p4[3*(i-1)+1]+2*p4[3*i+1]+p4[3*(i+1)+1])) div 16));
p1[3*i] :=min(255,max(0,((p2[(i-1)]+2*p2[3*i]+p2[3*(i+1)]+2*p3[3*(i-1)]+4*p3[3*i]
+2*p3[3*(i+1)]+p4[3*(i-1)]+2*p4[3*i]+p4[3*(i+1)])) div 16));
end;
end;
ChangedBmp.Assign(ProcessedBmp);
ShowChangedBmp;
end;
///////////////////////////////////////////////////////////////////////////////
procedure TImageProcessForm.GuassLaplaceClick(Sender: TObject);
var p,p1,p2,p3,p4,p5:pbytearray ;
x,y:integer ;
begin
TestBMP.Assign(WillbeChangedBmp);
ProcessedBmp.Assign(WillbeChangedBmp);
//temp.Assign(original_image.Picture.Bitmap);
//buffer.Assign(original_image.Picture.Bitmap);
for y:=2 to TestBMP.Height-3 do
begin
p:=ProcessedBmp.ScanLine[y];
p1:=TestBMP.ScanLine[y-2];
p2:=TestBMP.ScanLine[y-1];
p3:=TestBMP.ScanLine[y];
p4:=TestBMP.ScanLine[y+1];
p5:=TestBMP.ScanLine[y+2];
for x:=2 to TestBMP.Width-3 do
begin
p[x*3]:=min(255,max(0,(-p1[3*x]-p2[3*(x-1)]-2*p2[3*x]-p2[3*(x+1)]
-p3[3*(x-2)]-2*p3[3*(x+1)]+16*p3[3*x]-2*p3[3*(x+1)]-p3[3*(x+2)]
-p4[3*(x-1)]-2*p4[3*x]-p4[3*(x+1)]-p5[3*x])));
p[x*3+1]:=min(255,max(0,(-p1[3*x+1]-p2[3*(x-1)+1]-2*p2[3*x+1]-p2[3*(x+1)+1]
-p3[3*(x-2)+1]-2*p3[3*(x+1)+1]+16*p3[3*x+1]-2*p3[3*(x+1)+1]-p3[3*(x+2)+1]
-p4[3*(x-1)]-2*p4[3*x]-p4[3*(x+1)]-p5[3*x])));
p[x*3+2]:=min(255,max(0,(-p1[3*x+2]-p2[3*(x-1)+2]-2*p2[3*x+2]-p2[3*(x+1)+2]
-p3[3*(x-2)+2]-2*p3[3*(x+1)+2]+16*p3[3*x+2]-2*p3[3*(x+1)+2]-p3[3*(x+2)+2]
-p4[3*(x-1)+2]-2*p4[3*x+2]-p4[3*(x+1)+2]-p5[3*x]+2)));
end;
end;
ChangedBmp.Assign(ProcessedBmp);
ShowChangedBmp;
end;
procedure TImageProcessForm.RobertClick(Sender: TObject);
var//Robert边缘检测程序
x,y:integer;
P,p1,p2:pbytearray;
begin
TestBMP.Assign(WillbeChangedBmp);
ProcessedBmp.Assign(WillbeChangedBmp);
for y:=0 to TestBMP.Height-2 do
begin
p:=ProcessedBmp.ScanLine[y];
p1:=TestBMP.ScanLine[y];
p2:=TestBMP.ScanLine[y+1];
for x:=0 to TestBMP.Width-2 do
begin
p[3*x]:=max(0,max(-p1[3*(x+1)]+p2[3*x], p1[3*x]-p2[3*(x+1)]));
p[3*x+1]:=max(0,max(-p1[3*(x+1)+1]+p2[3*x+1], p1[3*x+1]-p2[3*(x+1)+1]));
p[3*x+2]:=max(0,max(-p1[3*(x+1)+2]+p2[3*x+2], p1[3*x+2]-p2[3*(x+1)+2]));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -