ROI 感兴趣区域
实现步骤:
-
选择关注区域:在输入的原始图像上,通过图像预处理得到图像特定区域,常规处理:矩形 圆形,椭圆等,此时图像还不是ROI ,只能叫做形状,或者图像范围
-
裁剪区域 :如果需要将关注区域变为独立图像,需要用到 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