文章目录
图像的变换与校正
由于相机拍摄的时候可能存在角度偏差,因此实际获得的画面可能会与想象中有所差异。例如:采集连续目标时,可能每幅图中目标区域的位置和角度都不一样;又或者目标对象是一块矩形区域,而在采集到的图像中,这一块可能变成了梯形或扭曲的四边形。
因此,接下来要做的第一件事,就是把这块区域进行一些调整,使之恢复成原本的矩形区域。
首先需要理解:二维图像的平移、旋转和缩放,这里就不在赘述了,可以查看博主的另一篇文章 智能探针台-相关算法描述-仿射变换及其变换矩阵的理解。
把平移、旋转和缩放结合起来,可以才Halcon中使用仿射变换的相关算子。一个放射变化的矩阵包括平移向量和旋转向量。
仿射变换矩阵使用步骤:
使用hom_mat2d_identity (HomMat2DIdentity)创建一个空的仿射变换矩阵。
指定变换的参数,这里可以指定平移、缩放、旋转参数,例如:
设置平移矩阵,像x轴正方向平移30个像素,像y轴正方向平移30个像素:hom_mat2d_translate (HomMat2DIdentity, 30 30, HomMat2DTranslate)
设置旋转矩阵,以点(Px,Py)为参考点,旋转角度phi:hom_mat2d_rotate (HomMat2DIdentity, rad(Phi), Px, Py, HomMat2DRotate)
设置缩放矩阵,以点(Px,Py)为参考点,放大2倍:hom_mat2d_scale (HomMat2DIdentity, 2, 2, Px,Py, HomMat2DScale)
* 创建一个空的仿射变换矩阵
hom_mat2d_identity (HomMat2DIdentity)
* 设置平移矩阵
hom_mat2d_translate (HomMat2DIdentity, 64, 64, HomMat2DTranslate)
* 设置旋转矩阵
hom_mat2d_rotate (HomMat2DTranslate, 0.78, 0, 0, HomMat2DRotate)
* 设置缩放矩阵
hom_mat2d_scale (HomMat2DRotate, 2, 2, 0, 0, HomMat2DScale)
应用放射变换矩阵:
应用于像素点:使用affine_trans_pixel算子。
应用于二维点:使用affine_trans_point_2d算子。
应用于图像:使用affine_trans_image算子。
应用于区域:使用affine_trans_region算子。
应用于XLD轮廓:使用affine_trans_contour_xld算子。
* 应用于像素点
affine_trans_pixel (HomMat2DScale, 64, 64, RowTrans, ColTrans)
* 应用于二维点
affine_trans_point_2d (HomMat2DScale, RowTrans, ColTrans, Qx, Qy)
* 应用于图像
affine_trans_image (Image, ImageAffineTrans, HomMat2DScale, 'constant', 'false')
* 应用于区域
affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')
* 应用于XLD轮廓
affine_trans_contour_xld (, ContoursAffineTrans, HomMat2DScale)
仿射变换其实是投影变换的一个特殊例子,其特殊性在于变换后图像的形状仍然维持原状。投影变换包括的情况很多,有可能变换前后图像的形状发生了很大的改变,如对边不再平行,或者发生了透视畸变等,这时可以使用投影变换使其恢复原状。其步骤与仿射变换类似,首先计算投影变换矩阵,然后计算投影变换参数,最后将投影变换矩阵映射到对象上。
要计算投影变换矩阵,应找出投影变换区域的特征点的位置及其投影后的位置,通过hom_vector_to_proj_hom_mat2d算子进行换算,就可以根据已知的投影对应的点的值计算投影变换矩阵。然后用projective_trans_image对图像进行投影变换,就能得到投影后的图像了。
实例:透视性变图像校正
*关闭当前显示窗口,清空屏幕
dev_close_window ()
*读取测试图像
read_image (Image_