正如 Mike 所指出的,互相关是在存在噪声的情况下搜索模式的好方法。但是,在没有噪音的情况下进行搜索会更好(如果不是完美的方法)!这将适用于 1D 和 2D 脚本。见下文
number sx = 1024
number sy = 1024
number pw = 32
number ph = 32
number px = 100 // trunc( random()*(sx-pw) )
number py = 200 // trunc( random()*(sy-ph) )
image test := RealImage("Data",4,sx,sy)
test = random()
image pattern := test[py,px,py+ph,px+pw].ImageClone()
//test.showimage()
//pattern.showimage()
image patternSearch = test*0
patternSearch[0,0,ph,pw] = pattern
//patternSearch.ShowImage()
image corr := CrossCorrelate(test,patternSearch)
corr.ShowImage()
number mx,my,mv
mv = max(corr,mx,my)
mx -= trunc(sx/2) // because we've placed the pattern in the
my -= trunc(sy/2) // top/left of the search-mask
Result("\n Pattern = " + px + " / " + py )
Result("\n max = " + mv + " at " + mx + "/" + my )
image found = test*0
found[my,mx,my+ph,mx+pw]=pattern
rgbImage overlay = RGB((test-found)*256,found*256,0)
overlay.ShowImage()
如果您的问题只是 1D 并且您拥有非常大的数据,那么另一种方法可能会为您提供更快的解决方案。然后,我建议尝试使用 RAW 数据流(通过 TagGroup Streaming 命令)并使用您必须调整搜索的任何其他信息,即仅搜索流中模式的开头,然后仅验证“命中” “ ETC。
此处添加了注释以解决有关 1D 图像中的搜索模式的问题。如果我们多次运行以下脚本,我们会发现大约 50% 的时间无法正确找到模式。
number sx = 1024
number sy = 0
number pw = 16
number ph = 0
number px = trunc( random()*(sx-pw) )
number py = 0 // trunc( random()*(sy-ph) )
image test := RealImage("Data",4,sx );
test = random();
image patternSearch := exprsize( sx, icol<pw? test[icol+px, irow]: 0 );
// test.ShowImage();
// patternSearch.ShowImage();
patternSearch.SetName( "PatternSearch" );
//
image corr := CrossCorrelate(test,patternSearch)
// corr.ShowImage()
number mx,my,mv
mv = max(corr,mx,my)
mx -= trunc(sx/2) // because we've placed the pattern in the
my -= trunc(sy/2) // top/left of the search-mask
if( mx <= 0 ) mx += sx;
Result("\n\n Pattern = " + px + " / " + py )
Result("\n max = " + mv + " at " + mx + "/" + my )