图像矫正:
图像校正主要分为两类:几何校正和灰度校正
其思路是通过一些已知的参考点,即无失真图象的某些象素点和畸变图象相应象素的坐标间对应关系,拟合出映射关系中的未知系数,并作为恢复其它象素的基础。
几何校正的基本方法是:
首先建立几何校正的数学模型;
其次利用已知条件确定模型参数;
最后根据模型对图像进行几何校正。
具体操作通常分两步:
①对图像进行空间坐标变换;首先建立图像像点坐标(行、列号)和物方(或参考图)对应点坐标间的映射关系,解求映射关系中的未知参数,然后根据映射关系对图像各个像素坐标进行校正;
新建Halcon文件:
1、打开Halcon程序选择“文件”新程序
菜单栏中选择窗口,分别打开“图形窗口”,“程序窗口”,“变量窗口”,“算子窗口”。
2、在程序窗口中输入(** 注:输入算子名称双击Tab键自动补全代码)
dev_update_off() //关闭图形窗口更新
dev_close_window() //关闭图形窗口
输入图片路径
输入目标坐标文件(.txt文件) ** 注:可不输入
list_files ('D:/***/***/***_files', ['files','follow_links'], ImageFiles) //自己图片路径
list_files('D:/***/***/***_files', ['files','follow_links'], TxtFiles) //自己Txt文件路径
筛选图片文件
筛选TXT文件 ** 注:可不输入
tuple_regexp_select (ImageFiles, ['\\.(bmp|jpg)$','ignore_case'], ImageFiles)
tuple_regexp_select(TxtFiles, ['\\.(txt)$','ignore_case'], TxtFiles)
遍历图像
for Index := 0 to |ImageFiles| - 1 by 1
********************* //图形窗口处理
********************** // 图像处理程序
endfor
在遍历图像循环函数内,---图形窗口处理
read_image (Image, ImageFiles[Index]) // 读取图像
get_image_size(Image, Width, Height) // 获取图像尺寸
dev_clear_window() // 清理图形窗口
dev_open_window_fit_image(Image, 0, 0, -1, -1, WindowHandle) // 打开一个窗口,适应图像尺寸
dev_display(Image) // 显示图像
rgb1_to_gray(Image, GrayImage) // 彩色图像转灰度图像
invert_image(GrayImage, ImageInvert) // 图像色彩反转
在图形窗口处理下,----遍历TXT文件内部坐标信息 (** 注:可不输入)
* 遍历txt文件
open_file (Files[Index], 'input', FileHandle) // 读取txt文件
tuple_piex := [] // 创建空坐标列表
i := 0
for i := 0 to 3 by 1 // 遍历txt文件内容,获取目标区域坐标
fread_string (FileHandle, OutString1, IsEOF1) // 按行读取txt
tuple_number(OutString1, Number) //string转int
tuple_piex[i] := Number // 输出坐标列表
endfor
画出特征明显区域,方便后面进行角度变换
方法一:
输入gen_rectangle1双击Tab补全代码,在内部直接输入坐标位置
方法二:
在图形窗口选择“绘制新ROI”框选特征区域
框选之后点击鼠标“右键”确定目标区域,之后可以通过拖动鼠标从新调整位置,确定目标区域之后选择“在程序中插入代码”,然后关闭ROI即可
输入reduce_domain双击Tab补全代码,减去除目标区域外的图像
gen_rectangle1 (Rectangle1, 30, 20, 100, 200) // 目标矩形区域
reduce_domain(ImageInvert, ROI_0, ImageReduced) // 矩形区域裁剪
图像处理程序
对目标区域图像进行常规处理
mean_image(ImageReduced, ImageMean, 9, 9) // 图像滤波
dyn_threshold(Image, ImageMean, RegionDynThresh, 185, 'light') // 图像阈值处理
dilation_circle(RegionDynThresh, RegionDilation, 3.5) //图像膨胀
fill_up(RegionDilation, RegionFillUp) // 目标空白区域填充
connection(RegionFillUp, ConnectedRegions) // 区域分割
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 1200, 4500) // 面积筛选目标
union1(SelectedRegions, RegionUnion) // 目标区域连通
shape_trans (RegionUnion, RegionTrans, 'convex') // 目标凸性区域填充
**注:在对图像进行阈值处理面积筛选时可以通过Halcon快捷工具进行动态筛选
**注:在对图像进行面积筛选前,必须进行区域分割
获取目标最小外接矩形,通过角度进行透视变换
smallest_rectangle2(RegionTrans, Row, Column, Phi, Length1, Length2) // 获取目标区域最小外接矩形及角度和边长
gen_rectangle2_contour_xld(Rectangle, Row, Column, Phi, Length1, Length2) // 根据目标最小外接矩形坐标画出外接框
** 图像透视变换
vector_angle_to_rigid(Row, Column, Phi, Row, Column, 0, HomMat2D) // 获取最小矩形区域与水平夹角、计算透视变换矩阵
affine_trans_image(Image, ImageAffineTrans, HomMat2D, 'constant', 'false') // 进行透视变换
dev_display(ImageAffineTrans) //显示旋转后图像
**注:在vector_angle_to_rigid算子中Phi:表示目标需要旋转的弧度,0:表述旋转之后的状态水平