Image1: TImage;
Button1: TButton;
Image2: TImage;
+ Button2: TButton;
procedure Button1Click(Sender: TObject);
+ procedure Button2Click(Sender: TObject);
private
{ Private \90é\8c¾ }
function thinning4(nx, ny: integer; img: TRawImg): integer;
function connect(a: array of integer): integer;
procedure getBinaryImage(bmp: TBitmap; arr: TRawImg);
+ procedure getBorder4(nx, ny: integer; f, border: TRawImg);
+ procedure chase4(i, j, code: integer; f, border: TRawImg);
public
{ Public \90é\8c¾ }
end;
color.rgbtBlue := 255;
color.rgbtGreen := 255;
color.rgbtRed := 255;
- for j := 0 to ny - 1 do
+ for j := ny - 1 downto 0 do
begin
Pointer(g) := bmp.ScanLine[j];
for i := 0 to nx - 1 do
Finalize(f);
end;
+procedure TForm1.Button2Click(Sender: TObject);
+var
+ bmp1, bmp2: TBitmap;
+ f, border: TRawImg;
+ g: array of TRGBTriple;
+ c: TRGBTriple;
+ nx, ny: integer;
+ i: integer;
+ j: integer;
+begin
+ bmp1 := TBitmap.Create;
+ bmp2 := TBitmap.Create;
+ try
+ bmp1.Assign(Image1.Picture.Bitmap);
+ nx := bmp1.Width;
+ ny := bmp1.Height;
+ bmp2.Width := nx;
+ bmp2.Height := ny;
+ bmp2.Canvas.FloodFill(0, 0, clWhite, fsSurface);
+ SetLength(f, nx, ny);
+ SetLength(border, nx, ny);
+ getBinaryImage(bmp1, f);
+ for j := 0 to ny - 1 do
+ for i := 0 to nx - 1 do
+ border[i, j] := 0;
+ getBorder4(nx, ny, f, border);
+ for j := ny - 1 downto 0 do
+ begin
+ Pointer(g) := bmp2.ScanLine[j];
+ for i := 0 to nx - 1 do
+ if border[i, j] = 1 then
+ begin
+ c.rgbtBlue := 0;
+ c.rgbtGreen := 0;
+ c.rgbtRed := 0;
+ g[i] := c;
+ end;
+ end;
+ Image2.Picture.Assign(bmp2);
+ finally
+ bmp1.Free;
+ bmp2.Free;
+ end;
+ Finalize(f);
+ Finalize(border);
+end;
+
+procedure TForm1.chase4(i, j, code: integer; f, border: TRawImg);
+var
+ i1, i2, j1, j2, ist, jst: integer;
+begin
+ i1 := i;
+ j1 := j;
+ ist := i;
+ jst := j;
+ i2 := 0;
+ j2 := 0;
+ while (i2 <> ist) or (j2 <> jst) do
+ begin
+ case code of
+ 0:
+ begin
+ i2 := i1;
+ j2 := j1 + 1;
+ if f[i2, j2] = 1 then
+ code := 6
+ else
+ code := 2;
+ end;
+ 2:
+ begin
+ i2 := i1 + 1;
+ j2 := j1;
+ if f[i2, j2] = 1 then
+ code := 0
+ else
+ code := 4;
+ break;
+ end;
+ 4:
+ begin
+ i2 := i1;
+ j2 := j1 - 1;
+ if f[i2, j2] = 1 then
+ code := 2
+ else
+ code := 6;
+ break;
+ end;
+ 6:
+ begin
+ i2 := i1 - 1;
+ j2 := j1;
+ if f[i2, j2] = 1 then
+ code := 4
+ else
+ code := 0;
+ break;
+ end;
+ end;
+ if f[i2, j2] = 1 then
+ begin
+ border[i2, j2] := 1;
+ i1 := i2;
+ j1 := j2;
+ end;
+ end;
+end;
+
function TForm1.connect(a: array of integer): integer;
var
i: integer;
begin
wid := bmp.Width;
hei := bmp.Height;
- for j := 0 to hei - 1 do
+ for j := hei - 1 downto 0 do
begin
Pointer(g) := bmp.ScanLine[j];
for i := 0 to wid - 1 do
end;
end;
+procedure TForm1.getBorder4(nx, ny: integer; f, border: TRawImg);
+var
+ i, j, code: integer;
+begin
+ for j := 0 to ny - 1 do
+ for i := 0 to nx - 1 do
+ if (f[i, j] = 1) and (border[i, j] = 0) then
+ if f[i - 1, j] = 0 then
+ begin
+ code := 0;
+ chase4(i, j, code, f, border);
+ end
+ else if f[i + 1, j] = 0 then
+ begin
+ code := 4;
+ chase4(i, j, code, f, border);
+ end;
+end;
+
function TForm1.thinning4(nx, ny: integer; img: TRawImg): integer;
var
i, j, k, c: integer;