delphi FMX使用模糊集合进行边缘提取

2017-12-14 20:01:37来源:CSDN作者:qq_38204686人点击

分享
//模糊集合的边缘提取procedure mohulvbo(b : TBitmap);var   b_read : TBitmap;   x, y , I : Integer;   //0  黑 白 三个输入隶属度函数   ze , bl, wh : array [0..255] of single;   wdata , rdata: TBitmapData ;   p0,p,p1,pw: PByteArray;   n : array [0..4] of single;begin   b_read := TBitmap.Create;   b_read.Assign(b);   //初始化三个输入隶属度函数   for I := 0 to 255 do   begin     if i<64 then     begin       ze[i] := (63-i)/63;       bl[i] := (192-i)/192;       wh[i] := 0;     end     else if i<192 then     begin       ze[i] := 0;       bl[i] := (192-i)/192;       wh[i] := (i-63)/192;     end     else     begin       ze[i] := 0;       bl[i] := 0;       wh[i] := (i-63)/192;     end;   end;   // 不考虑最外一层像素     遍历图像赋值  4邻域和中心点   if  b.Map( TMapAccess.ReadWrite, wdata)and b_read.Map( TMapAccess.Read,rdata)  then   begin        //3x3的小窗口    3x3        for y := 1 to rdata.Height - 2 do        begin            p0:= rdata.GetScanline(y-1);            p := rdata.GetScanline(y);            p1:= rdata.GetScanline(y+1);            pw := wdata.GetScanline(y);            //3x3            for x := 1 to rdata.Width - 2 do            begin               //中心点及其 4领域  top right bottom left               //n[0] := p[x*4];               n[1] := ze[abs(p0[x*4]-p[x*4])];               n[2] := ze[abs(p[x*4+4]-p[x*4])];               n[3] := ze[abs(p1[x*4]-p[x*4])];               n[4] := ze[abs(p[x*4-4]-p[x*4])];               //计算 and  并集  =  min               n[0] := min(n[1],n[2])  ;               n[1] := min(n[4],n[1])  ;               n[2] := min(n[2],n[3])  ;               n[3] := min(n[3],n[4])  ;               // 计算 else = 1- max(1,2,3,4)               n[4] := 1-max(max(n[0],n[1]),max(n[2],n[3]));               //最后计算聚合模糊集合的重心  给中心像素赋值               pw[x*4] := round(                         (n[0]*(n[0]*192+63) +                          n[1]*(n[1]*192+63) +                          n[2]*(n[2]*192+63) +                          n[3]*(n[3]*192+63) +                          n[4]*(192-n[4]*192))   / (n[0]+n[1]+n[2]+n[3]+n[4])                               );               pw[x*4+1] := pw[x*4];               pw[x*4+2] := pw[x*4];            end;        end;        b.Unmap(wdata);        b_read.Unmap(rdata);   end;   b_read.Free;end;

结果 :  

原理 : 

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台