提示:若没有查找的算子,可以评论区留言,会尽快更新
Haclon算子应用和技巧1
前言
提示:可以使用搜索小工具搜索对应算子名称:
本篇博文主要用于记录学习Halcon中算子的应用场景,及其使用代码和图像展示。只讲通俗易懂使用方法,不讲原理,不讲原理,不讲原理,重要的事情说三遍。
提示:以下是本篇文章正文内容,下面案例可供参考,注意参数坐标的使用,能帮助你理解算子
一、Halcon应用?
Halcon 是一个强大的图像处理工具,该工具是为了解决机器视觉项目任务而创建的。
二、算子汇总
每一博文仅展示10个算子,点击此链接进行查询所有算子,并点击对应算子跳转相应博文。'
【跳转链接】
三、应用算子
1. tile_images_offset()
先上代码:
read_image (Image, 'claudia')
crop_rectangle1 (Image, ImageParts, [10, 230], [60, 120], [219, 339], [299, 219])
concat_obj (Image, ImageParts, Images)
tile_images_offset (Images, TiledImage, [0, 290, 390], [0, 340, 210], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], 500, 500)
解析1:
该方法用于拼接图像,将扣出的图像偏移一定的位置拼接得到新的图像。
解析2:
算子亦可用来当相机无法将目标图像拍摄完整时,采用拼图的方式将目标图像完整拼出。参考下图可以看出,在相机拍摄大小一样的情况下,相机固定不动,移动目标图像,从1变成2,计算目标四角星的列移动距离,即是相机相对物体的移动距离,至此将两张图按照偏移量即可将图像拼接,拼接结果如上图中最上方结果所示。
2. crop_part()
先上代码:
read_image(Image, 'printer_chip/printer_chip_01')
dev_close_window()
get_image_size(Image, Width, Height)
dev_open_window(0, 0, Width/3, Height/3, 'black', WindowHandle)
dev_display(Image)
*裁剪
crop_part(Image, ImagePart, 424, 253, 400, 400)
dev_display(ImagePart)
解析:
用于裁剪图像区域
3. hom_mat2d_identity()
先上代码:
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
* draw_rectangle1(WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1(Rectangle, 103, 205, 167, 303)
*创建旋转矩阵
hom_mat2d_identity(HomMat2DIdentity)
*平移
hom_mat2d_translate(HomMat2DIdentity, 30, 30, HomMat2DTranslate)
affine_trans_region(Rectangle, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')
*旋转
hom_mat2d_rotate(HomMat2DIdentity, rad(90), 167, 303, HomMat2DRotate)
affine_trans_region(Rectangle, RegionAffineTrans1, HomMat2DRotate, 'nearest_neighbor')
*缩放
hom_mat2d_scale(HomMat2DIdentity, 2, 2, 167,303, HomMat2DScale)
affine_trans_region(Rectangle, RegionAffineTrans2, HomMat2DScale, 'nearest_neighbor')
解析:
该方法实现 平移、旋转、缩放矩阵构建,围绕旋转(缩放)中心变化,就是一种图像变换的过程。affine_trans_region()针对区域而言,affine_trans_image()针对图像而言,affine_trans_contour_xld()针对XLD轮廓而言。
4. hom_vector_to_proj_hom_mat2d()
先上代码:
*关闭当前显示窗口,清空屏幕
dev_close_window ()
*读取测试图像
read_image (Image_display, 'data/display.jpg')
*将图像转化为灰度图像
rgb1_to_gray (Image_display, GrayImage)
*获取图像的尺寸
get_image_size(Image_display,imageWidth, imageHeight)
*新建显示窗口,适应图像尺寸
dev_open_window (0, 0, imageWidth, imageHeight, 'black', WindowHandle1)
dev_display (GrayImage)
XCoordCorners := [70,74,418,337]
YCoordCorners := [61,540,533,93]
hom_vector_to_proj_hom_mat2d (XCoordCorners, YCoordCorners, [1,1,1,1], [75,75,405,405], [100,540,540,100], [1,1,1,1], 'normalized_dlt', HomMat2D)
*投影变换
projective_trans_image (Image_display, Image_rectified, HomMat2D, 'bilinear', 'false', 'false')
* 显示校正结果
dev_display (Image_rectified)
解析:
该方法将原始坐标点映射到新的坐标点,并计算仿射矩阵。就是一种图像校正的过程。
5. shape_trans()
先上代码:
*区域形态学
read_image(Image, 'D:/HALCON_learn/code/tu_1.jpg')
get_image_size(Image, Width, Height)
dev_close_window()
dev_open_window(0, 0, Width/1.5, Height/1.5, 'black', WindowHandle)
gen_circle(Circle, 200, 200, 100.5)
gen_circle(Circle1, 200, 200, 150.5)
*相减
difference(Circle1, Circle, RegionDifference1)
*区域形状转换
shape_trans(RegionDifference1, RegionTrans, 'inner_rectangle1')
解析
该算子主要是将区域转变为另一种形状的区域。红色圆环区域转变为长方形矩形区域。
6. skeleton()
先上代码:
*区域形态学
read_image(Image, 'D:/HALCON_learn/code/tu_1.jpg')
get_image_size(Image, Width, Height)
dev_close_window()
dev_open_window(0, 0, Width/1.5, Height/1.5, 'black', WindowHandle)
dev_display(Image)
rgb1_to_gray(Image, GrayImage)
threshold(GrayImage, Region, 67, 132)
mean_image(GrayImage, ImageMean, 17, 17)
dyn_threshold(GrayImage, ImageMean, RegionDynThresh, 5, 'light')
connection(RegionDynThresh, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 3000, 99999)
select_shape(ConnectedRegions, SelectedRegions1, 'area', 'and', 3000, 5000)
*得到像素骨架,是一个像素,只有一个像素宽
skeleton(SelectedRegions1, Skeleton)
dev_display(Region1)
解析
该算子一般用于求区域的的骨架。左图为区域,右图箭头指示为骨架,区域部分为了展示我使用margin展示。
7. boundary()
先上代码:
*区域形态学
read_image(Image, 'D:/HALCON_learn/code/tu_1.jpg')
get_image_size(Image, Width, Height)
dev_close_window()
dev_open_window(0, 0, Width/1.5, Height/1.5, 'black', WindowHandle)
dev_display(Image)
rgb1_to_gray(Image, GrayImage)
threshold(GrayImage, Region, 67, 132)
mean_image(GrayImage, ImageMean, 17, 17)
dyn_threshold(GrayImage, ImageMean, RegionDynThresh, 5, 'light')
connection(RegionDynThresh, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 3000, 99999)
select_shape(ConnectedRegions, SelectedRegions1, 'area', 'and', 3000, 5000)
*获取边缘区域 和骨架那个区分
boundary(SelectedRegions1, RegionBorder, 'inner')
解析:
顾名思义,获得区域的边界。图示仅截取部分图展示,详细图参考算子6中的左图左上角。
8. reduce_domain()
先上代码:
*关闭当前显示窗口,清空屏幕
dev_close_window ()
*读取测试图像
read_image (Image_display, 'data/display.jpg')
*获取图像的尺寸
get_image_size(Image_display,imageWidth, imageHeight)
*新建显示窗口,适应图像尺寸
dev_open_window (0, 0, imageWidth, imageHeight, 'black', WindowHandle)
dev_display (Image_display)
gen_rectangle1 (ROI_0, 52, 46, 400, 148)
*裁剪屏幕区域
reduce_domain (Image_display, ROI_0, reducedImage)
dev_open_window (0, 400, imageWidth, imageHeight, 'black', WindowHandle1)
* 显示校正结果
dev_display (reducedImage)
解析
作用:减少计算量,只关注需要的区域;
PS:图中虽然展示结果很像裁剪图像的结果,实际并非如此,该算子作用结束,图像尺寸仍是原尺寸大小,只是其非关注区域不再参与计算,将其像素值(RGB指示区)在halcon中变成 -;注意和裁剪算子区分。
9. 坐标系的轴x y 参数如何定
这里参考两个算子
gen_rectangle1 (ROI_0, 52, 46, 400, 148)
hom_mat2d_rotate(HomMat2DIdentity, rad(90), 167, 303, HomMat2DRotate)
解析
针对不同的区域和图像算子,理解算子参数的需求,何时Colum是X轴,何时Colum是Y轴参数,看下图,
这主要原因在于,一个是二维坐标系,一个是三维坐标系。
10. equ_histo_image()
先上代码:
read_image (board, 'data/boardEqu')
rgb1_to_gray (board, GrayImage)
equ_histo_image (GrayImage, ImageEquHisto)
*生成直方图
gray_histo (board, board, AbsoluteHisto1, RelativeHisto1)
gray_histo (ImageEquHisto, ImageEquHisto, AbsoluteHisto2, RelativeHisto2)
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_set_color ('red')
*显示
gen_region_histo (Histo1, AbsoluteHisto1, 255, 5, 1)
dev_set_color ('green')
gen_region_histo (Histo2, AbsoluteHisto2, 255, 450, 1)
解析:
作用:将灰度值分布打散不集中,让其均匀分布,实现图像增强效果
左图是原图;右图增强后结果
PS:主要用于灰度值比较集中的情况
以上内容陆续更新。。。
内容如有错误之处,望不吝指出,谢谢
以上内容陆续更新。。。