delphi FMX图像简单滤波(中值、均值、高斯)

2017-10-29 11:17:58来源:CSDN作者:qq_38204686人点击

分享
//排序 paixuprocedure paixu(var temp : array of Byte);var   i,j : Integer;   t : Byte;begin   for i := low(temp) to high(temp)-1 do    for j := i to high(temp)-1 do     if temp[i]<temp[j] then     begin       t := temp[i];       temp[i] := temp[j];       temp[j] := t;     end;end;//灰度图的中值滤波 3x3procedure zhongzhi(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                temp[0] := p1[x*4-4];                temp[1] := p1[x*4];                temp[2] := p1[x*4+4];                temp[3] := p2[x*4-4];                temp[4] := p2[x*4];                temp[5] := p2[x*4+4];                temp[6] := p3[x*4-4];                temp[7] := p3[x*4];                temp[8] := p3[x*4+4];                //排序 mao                paixu(temp);                //赋值  f                p[x*4] := temp[4];                p[x*4+1] := temp[4];                p[x*4+2] := temp[4];                //不透明 b                p[x*4+3] := 255;            end;        end;        b.Unmap(wdata);        b_read.Unmap(rdata);   end;   b_read.Destroy;end;//求和 sumfunction sum(temp : array of Byte):Byte;var   I : Integer;begin   result := 0;   for I := Low(temp) to High(temp) do   begin       result := result + temp[I];   end;end;//均值滤波  3x3procedure junzhi(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                temp[0] := p1[x*4-4] div 9;                temp[1] := p1[x*4] div 9;                temp[2] := p1[x*4+4] div 9;                temp[3] := p2[x*4-4] div 9;                temp[4] := p2[x*4] div 9;                temp[5] := p2[x*4+4] div 9;                temp[6] := p3[x*4-4] div 9;                temp[7] := p3[x*4] div 9;                temp[8] := p3[x*4+4] div 9;                //平均  pin                temp[4] := sum(temp);                //赋值  f                p[x*4] := temp[4];                p[x*4+1] := temp[4];                p[x*4+2] := temp[4];                //不透明 b                p[x*4+3] := 255;            end;        end;        b.Unmap(wdata);        b_read.Unmap(rdata);   end;   b_read.Destroy;end;//高斯滤波 3x3procedure gaosi(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                temp[0] := p1[x*4-4] div 16;                temp[1] := p1[x*4] div 8;                temp[2] := p1[x*4+4] div 16;                temp[3] := p2[x*4-4] div 8;                temp[4] := p2[x*4] div 4;                temp[5] := p2[x*4+4] div 8;                temp[6] := p3[x*4-4] div 16;                temp[7] := p3[x*4] div 8;                temp[8] := p3[x*4+4] div 16;                //高斯模板 3x3                temp[4] := sum(temp);                //赋值  f                p[x*4] := temp[4];                p[x*4+1] := temp[4];                p[x*4+2] := temp[4];                //不透明 b                p[x*4+3] := 255;            end;        end;        b.Unmap(wdata);        b_read.Unmap(rdata);   end;   b_read.Destroy;end;

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台