随便选择一张图片
对这张图片进行旋转矫正之后,图片就变成了一个模板图片。它的区域region位置如图所示:
当来了一张新的图片的时候,让它与region比较,与模板的位置有明显的偏差, 如图所示:
我们的目标就是让这张新的图片经过处理后与模板区域重合。如下图所示:
其实总体功能和旋转抠图差不多,只是使用的函数有一点差异。
代码总合:
代码所用的图片在:C:\Users\HJ\AppData\Roaming\MVTec\HALCON-21.05-Progress\examples\images\blister(根据自己安装halcon的位置来寻找)
*读取一张图进行处理,并以处理后的图为模板,让后续的图片都办成这张图的模样
read_image (Image, 'C:/Users/HJ/Desktop/test_image/blister/blister_01.png')
threshold(Image, Region, 100, 255)
connection(Region, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 15000, 9999999)
shape_trans(SelectedRegions, RegionTrans, 'convex')
*计算region的方向(角度),Phi是区域最远处点和x轴的夹角
orientation_region(RegionTrans, Phi)
*获取区域的中心
area_center(RegionTrans, Area, Row, Column)
if ((1.57<Phi and Phi<3.142) or (-3.142<Phi and Phi<-1.57))
vector_angle_to_rigid(Row, Column, Phi, Row, Column, 3.14159, HomMat2D)
else
vector_angle_to_rigid(Row, Column, Phi, Row, Column, 0, HomMat2D)
endif
*旋转图片和区域
affine_trans_image(Image, ImageAffineTrans, HomMat2D, 'constant', 'false')
affine_trans_region(RegionTrans, RegionTrans, HomMat2D, 'nearest_neighbor')
*计算旋转之后的区域的中心, 也就是模板区域的中心
area_center (RegionTrans, AreaRef, RowRef, ColumnRef)
list_files ('C:/Users/HJ/Desktop/test_image/blister', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
Width := 550
Height := 400
for Index := 0 to |ImageFiles| - 1 by 1
*数据前处理
read_image (Image2, ImageFiles[Index])
threshold(Image2, Region_Each, 100, 255)
connection(Region_Each, ConnectedRegions_Each)
select_shape(ConnectedRegions_Each, SelectedRegions_Each, 'area', 'and', 15000, 9999999)
shape_trans(SelectedRegions_Each, RegionTrans_Each, 'convex')
\*计算当前区域的方向(角度)
orientation\_region(RegionTrans\_Each, Phi\_Each)
\*获取当前区域的中心
area\_center(RegionTrans\_Each, Area\_Each, Row\_Each, Column\_Each)
if ((1.57<Phi\_Each and Phi\_Each<3.142) or (-3.142<Phi\_Each and Phi\_Each<-1.57))
\*利用当前区域的中心、角度 和 模板区域的中心和角度来进行计算, 生成一个仿射变换的矩阵
vector\_angle\_to\_rigid(Row\_Each, Column\_Each, Phi\_Each, RowRef, ColumnRef, 3.14159, HomMat2D1)
else
vector\_angle\_to\_rigid(Row\_Each, Column\_Each, Phi\_Each, RowRef, ColumnRef, 0, HomMat2D1)
endif
\*根据仿射变换矩阵来对图片进行调整,变成和模板图片一样的
affine\_trans\_image(Image2, ImageAffineTrans\_Each, HomMat2D1, 'constant', 'false')
endfor
手机扫一扫
移动阅读更方便
你可能感兴趣的文章