//sobel 算子 3x3
// -1 0 1 1 2 1
// -2 0 2 0 0 0
// -1 0 1 -1 -2 -1
procedure sobel(b : TBitmap);
var
b_read : TBitmap;
x, y : Integer;
wdata , rdata : TBitmapData ;
p: PByteArray;
p1 , p2 , p3 : PByteArray;
temp : array [0..8] of Byte;
begin
b_read := TBitmap.Create;
b_read.Assign(b);
//一个用来修改 w一个用来读取 r
if b.Map( TMapAccess.Write,wdata) and b_read.Map( TMapAccess.Read,rdata) then
begin
for y := 1 to rdata.Height - 2 do
begin
p := wdata.GetScanline(y);
p1 := rdata.GetScanline(y-1);
p2 := rdata.GetScanline(y);
p3 := rdata.GetScanline(y+1);
for x := 1 to rdata.Width - 2 do
begin
//赋值 f
p[x*4] := max(
abs(p1[x*4+4]+p2[x*4+4]*2+p3[x*4+4]-p1[x*4-4]-p2[x*4-4]*2-p3[x*4-4]),
abs(p1[x*4-4]+p1[x*4]*2+p1[x*4+4]-p3[x*4-4]-p3[x*4]*2-p3[x*4+4]));
p[x*4+1] := p[x*4];
p[x*4+2] := p[x*4];
//不透明 b
p[x*4+3] := 255;
end;
end;
b.Unmap(wdata);
b_read.Unmap(rdata);
end;
b_read.Destroy;
end;
//prewitt 算子 3x3
// -1 0 1 1 1 1
// -1 0 1 0 0 0
// -1 0 1 -1 -1 -1
procedure prewitt(b : TBitmap);
var
b_read : TBitmap;
x, y : Integer;
wdata , rdata : TBitmapData ;
p: PByteArray;
p1 , p2 , p3 : PByteArray;
temp : array [0..8] of Byte;
begin
b_read := TBitmap.Create;
b_read.Assign(b);
//一个用来修改 w一个用来读取 r
if b.Map( TMapAccess.Write,wdata) and b_read.Map( TMapAccess.Read,rdata) then
begin
for y := 1 to rdata.Height - 2 do
begin
p := wdata.GetScanline(y);
p1 := rdata.GetScanline(y-1);
p2 := rdata.GetScanline(y);
p3 := rdata.GetScanline(y+1);
for x := 1 to rdata.Width - 2 do
begin
//赋值 f
p[x*4] := max(
abs(p1[x*4+4]+p2[x*4+4]+p3[x*4+4]-p1[x*4-4]-p2[x*4-4]-p3[x*4-4]),
abs(p1[x*4-4]+p1[x*4]+p1[x*4+4]-p3[x*4-4]-p3[x*4]-p3[x*4+4]));
p[x*4+1] := p[x*4];
p[x*4+2] := p[x*4];
//不透明 b
p[x*4+3] := 255;
end;
end;
b.Unmap(wdata);
b_read.Unmap(rdata);
end;
b_read.Destroy;
end;
//robert 算子 2x2
// 1 0 0 1
// 0 -1 -1 0
procedure robert(b : TBitmap);
var
b_read : TBitmap;
x, y : Integer;
wdata , rdata : TBitmapData ;
p: PByteArray;
p1 , p2 : PByteArray;
begin
b_read := TBitmap.Create;
b_read.Assign(b);
//一个用来修改 w一个用来读取 r
if b.Map( TMapAccess.Write,wdata) and b_read.Map( TMapAccess.Read,rdata) then
begin
for y := 1 to rdata.Height - 2 do
begin
p := wdata.GetScanline(y);
p1 := rdata.GetScanline(y-1);
p2 := rdata.GetScanline(y);
for x := 1 to rdata.Width - 2 do
begin
//赋值 f
p[x*4] := max(abs(p2[x*4-4]-p1[x*4]),abs(p1[x*4]-p2[x*4]));
p[x*4+1] := p[x*4];
p[x*4+2] := p[x*4];
//不透明 b
p[x*4+3] := 255;
end;
end;
b.Unmap(wdata);
b_read.Unmap(rdata);
end;
b_read.Destroy;
end;
delphi FMX图像简单的边缘检测(sobel、prewitt、robert)
最新推荐文章于 2024-07-11 15:26:39 发布