//模糊集合的边缘提取
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;
结果 :
原理 :