路过的帮看看-怎么改进这段关于图像的查找的代码
路过的大虾帮看看-----------如何改进这段关于图像的查找的代码?
在学图像编程,书都翻烂了,也没找到好的处理方法...
路过的大虾帮看一下,代码不多,我的代码已经可以正常查找,但是当遇到图像有一点点差异就不行了,我想加入容错机制,
但怎么搞,都解决不了..
需求是这样:
.有一个大图image1,有很多小图在路径Edit1.txt,小图存在于大图中不同的地方,要找出不同的小图在大图中的位置,然后标识出这个小图的名称出来.
要达到的效果:
如果小图有一点像索点的差异,需要可以容错的找出来.
我试过了采用像素点数的方法,但要一个常数,参数值得出的结果也不精准.
可不可以采用一个区域宽度内的相似度算法呢?把相似度最好的找出来.
但不知如何下手,或是有没有别的方法呢?
在学图像编程,书都翻烂了,也没找到好的处理方法...
路过的大虾帮看一下,代码不多,我的代码已经可以正常查找,但是当遇到图像有一点点差异就不行了,我想加入容错机制,
但怎么搞,都解决不了..
需求是这样:
.有一个大图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;