Delphi二值图像投影算法


本文介绍的是二值图像水平和垂直两个方向对图像进行投影的算法。

说明:此处处理的二值图像是指只有黑白两种颜色的24位真彩位图,并不是Windows画图程序生成的单色位图。

进行水平方向投影

procedure TForm1.Button1Click(Sender: TObject);
var
 X, Y, i, j: integer;
 P: pByteArray;
 bmp: TBitmap;
 iCount: integer;
begin
 bmp := TBitmap.Create;
 bmp.Assign(Image1.Picture.Bitmap);
 for Y := 0 to bmp.Height - 1 do
 begin
 P := bmp.ScanLine[Y];
 iCount := 0; // 设置每一行扫描的初值
 for X := 0 to bmp.Width - 1 do
 if ((P[3 * X + 2] = 0) and (P[3 * X + 1] = 0) and (P[3 * X] = 0)) then
 Inc(iCount);  // 统计每一行的黑色点的数目,记录为iCount
 for i := 0 to iCount do // 从左边开始,给一行iCount个像素点涂上黑色
 begin
 P[3 * i] := 0;
 P[3 * i + 1] := 0;
 P[3 * i + 2] := 0;
 end;
 for j := iCount to bmp.Width - 1 do // 其他点涂白色
 begin
 P[3 * j] := 255;
 P[3 * j + 1] := 255;
 P[3 * j + 2] := 255;
 end;
 end;
 Image2.Picture.Bitmap.Assign(bmp);
 bmp.Free;
end;

进行垂直方向投影

procedure TForm1.Button2Click(Sender: TObject);
const
 CI_PIC_MAX_WIDTH = 1024; //图片最大宽度
var
 X, Y, iWidth: integer;
 P: pByteArray;
 bmp: TBitmap;
 iCount: array[0..CI_PIC_MAX_WIDTH] of Integer;
begin
 for X:= 0 to CI_PIC_MAX_WIDTH do iCount[X] := 0; //初始化数组
 bmp := TBitmap.Create;
 bmp.Assign(Image1.Picture.Bitmap);
 if bmp.Width > CI_PIC_MAX_WIDTH then iWidth := CI_PIC_MAX_WIDTH else iWidth := bmp.Width;
 for Y := 0 to bmp.Height - 1 do
 begin
 P := bmp.ScanLine[Y];
 for X := 0 to iWidth - 1 do
 if ((P[3 * X + 2] = 255) and (P[3 * X + 1] = 255) and (P[3 * X] = 255)) then
 Inc(iCount[X]);  // 统计每一列的白色点的数目,记录为iCount数组
 end;
 for Y := 0 to bmp.Height - 1 do
 begin
 P := bmp.ScanLine[Y];
 for X := 0 to iWidth - 1 do if iCount[X] > Y then
 begin
 P[3 * X] := 255;
 P[3 * X + 1] := 255;
 P[3 * X + 2] := 255;
 end else begin
 P[3 * X] := 0;
 P[3 * X + 1] := 0;
 P[3 * X + 2] := 0;
 end;
 end;
 Image3.Picture.Bitmap.Assign(bmp);
 bmp.Free;
end;

联系电话:
020-00000000
联系电话:
020-00000000
联系电话:
020-12345678