上一篇:Delphi检查GetElementByID返回值的有效性
下一篇:Delphi使用Hough变换查找直线

Delphi提取二值图像轮廓

发布于: 2013/1/8 14:55:03   |  发布在: Delphi文章   |  点击:

所谓轮廓提取就是掏空图形的内部点:如果原图中有一点为黑,且它的8个相邻点都是黑色时(此时该点是内部点),则将该点删除。

procedure GetFigure(Bitmap: TBitmap);
var
   b0, b1: Tbitmap;
   i, j: Integer;
   p1, p2, p3, p4: pbyteArray;
begin
   b0 := Tbitmap.Create;
   b1 := Tbitmap.Create;
   b0.Assign(Bitmap);
   b1.Assign(Bitmap);
   b0.PixelFormat := pf24bit;
   b1.PixelFormat := pf24bit;
   for i := 1 to b0.Height - 2 do
   begin
      //扫描三条三邻的像素行
      p1 := b0.ScanLine[i - 1];
      p2 := b0.ScanLine[i];
      p3 := b0.ScanLine[i + 1];
      p4 := b1.ScanLine[i];
      for j := 1 to b0.Width - 2 do
      begin
         if (p2[3 * j + 2] = 0) and (p2[3 * j + 1] = 0) and (p2[3 * j] = 0) then
         begin
            if ((p2[3 * (j - 1) + 2] = 0) and (p2[3 * (j - 1) + 1] = 0) and (p2[3 * (j - 1)] = 0)) and
               ((p2[3 * (j + 1) + 2] = 0) and (p2[3 * (j + 1) + 1] = 0) and (p2[3 * (j + 1)] = 0)) and
               ((p1[3 * (j + 1) + 2] = 0) and (p1[3 * (j + 1) + 1] = 0) and (p1[3 * (j + 1)] = 0)) and
               ((p1[3 * (j) + 2] = 0) and (p1[3 * (j) + 1] = 0) and (p1[3 * (j)]= 0)) and
               ((p1[3 * (j - 1) + 2] = 0) and (p1[3 * (j - 1) + 1] = 0) and (p1[3 * (j - 1)] = 0)) and
               ((p3[3 * (j - 1) + 2] = 0) and (p3[3 * (j - 1) + 1] = 0) and (p3[3 * (j - 1)] = 0)) and
               ((p3[3 * (j) + 2] = 0) and (p3[3 * (j) + 1] = 0) and (p3[3 * (j)]= 0)) and
               ((p3[3 * (j + 1) + 2] = 0) and (p3[3 * (j + 1) + 1] = 0) and (p3[3 * (j + 1)] = 0)) then
            begin
               p4[3 * j + 2] := 255;
               p4[3 * j + 1] := 255;
               p4[3 * j] := 255;
            end;
         end;
      end;
      Bitmap.Assign(b1);
   end;
   b1.Free;
   b0.Free;
end;

二值图像