简单的图片对比函数
function Compare(bit1: TBitmap; bit2: TBitmap; nC: Integer; Img: TImage): Integer;
var
  x,y , nRe: Integer;
  bx, by, bbs: Byte;
  bColor: TColor;
  temBit: TBitmap;
begin
  if Img <> nil then
  begin
    temBit := TBitmap.Create;
    temBit.Width := bit1.Width;
    temBit.Height := bit1.Height;
  end;
  nRe := 0;
  for x := 0 to bit1.Width -1 do
  begin
    for y:= 0 to bit1.Height -1 do
    begin
      bx := GetBValue(bit1.Canvas.pixels[x,y]);
      by := GetBValue(bit2.Canvas.pixels[x,y]);
      bbs := abs(bx- by);
      if bbs < nC then
      begin
        bColor := clBlack;
      end else
      begin
        bColor := clWhite;
        Inc(nRe);
      end;
      if Img <> nil then
        temBit.Canvas.pixels[x,y]:= bColor;
    end;
  end;
  if Img <> nil then
    Img.Picture.Bitmap.Assign(temBit);
  temBit.Free;
  Result := nRe;
end;
 
//一种更快的方法
function Compare2(bit1: TBitmap; bit2: TBitmap; nC: Integer; Img: TImage): Integer;
var
  x,y , nRe: Integer;
  bbs: Byte;
  bColor: TColor;
  temBit: TBitmap;
  pix1, pix2: PByteArray;
begin
  if Img <> nil then
  begin
    temBit := TBitmap.Create;
    temBit.Width := bit1.Width;
    temBit.Height := bit1.Height; 
  end;
  nRe := 0;
  for y:= 0 to bit1.Height -1 do
  begin
    pix1 := bit1.Scanline[y];
    pix2 := bit2.Scanline[y];
    for x:= 0 to bit1.Width-1 do
    begin
      bbs := abs(pix1[x*3]- pix2[x*3]);
      if bbs < nC then
      begin
        bColor := clBlack;
      end else
      begin
        bColor := clWhite;
        Inc(nRe);
      end;
      if Img <> nil then
        temBit.Canvas.pixels[x,y]:= bColor;
    end;
  end;
  if Img <> nil then
  begin
    Img.Picture.Bitmap.Assign(temBit);
    temBit.Free;
  end;
  Result := nRe;
end;
取灰度值, 设置容差, 返回差度


安防 工控软件定制 QQ 2822八4536
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号