当前位置: 代码迷 >> 综合 >> delphi FMX图像简单的边缘检测(sobel、prewitt、robert)
  详细解决方案

delphi FMX图像简单的边缘检测(sobel、prewitt、robert)

热度:4   发布时间:2023-12-13 05:30:00.0
//sobel   算子      3x3
//      -1 0 1       1  2  1
//      -2 0 2       0  0  0
//      -1 0 1      -1 -2 -1
procedure sobel(b : TBitmap);
varb_read : TBitmap;x, y : Integer;wdata , rdata : TBitmapData ;p: PByteArray;p1 , p2 , p3 : PByteArray;temp : array [0..8] of Byte;
beginb_read := TBitmap.Create;b_read.Assign(b);//一个用来修改  w一个用来读取 rif  b.Map( TMapAccess.Write,wdata) and b_read.Map( TMapAccess.Read,rdata) thenbeginfor y := 1 to rdata.Height - 2 dobeginp := wdata.GetScanline(y);p1 := rdata.GetScanline(y-1);p2 := rdata.GetScanline(y);p3 := rdata.GetScanline(y+1);for x := 1 to rdata.Width - 2 dobegin//赋值  fp[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];//不透明 bp[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);
varb_read : TBitmap;x, y : Integer;wdata , rdata : TBitmapData ;p: PByteArray;p1 , p2 , p3 : PByteArray;temp : array [0..8] of Byte;
beginb_read := TBitmap.Create;b_read.Assign(b);//一个用来修改  w一个用来读取 rif  b.Map( TMapAccess.Write,wdata) and b_read.Map( TMapAccess.Read,rdata) thenbeginfor y := 1 to rdata.Height - 2 dobeginp := wdata.GetScanline(y);p1 := rdata.GetScanline(y-1);p2 := rdata.GetScanline(y);p3 := rdata.GetScanline(y+1);for x := 1 to rdata.Width - 2 dobegin//赋值  fp[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];//不透明 bp[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);
varb_read : TBitmap;x, y : Integer;wdata , rdata : TBitmapData ;p: PByteArray;p1 , p2 : PByteArray;
beginb_read := TBitmap.Create;b_read.Assign(b);//一个用来修改  w一个用来读取 rif  b.Map( TMapAccess.Write,wdata) and b_read.Map( TMapAccess.Read,rdata) thenbeginfor y := 1 to rdata.Height - 2 dobeginp := wdata.GetScanline(y);p1 := rdata.GetScanline(y-1);p2 := rdata.GetScanline(y);for x := 1 to rdata.Width - 2 dobegin//赋值  fp[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];//不透明 bp[x*4+3] := 255;end;end;b.Unmap(wdata);b_read.Unmap(rdata);end;b_read.Destroy;
end;

  相关解决方案