Janilabo

Erosion and Shrink

Nov 5th, 2013
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 3.01 KB | None | 0 0
  1. procedure TPAErosion(var TPA: TPointArray; iterations: Integer);
  2. var
  3.   w, h, l, i, j, c, s, g, n, t, q: Integer;
  4.   m: T2DIntegerArray;
  5.   se: TStructuringElement;
  6.   p: TPoint;
  7.   b: TBox;
  8. begin
  9.   if (iterations > 0) then
  10.   begin
  11.     l := Length(TPA);
  12.     if (l > 0) then
  13.     begin
  14.       b := pp_TPABounds(TPA);
  15.       pp_BoxExpand(b);
  16.       pp_BoxDimensions(b, w, h);
  17.       m := pp_Create(0, w, h);
  18.       se := pp_SE_Cross(1, 1, -1, 1, 1);
  19.       g := 3;
  20.       c := 0;
  21.       for i := 0 to (l - 1) do
  22.         if not (m[(TPA[i].X - b.X1)][(TPA[i].Y - b.Y1)] = 1) then
  23.         begin
  24.           m[(TPA[i].X - b.X1)][(TPA[i].Y - b.Y1)] := 1;
  25.           TPA[c] := TPA[i];
  26.           c := (c + 1);
  27.         end;
  28.       l := (l - (l - c));
  29.       if (c > 0) then
  30.         SetLength(TPA, l);
  31.       t := 0;
  32.       repeat
  33.         n := 0;
  34.         s := (l - 1);
  35.         for i := 0 to s do
  36.         begin
  37.           q := 0;
  38.           for j := 0 to g do
  39.           begin
  40.             p.X := (TPA[i].X + se[j].pixel.X);
  41.             p.Y := (TPA[i].Y + se[j].pixel.Y);
  42.             q := (q + m[(p.X - b.X1)][(p.Y - b.Y1)]);
  43.           end;
  44.           if ((q > 0) and (q < 4)) then
  45.           begin
  46.             m[(TPA[i].X - b.X1)][(TPA[i].Y - b.Y1)] := 0;
  47.             l := (l - 1);
  48.           end else
  49.           begin
  50.             TPA[n] := TPA[i];
  51.             n := (n + 1);
  52.           end;
  53.         end;
  54.         t := (t + 1);
  55.       until ((t >= iterations) or (l <= 1));
  56.     end;
  57.     SetLength(TPA, l);
  58.   end;
  59. end;
  60.  
  61. procedure TPAShrink(var TPA: TPointArray; iterations: Integer);
  62. var
  63.   w, h, l, i, j, c, s, g, n, t, q: Integer;
  64.   m: T2DIntegerArray;
  65.   se: TStructuringElement;
  66.   p: TPoint;
  67.   b: TBox;
  68. begin
  69.   if (iterations > 0) then
  70.   begin
  71.     l := Length(TPA);
  72.     if (l > 0) then
  73.     begin
  74.       b := pp_TPABounds(TPA);
  75.       pp_BoxExpand(b);
  76.       pp_BoxDimensions(b, w, h);
  77.       m := pp_Create(0, w, h);
  78.       se := pp_SE_Rectangle(1, 1, 1, 1, -1, 1, 1, 1, 1);
  79.       g := 7;
  80.       c := 0;
  81.       for i := 0 to (l - 1) do
  82.         if not (m[(TPA[i].X - b.X1)][(TPA[i].Y - b.Y1)] = 1) then
  83.         begin
  84.           m[(TPA[i].X - b.X1)][(TPA[i].Y - b.Y1)] := 1;
  85.           TPA[c] := TPA[i];
  86.           c := (c + 1);
  87.         end;
  88.       l := (l - (l - c));
  89.       if (c > 0) then
  90.         SetLength(TPA, l);
  91.       t := 0;
  92.       repeat
  93.         n := 0;
  94.         s := (l - 1);
  95.         for i := 0 to s do
  96.         begin
  97.           q := 0;
  98.           for j := 0 to g do
  99.           begin
  100.             p.X := (TPA[i].X + se[j].pixel.X);
  101.             p.Y := (TPA[i].Y + se[j].pixel.Y);
  102.             q := (q + m[(p.X - b.X1)][(p.Y - b.Y1)]);
  103.           end;
  104.           if ((q > 0) and (q < 8)) then
  105.           begin
  106.             m[(TPA[i].X - b.X1)][(TPA[i].Y - b.Y1)] := 0;
  107.             l := (l - 1);
  108.           end else
  109.           begin
  110.             TPA[n] := TPA[i];
  111.             n := (n + 1);
  112.           end;
  113.         end;
  114.         t := (t + 1);
  115.       until ((t >= iterations) or (l <= 1));
  116.     end;
  117.     SetLength(TPA, l);
  118.   end;
  119. end;
Advertisement
Add Comment
Please, Sign In to add comment