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

//模糊集合的边缘提取
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;

结果 :  

原理 : 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大米粥哥哥

感谢认可!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值