Halcon中的ROI_仿射变换

ROI 感兴趣区域

实现步骤:

  1. 选择关注区域:在输入的原始图像上,通过图像预处理得到图像特定区域,常规处理:矩形 圆形,椭圆等,此时图像还不是ROI ,只能叫做形状,或者图像范围

  2. 裁剪区域 :如果需要将关注区域变为独立图像,需要用到 reduce_domain,将关注区域从原图上裁剪为一个独立图像

实现方式:

利用工具创建

手动创建

​
​
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
​
read_image (Image, 'printer_chip/printer_chip_01')
​
​
​
* 1. 利用工具创建区域
*gen_circle (ROI_0, 160.047, 691.688, 128.546)
​
​
*2.手动创建区域
​
*圆形
*draw_circle (WindowHandle, Row, Column, Radius)
*gen_circle (Circle, Row, Column, Radius)
​
​
​
​
* 椭圆
*gen_ellipse (ROI_0, 813.953, 466.688, rad(-1.4321), 281.338, 42.8571)
​
​
*draw_ellipse (WindowHandle, Row1, Column1, Phi, Radius1, Radius2)
​
*gen_ellipse (Ellipse, Row1, Column1, Phi, Radius1, Radius2)
​
​
* 不规则图形
​
draw_polygon (PolygonRegion, WindowHandle)
​
* 画线
draw_line (WindowHandle, Row1, Column1, Row2, Column2)
​
*画矩形
draw_rectangle1 (WindowHandle, Row11, Column11, Row21, Column21)

交集

* 交集
intersection (Circle1, Circle2, RegionIntersection)

补集 差集

*差集 补集
difference (Circle1, Circle2, RegionDifference)

反选

* 反选
complement (Circle1, RegionComplement)

获取两个区域 合并后的区域 与两个区域交集 的补集

symm_difference (Circle1, Circle2, RegionDifference)

合并区域

*合并区域
union1 (ConnectedRegions, RegionUnion)
*合并两个区域
union2 (Circle1, Circle2, RegionUnion1)

截图保存

​
​
read_image (Clip, 'clip')
​
*缩放
zoom_image_factor (Clip, ImageZoomed, 0.5, 0.5, 'constant')
get_image_size (ImageZoomed, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (ImageZoomed)
​
​
​
​
​
*带有旋转角度的矩形
gen_rectangle2 (ROI_0, 80.9348, 215.78, rad(-38.8627), 57.489, 23.0014)
​
dev_display(ROI_0)
​
*从原图中分离出感性其的区域
reduce_domain (ImageZoomed, ROI_0, ImageReduced)
​
dev_clear_window ()
dev_display (ImageReduced)
​
* crop_domain能够对图像的尺寸进行剪裁
crop_domain (ImageReduced, ImagePart)
dev_clear_window ()
dev_display (ImagePart)
​
​
​
​
​
*保存窗体
dump_window (WindowHandle, 'bmp', './wuyifan')
​
​
*保存文件
write_image (ImagePart, 'png', 1, './fanfan')

图像仿射变换

图像的变换与校正是指用数学建模方法来描述图像位置、大小、形状等已知条件,利用这些条件进行确定模型参数,根据模型纠正

仿射变换在图形中的变换包括:平移、缩放、旋转、斜切(将斜体字导正)

产生仿射变换矩阵

hom_mat2d_identity(:::HomMat2DIdentity)

在初始化矩阵的基础上,使用各种变换形式(平移、缩放、旋转)生成仿射变换矩阵

 // 把旋转角度添加到仿射变换矩阵
 hom_mat2d_rotate(HomMat2D, // 输入仿射变换矩阵(等于给了一个原始矩阵位置)
                  Phi, // 输入旋转角度(弧度制)
                  Px,Py, // 变换的参考点(围绕该点进行旋转)
                  HomMat2DRotate) // 输出旋转变换矩阵
 ​
 // 把缩放添加到仿射变换矩阵
 hom_mat2d_scale(HomMat2D,
                 Sx,Sy, // x,y轴缩放比例
                 Px,Py, // 变换的参考点(围绕该点进行缩放)
                 HomMat2DScale) // 输出缩放变换矩阵
     
 // 把平移添加到仿射变换矩阵
 hom_mat2d_translate(HomMat2D,
                     Tx,Ty, // 沿x轴、y轴方向平移的距离
                     HomMat2DTranslate) // 输出平移矩阵
 ​
 // 把斜切添加到仿射变换矩阵
 hom_mat2d_slant(HomMat2D,
                 Theta, // 输入斜切角度(弧度制)
                 Axis, // 输入斜切的坐标轴。取值列表:x,y
                 Px,Py,
                 HomMat2DSlant) // 输出斜切变换矩阵
计算已知点运动后的仿射矩阵

 // 根据两个以上点对计算刚性仿射变换矩阵,支持旋转和平移
 ​
 // 求平移或旋转矩阵
 vector_angle_to_rigid(Px,Py, // 区域变换之前中心点的坐标
                       Phi, // 夹角(极轴水平向右的夹角始边 逆时针为正 顺时针为负)
                       Qx,Qy, // 区域变换之后的坐标
                       Phi1, // 变换之后的角度
                       HomMat2D) // 输出仿射变换矩阵
 ​
 vector_to_rigid(Px,Py, // 输入原始点组的x、y坐标
                 Qx,Qy, // 输入变换后点组的x、y坐标
                 HomMat2D) // 输出仿射变换矩阵
 ​
 // 根据两个以上点对计算相似仿射变换矩阵,支持旋转、平移和缩放
 vector_to_similarity(::Px,Py,Qx,Qy:HomMat2D)
    
 // 根据三个以上点对计算仿射变换矩阵,支持旋转、平移、缩放、斜切
 vector_to_hom_mat2d(::Px,Py,Qx,Qy:HomMat2D)

根据生成的变换矩阵执行仿射变换,对图像、区域、轮廓进行仿射变换

// 对XLD轮廓进行二维仿射变换,支持缩放,旋转,平移,斜切
 affine_trans_contour_xld(Contours, // 输入XLD轮廓
                          ContoursAffinTrans, // 输出变换的XLD轮廓
                          HomMat2D) // 输入仿射变换矩阵
 ​
 // 对图像轮廓进行二维仿射变换,支持缩放、旋转、平移,斜切
 affine_trans_image(Image, // 输入图像
                    ImageAffinTrans, // 输出变换后的图像
                    HomMat2D,
                    Interpolation, // 插值算法。参数值列表: nearest_neighbor,bilinear,constant,weighted
                    AdaptImageSize) // 结果图像尺寸是否自适应。默认值:false
 ​
 // 对区域进行任意二维仿射变换
 affine_trans_region(Region, // 输入区域
                     RegionAffineTrans, // 输出变换后的区域
                     HomMat2D, // 得到的矩阵变量
                     Interpolate) // 插值算法。默认值:nearest_neighbor。参数值列表:constant,nearest_neighbor
 ​
 // 对XLD多边形进行任意二维仿射变换
 affine_trans_polygon_xld(Polygon, // 输入XLD多边形
                          PolygonsAffinTrans, // 输出变换后的XLD多边形
                          HomMat2D)
 ​
 // 对点进行任意二维仿射变换,支持缩放、旋转、平移、斜切
 affine_trans_point_2d(HomMat2D,
                       Px,Py, // 原始点x或行坐标
                       Qx,Qy) // 变换点x或行坐标
 ​
 // 对像素进行任意二维仿射变换
 affine_trans_pixel(HomMat2D,
                    Row,Col, // 输入像素坐标
                    RowTrans,ColTrans) // 输出的变换像素坐标

计算仿射变换参数

// 根据仿射变换矩阵(齐次二维变换矩阵)计算仿射变换参数
 hom_mat2d_to_affine_par(HomMat2D,
                         Sx,Sy, // x、y方向的缩放因子(如果从图像空间变换到物理空间,就是x、y方向的 像素单量)
                         Phi, // 旋转角度
                         Theta, // 斜切角度
                         Tx,Ty) // 沿x、y方向平移的距离
read_image (Image, 'F:/AI视觉35班/05_Halcon/05_ROI_仿射变换/4-2.png')

get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)

dev_display (Image)

*hom_mat2d_identity (HomMat2DIdentity)
*hom_mat2d_rotate (HomMat2DIdentity, 0.78, 0, 0, HomMat2DRotate)
*affine_trans_image (Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')


***********************1.找到图像中的三角形区域****************
threshold (Image, Region, 128, 255)

connection (Region, ConnectedRegions)



***************** ***** 2.找到基准点,也就是三角形的中心点*******
*获取当前选择的区域的中心点[作为仿射变换的基准点]
area_center (Region, Area, Row, Column)


****************** 3. 对图像进行放射变换 ******************

*生成仿射变换矩阵(等于给了一个原始矩阵位置)

hom_mat2d_identity (HomMat2DIdentity) 
* 如果设置多次变化  是覆盖  不是累加
* 比如 200  100     100 50   覆盖   100 50      累加 300 150 

hom_mat2d_translate (HomMat2DIdentity, 200, 100, HomMat2DTranslate)
affine_trans_image (Image, ImageAffineTrans1, HomMat2DTranslate, 'constant', 'false')

* 在上一次变化的基础上 再次进行变化
hom_mat2d_rotate (HomMat2DTranslate, 0.78, 200, 100, HomMat2DRotate)

affine_trans_image (Image, ImageAffineTrans2, HomMat2DRotate, 'constant', 'false')

dev_clear_window ()
dev_display (ImageAffineTrans2)

二维码纠正

* 仿射变化,解决透视问题

read_image (Image, './img/toushi.png')
* 创建描述物料代表性的坐标,图像4个角的坐标

Row:=[159,277,357,77]
Col:=[127,120,360,333]

核心算子
 

* 求投影变换矩阵 【透视矩阵】
* hom_vector_to_proj_hom_mat2d(PX,PY,PW,QX,QY.QW,Method,输出矩阵) 
* 参数列表: 1:PX 标售投影想的至少4个点的Row坐标
*           2:PY  标售投影想的至少4个点的Colum坐标
*           3:PW  值 [] 元组,元组元素为 0  1 
*           4:QX 输出正方形的Row坐标
*           5:QY 输出正方形的Colun 坐标
*           6:QW  值 [] 元组,元组元素为 0  1 
*           7:Method 算法方式
*           8:输出投影举证
* 作用:依据图像坐标与输出输出的矩形坐标,生成投影矩阵
* 注意:1: PX PY 去输入的透视图像上查找。至少4个;越多越精准  【ctrl+移动鼠标】
*      2:  PX PY 查找点时候,按照一定循序,例如 顺/逆时针 方向
*      3: QX QY 随便自己录入的任意点坐标,但是4个点必须是正方向。
*      4: QX QY 定义点的顺序,与 px py 一致
*      5: PW 原始点权重,QW 目标点权重  点找的不准确用0 准确用1以上数字【具体是什么自己调试】
hom_vector_to_proj_hom_mat2d (Row, Col, [1,1,1,1], [75,360,360,75], [110,110,360,360], [1,1,1,1], 'normalized_dlt', HomMat2D)
* 依据投影变换矩阵,将输入的具有透视问题的图像进行校正。

* projective_trans_image(输入图像,输出校正图像,输入投影矩阵,插值类型,输入图像是否调整大小,输入图像域是否转化)
* 作用:依据投影矩阵,将输入的透视图像进行仿射变换。得到正常的图像。
projective_trans_image (Image, TransImage, HomMat2D, 'bilinear', 'false', 'false')
dev_display (TransImage)
****************图像的投影的变换************
*  仿射变换几何可以较真物体所有可能发生与为姿相关的变化,但是不能应对所有情况
*  投影变换包括的情况有:如:边不再平行。透视畸变等
*  这时候我们可以使用投影变换hom_vector_to_proj_hom_mat2d ,将其恢复原状
*  步骤与仿射变换一样,
*     1:先计算投影变换矩阵,再计算投影变换参数
*     2: 最后将投影变换矩阵映射到对应的对象上【图像上】

案例

dev_get_window (WindowHandle)
read_image (Image, './img/affine.jpg')
threshold (Image, Region, 0, 200)
opening_circle (Region, Region, 1.5)
connection (Region, ConnectedRegions)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
*得到变换的中心点
area_center (SelectedRegions, Area, Row, Column)
dev_set_draw ('margin')

*hom_mat2d_translate中的两个参数的意思是:Tx和Ty分别代表Row方向和Column方向的平移量
dev_display (Image)
disp_cross (WindowHandle, Row, Column, 10, 40)
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity,30, 150, HomMat2DTranslate)
affine_trans_region (Region, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')

*hom_mat2d_rotate中的三个参数的意思是:旋转角度(逆时针为正,弧度制),旋转中心的row和column值
dev_display (Image)
disp_cross (WindowHandle, Row, Column, 10, 40)
hom_mat2d_rotate (HomMat2DIdentity, rad(60), Row, Column, HomMat2DRotate)
affine_trans_region (Region, RegionAffineTrans1, HomMat2DRotate, 'nearest_neighbor')

*hom_mat2d_scale中的四个参数的意思是:Sx和Sy分别代表Row方向和Column方向的缩放系数,缩放中心的row和column值
dev_display (Image)
disp_cross (WindowHandle, Row, Column, 10, 40)
hom_mat2d_scale (HomMat2DIdentity, 2.0, 2.0, Row, Column, HomMat2DScale)
affine_trans_region (Region, RegionAffineTrans3, HomMat2DScale, 'nearest_neighbor')

* 有时候,并不需要创建初始化矩阵也可以执行仿射变换,例如vector_angle_to_rigid算子就是如此。
* vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)
Row := 100
Column := 200
dev_display (Image)
for Index := 1 to 150 by 1  
    vector_angle_to_rigid (Row, Column, 0, Row, Column, rad(10), HomMat2D)
    disp_cross (WindowHandle, 100, 200, 10, 40)
    affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'nearest_neighbor', 'false')
    copy_image (ImageAffinTrans, Image) 
endfor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值