路过的帮看看-怎么改进这段关于图像的查找的代码

路过的大虾帮看看-----------如何改进这段关于图像的查找的代码?
在学图像编程,书都翻烂了,也没找到好的处理方法...
路过的大虾帮看一下,代码不多,我的代码已经可以正常查找,但是当遇到图像有一点点差异就不行了,我想加入容错机制,
但怎么搞,都解决不了..



需求是这样:
.有一个大图image1,有很多小图在路径Edit1.txt,小图存在于大图中不同的地方,要找出不同的小图在大图中的位置,然后标识出这个小图的名称出来.

要达到的效果:
如果小图有一点像索点的差异,需要可以容错的找出来.
我试过了采用像素点数的方法,但要一个常数,参数值得出的结果也不精准.

可不可以采用一个区域宽度内的相似度算法呢?把相似度最好的找出来.
但不知如何下手,或是有没有别的方法呢?




//代码可以运行和测试,可以在大图里截几个小图试一下,用简单的黑白图片测试即可(截那个图里的几个小图存到一个路径里做模
//版,Edit1的值指向那个路径,Image1加载大图),24位的bmp格式.
unit Main;

interface

uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ExtCtrls, StdCtrls, ExtDlgs, IdGlobal;

const
    PixelCountMax = 32768;
type
    pRGBTripleArray = ^TRGBTripleArray;
    TRGBTripleArray = array[0..PixelCountMax - 1] of TRGBTriple;

type
    TMainForm = class(TForm)
        Image1: TImage;
        Image2: TImage;
        Memo1: TMemo;
        Button1: TButton;
        OpenPictureDialog1: TOpenPictureDialog;
        OpenPictureDialog2: TOpenPictureDialog;
        Label1: TLabel;
        Memo2: TMemo;
        Edit1: TEdit;
        Button4: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        function BmpCmpEx(bmpBig, bmp: TBitmap; x, y: integer; nV: byte): boolean; //图片对比
        function BmpFindEx(bmpBig, bmp: TBitmap; x1, y1, x2, y2: integer; nV: byte; Txt: string): Boolean;
    private
        { Private declarations }
    public
        { Public declarations }



    end;

var
    MainForm: TMainForm;

    //L, T, Lx: Integer; //已找到的子图的x和Y值 ,也就是左边和上边
    bmpFindX, bmpFindY: Integer; //第二种方法找到的点
    TxtAry: array of string;
    eight: array[1..8, 1..8] of TLabel;

implementation

uses StrUtils;

{$R *.dfm}
//初始化
procedure TMainForm.FormCreate(Sender: TObject);
begin
    DoubleBuffered := True;
    Image1.Picture.Bitmap.PixelFormat := pf24bit;
    Image2.Picture.Bitmap.PixelFormat := pf24bit;
end;

// 在大图里对比小图
function TMainForm.BmpCmpEx(bmpBig, bmp: TBitmap; x, y: integer; nV: byte): boolean;
var
    i, j: integer;
    row1, row2: pRGBTripleArray;
    p1, p2: TRGBTriple;
    pLow, pHigh: TRGBTriple;

begin
    result := true;

    //扫描整个小图
    for j := 0 to bmp.Height - 1 do
    begin
        row1 := bmpBig.ScanLine[y + j]; //大图
        row2 := bmp.ScanLine[j]; //小图
        for i := 0 to bmp.Width - 1 do
        begin
            p1 := row1[x + i];
            p2 := row2[i];

            if not ((p1.rgbtRed = p2.rgbtRed) and
                (p1.rgbtGreen = p2.rgbtGreen) and
                (p1.rgbtBlue = p2.rgbtBlue)) then
            begin
                result := false;
                exit; //不同则退出
            end; 
        end;
    end;
end;