一、模板匹配相關(guān)概念
(一)什么是模板匹配?
模板匹配指的是通過模板圖像與測(cè)試圖像之間的比較,找到測(cè)試圖像上與模板圖像相似的部分,這是通過計(jì)算模板圖像與測(cè)試圖像中目標(biāo)的相似度來實(shí)現(xiàn)的,可以快速地在測(cè)試圖像中定位出預(yù)定義的目標(biāo)
是圖像處理中最基本、最常用的匹配方法
(二)匹配主要思路
為感興趣的對(duì)象創(chuàng)建模型:使用具用代表性圖像來創(chuàng)模板匹配模型句柄
在搜索圖像中查找模型:在圖像中搜索先前創(chuàng)建的模型的實(shí)例及其位置,搜索它們的角度及行列坐標(biāo)
(三)匹配結(jié)果
-
通過模板匹配可以得到目標(biāo)的相似度,旋轉(zhuǎn)角度,行列坐標(biāo),縮放大小等
(四)需要處理的問題
針對(duì)不同的圖像特征和檢測(cè)環(huán)境,有多種模板匹配算法
如何選擇合適的模板匹配算法,取決于具體的圖像數(shù)據(jù)和匹配任務(wù)
只有理解這些算法的原理和適用場(chǎng)景后,才能根據(jù)項(xiàng)目的需要選擇合適的算法
(五)模板匹配的分類
HALCON模板匹配包含:基于點(diǎn)、基于灰度值、基于描述性、基于相關(guān)性、基于形狀、基于組件、局部可變形、可變形的
常用的方式是基于相關(guān)性和基于形狀
二、基于灰度值的模板匹配(Gray-Value-Based,不怎么用的)
-
基于灰度值的模板匹配是最經(jīng)典的模板匹配算法,也是最早提出來的模板匹配算法
(一)根本思想
-
計(jì)算模板圖像與檢測(cè)圖像之間的像素灰度差值的絕對(duì)值總和(SAD方法)或者平方差總和(SSD方法)
(二)原理
(三)使用條件
首先選擇一塊ROI(感興趣區(qū)域)作為模板圖像,生成基于灰度值的模板
然后將檢測(cè)圖像與模板圖像進(jìn)行粗匹配,在檢測(cè)圖像與模板圖像中任選一點(diǎn),采取隔點(diǎn)搜索的方式計(jì)算二者灰度的相似性,這樣粗匹配一遍得到粗相關(guān)點(diǎn)
接下來進(jìn)行精匹配,將得到的粗相關(guān)點(diǎn)作為中心點(diǎn),用最小二乘法尋找二者之間的最優(yōu)匹配點(diǎn)
該方法是利用模板圖像的所有灰度值進(jìn)行匹配,但在光照發(fā)生變化的情況下灰度值會(huì)產(chǎn)生強(qiáng)烈的變化
因此該方法不能適應(yīng)光照發(fā)生變化的情況,也不能用于多通道圖像的匹配
適用于目標(biāo)圖像光照比較穩(wěn)定的情況,多數(shù)情況下還是優(yōu)先考慮基于相關(guān)性的匹配和基于形狀的匹配。只有針對(duì)極少數(shù)的簡(jiǎn)單圖像,才會(huì)考慮基于灰度值的匹配
(四)灰度匹配算子
/*
1.創(chuàng)建模板:create_template()
2.搜索模板和圖像的最佳匹配:best_match()
3.釋放模板:clear_template()
*/
(五)實(shí)例
// 清空窗口,然后讀取圖像,轉(zhuǎn)換為灰度圖。關(guān)閉當(dāng)前圖像窗口并打開一個(gè)固定縱橫比的窗口用來顯示窗口
dev_clear_window ()
read_image(Image, '灰度.png')
rgb1_to_gray(Image, GrayImage)
dev_close_window()
dev_open_window_fit_image(GrayImage, 0, 0, -1, -1, WindowHandle)
dev_display(GrayImage)
// 畫ROI區(qū)域(單個(gè)圓點(diǎn)),用于創(chuàng)建模板
draw_circle(WindowHandle, Row1, Column1, Radius1)
gen_circle(ROI_0, Row1, Column1, Radius1)
reduce_domain(GrayImage, ROI_0, ImageReduced)
create_template(ImageReduced, 255, 4, 'sort', 'original', TemplateID)
// 二值化后進(jìn)行連通域操作,多條件篩選想要的區(qū)域
threshold(GrayImage, Region, 128, 255)
connection(Region, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 50000)
// 為選中的區(qū)域增加灰度值,這里增加的是灰度圖
add_channels(SelectedRegions, GrayImage, GrayRegions)
// 搜索模板和圖像的最佳匹配。
best_match(GrayRegions, TemplateID, 40, 'false', Row, Column, Error1)
// 生成特定長(zhǎng)度的元組并初始化其元素,將所有的圓半徑設(shè)為20
// 要生成元組長(zhǎng)度,常量,用于初始化元組元素。新生成的元組中每個(gè)元素的數(shù)據(jù)類型和值由輸入?yún)?shù)Const決定,該參數(shù)可能只包含單個(gè)元素。Newtuple中的所有元素都具有與Const中單個(gè)元素相同的數(shù)據(jù)類型和值。
tuple_gen_const(|Row|, 20, Radius)
dev_set_line_width (3)
// 創(chuàng)建與圓或圓弧對(duì)應(yīng)的XLD輪廓
gen_circle_contour_xld(Circles, Row, Column, Radius, 0, 6.28318, 'positive', 1)
dev_display(GrayImage)
dev_display(Circles)
三、基于形變的模板匹配?
基于形變的模板匹配也是一種基于形狀的匹配方法。但是基于形變的模板匹配返回結(jié)果中不僅包括輕微形變的形狀、形變的位置和參數(shù),還有描述形變的參數(shù),如旋轉(zhuǎn)角度、縮放倍數(shù)等
基于透視的形變可以返回一個(gè)二維投影變換矩陣。如果是在相機(jī)標(biāo)定的情況下,通過相機(jī)參數(shù),還可以計(jì)算出目標(biāo)的三維位姿
(一)根本思想
-
形變有基于目標(biāo)局部的形變 local deformable matching(局部變形匹配)和由于透視關(guān)系而產(chǎn)生的形變(透視形變匹配)
(二)原理
(三)使用條件
-
對(duì)于很多干擾因素不敏感,如光照變化、混亂無(wú)序、縮放變化等。其適用于多通道圖像,對(duì)于紋理復(fù)雜的圖像匹配則不太適用
(四)局部變形匹配算子
/*
1.創(chuàng)建模板:create_local_deformable_model()
2.尋找模板:find_local_deformable_model()
3.釋放模板:clear_deformable_model()
*/
(五)實(shí)例(基于局部形變的匹配)
dev_close_window ()
*讀取參考圖像,這里讀取的是單通道灰度圖像
*這里的參考圖像是已經(jīng)剪裁好的感興趣區(qū)域圖像,可以直接作為模板圖像
read_image (ModelImage, 'data/creamlabel')
*設(shè)置顯示窗口參數(shù)
dev_open_window_fit_image (ModelImage, 0, 0, -1, -1, WindowHandle)
*創(chuàng)建局部形變模板,返回局部形變模板句柄ModelID
create_local_deformable_model (ModelImage, 'auto', rad(-15), rad(30), 'auto', 1, 1, 'auto', 1, 1, 'auto', 'none', 'use_polarity', [40,60], 'auto', [], [], ModelID)
*獲取局部形變模板的輪廓
get_deformable_model_contours (ModelContours, ModelID, 1)
*為了將模板輪廓可視化顯示,需要將輪廓與圖像實(shí)物對(duì)應(yīng)起來
*因此出于可視化顯示的目的,先獲取模板圖像的幾何中心
area_center (ModelImage, Area, Row, Column)
*進(jìn)行仿射變換
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, Row, Column, HomMat2DTranslate)
affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2DTranslate)
*設(shè)置輪廓顯示的線條參數(shù),顯示模板圖像與輪廓
dev_set_line_width (2)
dev_display (ModelImage)
dev_display (ContoursAffinTrans)
stop ()
*讀取測(cè)試圖像,這里的圖像中更包含模板圖像,并且有一定的形變
read_image (DeformedImage, 'data/cream')
*顯示用于測(cè)試的局部形變圖像
dev_resize_window_fit_image (DeformedImage, 0, 0, -1, -1)
dev_display (DeformedImage)
*進(jìn)行局部形變模板匹配
find_local_deformable_model (DeformedImage, ImageRectified, VectorField, DeformedContours, ModelID, rad(-14), rad(28), 0.9, 1, 0.9, 1, 0.78, 0, 0, 0, 0.7, ['image_rectified','vector_field','deformed_contours'], ['deformation_smoothness','expand_border','subpixel'], [18,0,0], Score, Row, Column)
*顯示形變輪廓
dev_display (DeformedImage)
dev_set_line_width (2)
dev_set_color ('red')
dev_display (DeformedContours)
stop()
*匹配結(jié)束,釋放模板資源
clear_deformable_model (ModelID)
四、基于描述符的模板匹配
(一)根本思想
與基于透視形變的模板匹配類似,基于描述符的模板匹配能夠在物體處于透視形變的狀態(tài)下進(jìn)行匹配,并且已標(biāo)定和未標(biāo)定的相機(jī)圖像都適用
與透視形變不同的是,它的模板不是根據(jù)邊緣輪廓?jiǎng)?chuàng)建的,而是根據(jù)特征點(diǎn)創(chuàng)建的
(二)原理
-
點(diǎn)的位置或相鄰像素的灰度信息等都可以作為描述符
(三)使用條件
有紋理的平面圖形非常適用于這種方法,尤其是對(duì)于旋轉(zhuǎn)傾斜等場(chǎng)景中的匹配可以得到非常理想的結(jié)果
基于描述符的模板匹配只能用于有紋理的圖像
(四)描述符匹配算子
?/*
?1.創(chuàng)建模板:create_calib_descriptor_model()
?2.尋找模板:find_calib_descriptor_model()
?3.釋放模板:clear_descriptor_model()
?*/
(五)實(shí)例
?dev_close_window ()
?*讀取參考圖像,這里的參考圖像應(yīng)只包含識(shí)別的關(guān)鍵區(qū)域,用于創(chuàng)建模板
?read_image (ImageLabel, 'D:/MVTec/HALCON-21.11-Progress/examples/images/brochure/brochure_01.jpg')
?*設(shè)置窗口參數(shù)用于顯示圖像
?get_image_size (ImageLabel, Width, Height)
?dev_open_window (0, 0, Width, Height, 'black', WindowHandle1)
?dev_set_draw ('margin')
?dev_display (ImageLabel)
?*設(shè)置用于存儲(chǔ)特征點(diǎn)和感興趣區(qū)域的變量
?NumPoints := []
?RowRoi := [10,10,Height - 10,Height - 10]
?ColRoi := [10,Width - 10,Width - 10,10]
?*將參考圖像中的除邊緣外的區(qū)域都設(shè)為感興趣區(qū)域。因?yàn)閰⒖紙D像已經(jīng)近似于匹配的紋理樣本
?gen_rectangle1 (Rectangle, 10, 10, Height - 10, Width - 10)
?*顯示參考圖像上選擇的ROI區(qū)域
?dev_set_line_width (4)
?dev_display (Rectangle)
?stop ()
?*將感興趣區(qū)域剪裁為模板圖像
?reduce_domain (ImageLabel, Rectangle, ImageReduced)
?dev_clear_window ()
?dev_display (ImageLabel)
?*創(chuàng)建基于描述符的模板
?create_uncalib_descriptor_model (ImageReduced, 'harris_binomial', [], [], ['min_rot','max_rot','min_scale','max_scale'], [-90,90,0.2,1.1], 42, ModelID)
?*設(shè)置模型的原點(diǎn),為了后面獲取坐標(biāo)作參照
?set_descriptor_model_origin (ModelID, -Height / 2, -Width / 2)
?*獲取模型中特征點(diǎn)的位置
?get_descriptor_model_points (ModelID, 'model', 'all', Row_D, Col_D)
?*將模型中計(jì)算出的特征點(diǎn)存入NumPoints變量中
?NumPoints := [NumPoints,|Row_D|]
??
?*讀取測(cè)試圖像,這里讀取的是單通道灰度圖像,因此省略了通道轉(zhuǎn)化的步驟
?read_image (ImageGray, 'D:/MVTec/HALCON-21.11-Progress/examples/images/brochure/brochure_05.jpg')
?dev_resize_window_fit_image (ImageGray, 0, 0, -1, -1)
?dev_display (ImageGray)
?*對(duì)描述符特征點(diǎn)進(jìn)行匹配
?find_uncalib_descriptor_model (ImageGray, ModelID, 'threshold', 800, ['min_score_descr','guided_matching'], [0.003,'on'], 0.25, 1, 'num_points', HomMat2D, Score)
?*顯示匹配結(jié)果,將特征點(diǎn)用不同的顏色繪制出來
?if ((|HomMat2D| > 0) and (Score > NumPoints[0] / 4))
? ? ?get_descriptor_model_points (ModelID, 'search', 0, Row, Col)
? ?*創(chuàng)建十字標(biāo)識(shí)符
? ? ?gen_cross_contour_xld (Cross, Row, Col, 6, 0.785398)
? ? ?projective_trans_region (Rectangle, TransRegion, HomMat2D, 'bilinear')
? ? ?projective_trans_pixel (HomMat2D, RowRoi, ColRoi, RowTrans, ColTrans)
? ? ?angle_ll (RowTrans[2], ColTrans[2], RowTrans[1], ColTrans[1], RowTrans[1], ColTrans[1], RowTrans[0], ColTrans[0], Angle)
? ? ?Angle := deg(Angle)
? ? ?if (Angle > 70 and Angle < 110)
? ? ? ? ?area_center (TransRegion, Area, Row, Column)
? ? ? ? ?dev_set_color ('green')
? ? ? ? ?dev_set_line_width (4)
? ? ? ? ?dev_display (TransRegion)
? ? ? ? ?dev_set_colored (6)
? ? ? ? ?dev_display (Cross) ? ? ? ? ? ? ? ?
? ? endif
?endif
?stop ()
?*匹配結(jié)束,釋放模板資源
?clear_descriptor_model (ModelID)
五、優(yōu)化匹配速度
-
可從兩個(gè)方面下手:縮小搜索空間和使用圖像不采樣文章來源:http://www.zghlxwxcb.cn/news/detail-477659.html
六、使用halcon匹配助手進(jìn)行匹配
- 選擇匹配方法
- 創(chuàng)建模板
- 檢測(cè)模板
- 優(yōu)化匹配速度
文章來源地址http://www.zghlxwxcb.cn/news/detail-477659.html
到了這里,關(guān)于模板匹配相關(guān)概念與幾種不常用的模板匹配(學(xué)都學(xué)了,了解一下)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!