Halcon:二维仿射变换实例探究
二維仿射變換,顧名思義就是在二維平面內(nèi),對(duì)對(duì)象進(jìn)行平移、旋轉(zhuǎn)、縮放等變換的行為(當(dāng)然還有其他的變換,這里僅論述這三種最常見的)。
?
Halcon中進(jìn)行仿射變換的常見步驟如下:
① 通過hom_mat2d_identity算子創(chuàng)建一個(gè)初始化矩陣(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0]);
② 在初始化矩陣的基礎(chǔ)上,使用hom_mat2d_translate(平移)、hom_mat2d_rotate(旋轉(zhuǎn))、hom_mat2d_scale(縮放)等生成仿射變換矩陣;(這幾個(gè)算子可以疊加或者重復(fù)使用)
③ 根據(jù)生成的變換矩陣執(zhí)行仿射變換,執(zhí)行仿射變換的算子通常有:affine_trans_image、affine_trans_region、affine_trans_contour_xld,即不管對(duì)于圖像、區(qū)域、XLD都可以執(zhí)行仿射變換。
?
下面用一個(gè)完整程序分別展示hom_mat2d_translate(平移)、hom_mat2d_rotate(旋轉(zhuǎn))、hom_mat2d_scale(縮放)這三個(gè)算子的的具體功能。(特別要注意程序注釋部分)
hom_mat2d_translate( : : HomMat2D, Tx, Ty : HomMat2DTranslate)
hom_mat2d_rotate( : : HomMat2D, Phi, Px, Py : HomMat2DRotate)
hom_mat2d_scale( : : HomMat2D, Sx, Sy, Px, Py : HomMat2DScale)
?
程序所用圖片如下:
1 read_image (Image, 'hogn-1.jpg')2 threshold (Image, Region, 0, 200)3 opening_circle (Region, Region, 1.5)4 connection (Region, ConnectedRegions)5 select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)6 *得到變換的中心點(diǎn)7 area_center (SelectedRegions, Area, Row, Column)8 dev_set_draw ('margin')9 10 *hom_mat2d_translate中的兩個(gè)參數(shù)的意思是:Tx和Ty分別代表Row方向和Column方向的平移量 11 dev_display (Image) 12 disp_cross (3600, Row, Column, 10, 40) 13 hom_mat2d_identity (HomMat2DIdentity) 14 hom_mat2d_translate (HomMat2DIdentity,30, 150, HomMat2DTranslate) 15 affine_trans_region (Region, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor') 16 17 *hom_mat2d_rotate中的三個(gè)參數(shù)的意思是:旋轉(zhuǎn)角度(逆時(shí)針為正,弧度制),旋轉(zhuǎn)中心的row和column值 18 dev_display (Image) 19 disp_cross (3600, Row, Column, 10, 40) 20 hom_mat2d_rotate (HomMat2DIdentity, rad(20), Row, Column, HomMat2DRotate) 21 affine_trans_region (Region, RegionAffineTrans, HomMat2DRotate, 'nearest_neighbor') 22 23 *hom_mat2d_scale中的四個(gè)參數(shù)的意思是:Sx和Sy分別代表Row方向和Column方向的縮放系數(shù),縮放中心的row和column值 24 dev_display (Image) 25 disp_cross (3600, Row, Column, 10, 40) 26 hom_mat2d_scale (HomMat2DIdentity, 2.0, 1.05, Row, Column, HomMat2DScale) 27 affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')效果分別如下:
?
?
有時(shí)候,并不需要?jiǎng)?chuàng)建初始化矩陣也可以執(zhí)行仿射變換,例如vector_angle_to_rigid算子就是如此。
vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)
?
該算子意思是:先將圖像旋轉(zhuǎn),旋轉(zhuǎn)角度為(Angle2 - Angle1) (逆時(shí)針為正),旋轉(zhuǎn)中心坐標(biāo)是(Row1, Column1)。再將原圖的點(diǎn)(Row1, Column1)一一對(duì)應(yīng)移到點(diǎn) (Row2, Column2)上,移動(dòng)的row和column方向的位移分別是( Row2 - Row1)、( Column2 - Column1),
?
如果Row1 = Row2,?Column1 = Column2,那么就完整等價(jià)于旋轉(zhuǎn)變換。可以執(zhí)行下面的程序感受一下:
1 read_image (Image, 'hogn-1.jpg')2 Row := 1003 Column := 2004 dev_display (Image)5 6 7 for Index := 1 to 150 by 1 8 vector_angle_to_rigid (Row, Column, 0, Row, Column, rad(10), HomMat2D) 9 disp_cross (3600, 100, 200, 10, 40) 10 affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'nearest_neighbor', 'false') 11 copy_image (ImageAffinTrans, Image) 12 endfor?
可以將vector_angle_to_rigid理解為同時(shí)執(zhí)行旋轉(zhuǎn)變換和平移變換。最難弄明白的是旋轉(zhuǎn)中心是什么?下面的程序可以說明如果先旋轉(zhuǎn)后平移,那么旋轉(zhuǎn)中心是(Row1, Column1),而不是 (Row2, Column2)。(如果先平移后旋轉(zhuǎn),那么結(jié)論剛好相反,大家可以試試)
1 read_image (Image, 'hogn-1.jpg')2 Row1 := 1003 Column1 := 1004 5 Row2 := 1006 Column2 := 2007 dev_display (Image)8 *用vector_angle_to_rigid實(shí)現(xiàn)縮放、平移9 vector_angle_to_rigid (Row1, Column1, 0, Row2, Column2, rad(10), HomMat2D) 10 affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'nearest_neighbor', 'false') 11 12 *分兩步依次執(zhí)行縮放、平移 13 hom_mat2d_identity (HomMat2DIdentity) 14 hom_mat2d_rotate (HomMat2DIdentity, rad(10) - 0, Row1, Column1, HomMat2DRotate) 15 hom_mat2d_translate (HomMat2DRotate,Row2 - Row1, Column2 - Column1, HomMat2DTranslate) 16 *觀察圖像ImageAffinTrans和ImageAffinTrans_2能夠完全重合 17 affine_trans_image (Image, ImageAffinTrans_2, HomMat2DTranslate, 'nearest_neighbor', 'false') 18 19 disp_cross (3600, Row1, Column1, 10, 40)?
vector_angle_to_rigid最常用到的場(chǎng)合一般是模板匹配之類的算法場(chǎng)合,通常用在find_shape_model等算子后面。
?
下面用一個(gè)例子說明一下仿射變換的綜合應(yīng)用,即當(dāng)圖片旋轉(zhuǎn)90°時(shí),想辦法變換Region使之能夠翻轉(zhuǎn)到對(duì)應(yīng)的位置。
將圖片順時(shí)針翻轉(zhuǎn)90°的方法可以是:rotate_image (image, ImageRotate, -90, 'constant')。
但其實(shí)它不僅經(jīng)過了旋轉(zhuǎn)變換、還進(jìn)行了平移變換,最明顯的證據(jù)就是:翻轉(zhuǎn)前后的圖像,他們的中心點(diǎn)坐標(biāo)不一樣。完整程序如下:
1 read_image (image, 'C:/Users/happy xia/Desktop/dynPic.png')2 binary_threshold (image, Region, 'max_separability', 'dark', UsedThreshold)3 dev_set_draw ('margin')4 connection (Region, ConnectedRegions)5 select_shape_std (ConnectedRegions, SelectedReg, 'max_area', 70)6 area_center (image, Area, Row, Column) 7 8 rotate_image (image, ImageRotate, -90, 'constant') 9 area_center (ImageRotate, Area2, Row2, Column2) 10 11 hom_mat2d_identity (HomMat2DIdentity) 12 hom_mat2d_rotate (HomMat2DIdentity, -rad(90), Row, Column, HomMat2DRotate) 13 hom_mat2d_translate (HomMat2DRotate,Row2 - Row, Column2 - Column, HomMat2DTranslate) 14 15 affine_trans_region (SelectedReg, RegionAffineTrans, HomMat2DTranslate, 'constant')該算法順利達(dá)到了目的——圖像翻轉(zhuǎn)以后,原先生成的Region也翻轉(zhuǎn)到了對(duì)應(yīng)的位置。
注意:用rotate_image 算子旋轉(zhuǎn)圖像時(shí),如果旋轉(zhuǎn)角度不是0°、90°、180°、270°等角度,那么圖像其實(shí)只做了旋轉(zhuǎn)變換,而沒有進(jìn)行平移變換。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Halcon:二维仿射变换实例探究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抖音矩阵系统,抖音矩阵系统源码,抖音SE
- 下一篇: SQLite For .Net 已经整合