图像处理笔记(十八):模板匹配

试一下多种方式的模板匹配:

dev_close_window ()
read_image(Image, '2008531173479_2')
dev_open_window_fit_image(Image, 0, 0, 512, 512, WindowHandle)
dev_display(Image)

* 从原图中裁切一块作为模板
crop_part(Image, ImagePart, 445, 250, 240, 220)
dev_set_draw('margin')
mean_image(ImagePart, ImageMean, 3, 3)
rgb1_to_gray(ImageMean, GrayImage)
* 将原图缩小到一半
zoom_image_size(GrayImage, GrayImage, 120, 110, 'constant')
* 使用切出来创建一个ncc模板(模板生成方式1)
create_ncc_model(GrayImage, 'auto', -0.39, 0.79, 'auto', 'use_polarity', ModelID)
rotate_image(Image, ImageRotate, 45, 'constant')
rgb1_to_gray(Image, GrayImage1)
* 匹配
find_ncc_model(GrayImage1, ModelID, -0.39, 0.79, 0.8, 1, 0.1, 'true', 0, Row, Column, Angle, Score)
if (|Row| > 0)
    gen_rectangle1(Rectangle, Row - 100, Column - 100, Row + 100, Column + 100)
endif

* 模板生成方式2,这个模板是可以旋转匹配的,也就是说,如果图像旋转了,上面那个模板就匹配不到
create_ncc_model(GrayImage, 'auto', 0, rad(360), 'auto', 'use_polarity', ModelID1)
rgb1_to_gray(ImageRotate, GrayImage2)
find_ncc_model(GrayImage2, ModelID1, 0, rad(360), 0.8, 1, 0.1, 'true', 0, Row1, Column1, Angle1, Score1)
if (|Row1| > 0)
    gen_rectangle2(Rectangle1, Row1, Column1, Angle1, 100, 100)
endif

* 模板生成方式3,这个模板是适合有缩放或有旋转的匹配的,如果模板进行了缩放或者图像进行了缩放,上面那两个模板都会匹配不了
* 旋转角度范围和图片缩放比例可配,如果支持的范围太大的话,会影响匹配速度。
create_scaled_shape_model(GrayImage, 'auto', 0, rad(140), 'auto', 0.5, 10, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID2)
find_scaled_shape_model(GrayImage2, ModelID2, 0, rad(140), 0.5, 10, 0.5, 1, 0.5, 'least_squares', 0, 0.1, Row2, Column2, Angle2, Scale, Score2)
if (|Row2| > 0)
    gen_rectangle2(Rectangle2, Row2, Column2, Angle2, 100, 100)
endif

看一下最后一种方式,
create_scaled_shape_model(Template, 输出值,模板
NumLevels, 图像金字塔层数,用来降低匹配时长,每增加一层图像的宽高就会减半,图像分辨率会降低
AngleStart, 旋转开始的弧度
AngleExtend, 旋转的角度范围
AngleStep, 旋转步长,如果不知道怎么设置,可以设置为auto,步长设置的越小,越占用内存,越慢
ScaleMin, 最小缩放倍数
ScaleMax, 最大缩放倍数
ScaleStep, 缩放步长,可以设置为auto
Optimization, 优化方式
Metric, 是否使用极性,如果使用极性,那么如果模板背景灰度弱,前景灰度强,那么匹配的图片也必须满足这样的条件;如果不要求极性,当匹配的图片背景灰度强,前景灰度弱的时候也会匹配到,忽略极性会导致匹配耗时增加
Contrast, 和模板图片对比度相关的一个阈值,可以直接使用auto
MinContrast, 用来匹配的图片的最小对比度
ModelID) 输出值,模板ID

find_scaled_shape_model(Image, 用来查找的图片
ModelID, 模板ID
AngleStart,
AngleExtent,
ScaleMin,
ScaleMax,
MinScore, 匹配的最低分数,大于这个分数的才是被接受的匹配
NumMatches, 需要找的匹配数量
MaxOverlap, 最大重叠
SubPixel, 是否亚像素精度
NumLevels, 图像金字塔层数
Greediness, 搜索贪婪度,0-1,越大搜索越快,可以理解为搜得越不仔细
Row, 搜索到的行坐标
Column, 搜索到的列坐标
Angle, 相对于x轴正半轴的旋转角度
Scale, 图片相对于模板的缩放倍数bc
Score) 得分

搜索到的行列坐标都是匹配上的模板中心坐标。模板的中心坐标默认是模板的原点坐标,可以通过set_shape_model_origin来进行调整。
当模板是对称的时候,需要控制旋转角度来防止搜索到多个角度不同的相同匹配

原文地址:https://www.cnblogs.com/yutou2016/p/11177711.html