halcon中常用算子整理

halcon中常用算子整理

  • 1.窗口显示
  • 2 基础算子
  • 3 腐蚀膨胀
  • 4 修改图像或区域的值
  • 5 仿射变换
  • 6 求角度
  • 7 求距离
  • 8 分割
  • 9 亚像素轮廓
  • 10 求交点

1.窗口显示

dev_update_window ('off')
dev_update_window ('on')程序执行打开和关闭期间,图像对象是否在图形窗口中显示
dev_clear_window ()
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)后面可以在这个句柄上显示

dev_set_draw ('margin')
dev_set_color ('white')
dev_set_colored (12)
dev_set_line_width (3)
dev_set_part( : : Row1, Column1, Row2, Column2 : )设置图形窗口中要显示的图像部分。 参数Row1和Column1指定左上角,Row2和Column2指定要显示的图像部分的右下角。
get_system ('operating_system', OS)

dev_display (Image)
set_display_font (WindowHandleZoom, 14, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
disp_ellipse (WindowID, Row, Column, Phi, Ra, Rb)
disp_cross (WindowHandle, RowCenterRegion, ColumnCenterRegion, 15, 0)
disp_arrow (WindowHandle, RowCenterRegion, ColumnCenterRegion, RowCenterRegion - 60 *sin(OrientationRegion), ColumnCenterRegion + 60 * cos(OrientationRegion), 2)
write_string(WindowHandle3, '请用鼠标画ROI')窗口写字
get_mbutton( : : WindowHandle : Row, Column, Button )原地等待直到鼠标按下
dump_window_image (DumpImage, WindowHandle)将窗口的内容截图成图像

2 基础算子

## 图像、区域
read_image
write_image 第3个参数FillColor是输入变量,表示不属于图像区域的灰度像素填充值,默认值为0。
dump_window_image将窗口内其它信息(如箭头,指示文字等)也保存进Image,然后write_image保存;
parse_filename(ImageFiles, BaseName, Extension, Directory)获取文件名、后缀、文件夹
get_image_size
zoom_image_factor(Image : ImageZoomed : ScaleWidth, ScaleHeight, Interpolation : )根据缩放因子实现图像缩放
zoom_image_size(Image : ImageZoom : Width, Height, Interpolation : )根据尺寸进行图像的缩放
convert_image_type
channels_to_image把单通道图像转变为一个多通道图像。
rgb3_to_gray 还会得到 R G B 三个通道的灰度图。即一共得到4幅图。
rgb1_to_gray没有三个通道的灰度图。即只有一幅图。

scale_image(Image : ImageScaled : Mult, Add : )  图像灰度比例拉伸运算(黑的地方更黑,亮的地方更亮),    g’ := g * Mult + Add
emphasize (ImageInvert, ImageEmphasize, Width, Height, 1)增强图像的高频区域(边缘和拐角)的对比度, res := round((orig - mean) * Factor) + orig
illuminate(Image : ImageIlluminate : MaskWidth, MaskHeight, Factor : )增强图像的高频区域(边缘和拐角)的对比度


add_image
max_image
invert_image
mean_image
tile_images(Images : TiledImage : NumColumns, TileOrder : )NumColumns指最终拼成的图有多少列,TileOrder指子图片排列的顺序——垂直方向还是水平方向
tile_images_offset(Images : TiledImage : OffsetRow, OffsetCol, Row1, Col1, Row2, Col2, Width, Height : )
gen_image_const (ConstImage, 'byte', 11, 11)创建一个灰度值不变的图像
edges_image (Image, ImaAmp, ImaDir, 'mderiche2', 0.7, 'nms', 10, 20)使用Deriche、_Lanser、Shen或者_Canny滤波器提取只包含边缘的图像。
mirror_image (Image, ImageMirror, 'row')图像的镜像

add_channels 为区域添加灰度值
shape_trans (SelectedRegions, RegionTrans, 'rectangle2')*区域转化为矩形
compose3 (ImageRed, ImageGreen, ImageBlue, LogoImageTempl)将三幅图像合并成一幅图像
decompose3 (LogoImage, ImageR, ImageG, ImageB)将一幅图像根据RGB值转换成三幅图像。
access_channel(MultiChannelImage : Image : Channel : )访问多通道输入图像的某一个通道。 结果是一个单通道图像
intersection取出两个区域中重叠的部分
difference取出两个区域中不重叠的部分
complement(Region : RegionComplement : : )找到输入区域的补区域。
intensity(Regions,Images:::Mean,Deviation)计算Images中Regions的均值和方差。

get_domain (Image, Domain)图像转换成区域
reduce_domain获得特定区域Region位置的图像,不裁剪
move_region
zoom_region(Region : RegionZoom : ScaleWidth, ScaleHeight : )根据缩放因子对区域缩放
crop_domain对特定区域图像进行裁剪
crop_part从每个输入图像中剪切一个或多个矩形区域。 区域由矩形指示,这些矩形由其左上角的坐标及其大小定义。
connection将区域分散开,只要是没有交集的区域,都分成不同的单独小区域
select_shape
select_shape_std
select_shape_proto (Pads, BallBonds, MissingBonds, 'overlaps_rel', 0, 0)选出具有相似特征的所有区域
union1返回所有输入区域的并集
union2返回两个区域的并集
concat_obj通过concat只是把objects放到一起,没有实质上的合并,依然各过各的,union完之后,object就完全变成了一个了,不再好分开
skeleton骨架
count_obj
boundary边界
fill_up
fill_up_shape
area_center一个区域的面积(大小)和中心
smallest_circle最小外接圆的中心坐标和半径会被返回
inner_circle最大内接圆
gen_circle
diameter_region最小外接圆直径
smallest_rectangle2 (RegionTrans, Row, Column, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, 300, 200, Phi, 100, 1)生成矩形

clip_region_rel (RegionBorder, RegionClipped, 5, 5, 5, 5)顶部剪切的行数,底部剪切的行数,左边剪切的列数,右边剪切的列数。剪切的行数不是坐标
clip_region (HighZoomedMoved, HighAreas, 0, 0, 511, 511)剪切region里一个矩形出来,需要填入矩形的左上角点和右下角点,进行剪切
region_to_bin(Region : BinImage : ForegroundGray, BackgroundGray, Width, Height : )在Region中给定的输入区域转换为“字节”图像,并将ForegroundGray的灰度值分配给该区域中的所有像素。 如果输入区域大于生成的图像,则会在图像边框处裁剪。 背景灰度值设置为BackgroundGray。

## 区域延伸
expand_gray_ref (Regions, Image, EmptyRegion, RegionExpand, 'maximal', 'image', Mean, 11)根据灰度和颜色将分离的区域连通。
expand_line (Image, RegionExpand, Line, 'mean', 'row', 100)将轮廓拓展成一个跟其灰度相近的区域。
expand_region (Regions, NoPixel, RegionExpanded1, 'maximal', 'image') 填充区域间隙、把相互重叠部分分开

3 腐蚀膨胀

dilation_circle
dilation_rectangle1
gray_closing (Image, ImageReduced, ImageClosingFast)灰度值闭操作,结构元素在图像中遍历,灰度值最低的值作为新值,有使图像变暗的作用。
gray_opening (Image, ImageReduced, ImageOpeningFast) 灰度值开操作,结构元素在图像中遍历,灰度值最高的值作为新值,有使图像变亮的作用。

4 修改图像或区域的值


gen_image_const(Image,'byte',512,512)    //生成一个纯0图像,用byte格式
gen_image_proto (ImageReduced, ImageCleared, 255) 创建纯白图像
overpaint_gray ( ImageDestination, ImageSource : : : )  将灰度值不相同区域用不同颜色绘制到ImageDestination中,ImageSource包含希望的灰度值图像
overpaint_region ( Image, Region : : Grayval, Type : ) 将Region以一个恒定的灰度值绘制到Image图像中(原图)
paint_gray ( ImageSource, ImageDestination : MixedImage : : ) 将ImageSource的图像绘制到ImageDestination中,形成MixedImage。
paint_region ( Region, Image : ImageResult : Grayval, Type : ) 将Region以一个恒定的灰度值绘制到Image图像中(非原图)
paint_xld ( XLD, Image : ImageResult : Grayval : ) 将XLD以一个恒定的灰度值绘制到Image图像中
    
get_region_points(RegionUnion, Rows, Columns)查询一个区域的像素坐标
get_grayval(DupImage2, Rows, Columns, Grayval)获得像素坐标对应像素值
set_grayval ( Image : : Row, Column, Grayval : ) 设置Image图像中坐标为(Row,Column)的灰度值

5 仿射变换

两种实现旋转的方法rotate_image和affine_trans_image
rotate_image是按逆时针方向进行旋转,而且旋转后的图片大小不变,但内容可能会有缺失。并且物体的中心在原图的位置和在旋转之后图片上的位置还会有差异。
为了解决使用rotate_image进行旋转产生的问题,可以所以建议使用旋转矩阵affine_trans_image来进行旋转。

text_line_slant (Image, Image, 140, -rad(45), rad(45), SlantAngle)自动检索文本行的斜率,第三个参数为字体拉升长度 >=原字符长度
hom_mat2d_slant (HomMat2DIdentity, -SlantAngle, 'x', 0, 0, HomMat2DSlant)向生成的二维变换的齐次变换矩阵中添加斜率
orientation_region用来计算区域的方向,将区域拟合为最小椭圆时,该椭圆长轴与水平方向的夹角
text_line_orientation (Needle, Needle, 35, -0.523599, 0.523599, OrientationAngle)确定文本行或段落的方向。
vector_angle_to_rigid (Row, Column, Phi, Row, Column, AimPhi, HomMat2D) 获得仿射变换矩阵
hom_mat2d_identity (HomMat2DIdentity)生成一个2D单位矩阵
hom_mat2d_translate (HomMat2DIdentity, -0.5*(Row1+Row2), -0.5*(Column1+Column2), HomMat2DTranslate)对矩阵进行变换,用于平移。
hom_mat2d_rotate (HomMat2DIdentity, -OrientationAngle, Px, Py, HomMat2DRotate)用于旋转
hom_mat2d_scale (HomMat2DTranslate, ScaleFactor, ScaleFactor, 0, 0, HomMat2DScale) 用于缩放
affine_trans_image对图像进行仿射变换
rotate_image (ImageScaleMax, ImageRotate, deg(-OrientationAngle), 'constant')将图像按照指定的角度旋转

6 求角度

计算直线与水平轴之间的夹角 angle_lx( : : Row1, Column1, Row2, Column2 : Angle)
计算两条直线之间的夹角angle_ll( : : RowA1, ColumnA1, RowA2, ColumnA2, RowB1, ColumnB1, RowB2, ColumnB2 : Angle)
计算一条直线的方向line_orientation( : : RowBegin, ColBegin, RowEnd, ColEnd : Phi)
计算一条直线的参数line_position( : : RowBegin, ColBegin, RowEnd, ColEnd : RowCenter, ColCenter, Length, Phi)
计算区域等效椭圆的参数elliptic_axis(Regions : : : Ra, Rb, Phi)
计算区域的最小仿射外接矩形的参数smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2)
计算区域的方向orientation_region(Regions : : : Phi)

7 求距离

distance_pl:只算点到直线的距离。
distance_pp:计算两点之间的距离。
projection_pl:计算一个点到直线的垂足。
angle_ll:计算两条直线的夹角。
angle_lx:计算直线和x轴的夹角。

1.已知点与直线 求垂足
点(X,Y)
线(BeginX,BeginY,EndX,EndY)
projection_pl (X, Y, BeginX, BeginY, EndX, EndX, 垂足X, 垂足Y)

2.已知一线轮廓与所求平行线之间距离
已知线轮廓:contour
已知距离:Distance
gen_parallel_contour_xld(contour, parallelcontour, ‘regression_normal’, -Distance)

8 分割

partition_dynamic(Region: Partitioned: Distance, Percent : )在水平位置上以参数Distance的宽度分割区域,分割得到的位置是相对小的垂直部分。
partition_rectangle(Region : Partitioned : Width, Height : )将输入区域划分为Width*Height的矩形。
gray_histo (Image, Image, AbsoluteHisto, RelativeHisto)获得绝对和相对直方图
gen_region_histo (Region, AbsoluteHisto, 255, 255, 1)绘制直方图
histo_to_thresh (AbsoluteHisto,10, MinThresh, MaxThresh)利用直方图获取阈值
fast_threshold (Image, Region, 128, 255, 10)根据最大和最小灰度以及面积选出区域.快速二值化,与二值化是一致的,只不过多加了个参数,最后一个参数是保留尺寸大于该值的二值化区域,否则还要调用一个select_shape
bin_threshold使用自动确定的全局阈值分割单通道图像,并在Region 中返回分割后的区域。少了两个算法选项,也不能决定选择黑或者白。因此被halcon建议作废。
char_threshold (Alpha1, Alpha1, Characters, 6, 95, Threshold)自动阈值分割,阈值根据直方图的波峰取得
dyn_threshold (ImageFilled, ImageMean, RegionDynThresh, 3, 'light')动态阈值分割。
由于背景不均一,目标体经常表现为比背景局部亮一些或暗一些,无法确定全局阈值操作(无法通过单个高低阈值对整幅图像分割),
需要通过其邻域找到一个合适的阈值进行分割这时就要用到局部阈值分割了。
auto_threshold (Image, Regions, 10)直方图决定阀值分割图像,根据灰度直方图中两波峰中的波谷取出阈值。运行原理:
计算灰度直方图。
高斯平滑后从直方图提取最小值。
根据提取的最小值进行阈值分割。sigma越大提取区域越少。
check_difference (Traffic1, Traffic2, Selected1, 'diff_outside', -255, 15, 0, 0, 0)根据两幅图的不同进行图像分割。
regiongrowing (Image, Regions, 1, 1, 1, 100)将图像分割成各个灰度值相近的区域。
binary_threshold全局二值化处理做阈值分割的算子。使用Threshold找到两个波峰之间的最小值,分割出来的是非黑即白。
注意“二值化”的意义,它有许多算法:
方法一:扫描图像的每个像素值,值小于127的将像素值设为0(黑色),值大于等于127的像素值设为255(白色)。
该方法的好处是计算量少速度快。
方法二:计算像素的平均值K,扫描图像的每个像素值如像素值大于K像素值设为255(白色),
值小于等于K像素值设为0(黑色)。
方法三:使用直方图方法来寻找二值化阈值,直方图是图像的重要特质,
直方图方法选择二值化阈值主要是发现图像的两个最高的峰,然后在阈值取值在两个峰之间的峰谷最低处。
注意halcon的binary_threshold算子算法是OSTU,以上算法只是原理说明一下怎么简单实现二值化。
watersheds_threshold(Image : Basins : Threshold : )分水岭阈值分割,可以提取分水岭盆地。其原理:
通过分水岭算法watersheds()获取图像的盆地。
根据第一步分水岭算法分离结果,若盆地部分的灰度< threshold,则被合并到一起。

9 亚像素轮廓


edges_sub_pix提取亚像素轮廓
select_contours_xld
select_shape_xld
fit_rectangle2_contour_xld用最小外接矩形拟合该亚像素轮廓
gen_rectangle2_contour_xld生成拟合的亚像素矩形轮廓
get_contour_xld获得轮廓的各个点的坐标
dist_rectangle2_contour_points_xld 计算轮廓上每一点与其拟合矩形对应点之间的距离

gen_cross_contour_xld
shape_trans_xld (Border, XLDConvex, ‘convex’)将区域的边界根据不同的属性转化成轮廓
segment_contours_xld分割轮廓
sort_contours_xld (ContoursSplit, SortedContours, 'upper_left', 'true', 'column')轮廓排序
length_xld (UnionContours, Length)
threshold_sub_pix(Image : Border : Threshold : )  以灰度值大于Threshold区域和灰度值小于Threshold的区域为分界点提取亚像素精密轮廓  

gen_contour_region_xld (SelectedRegions, Contours, 'border') region转xld
gen_region_contour_xld (SelectedXLD, RegionXLD, 'filled')  xld转region

gen_contour_polygon_rounded_xld创建带圆角的多边形轮廓,坐标和圆角可以通过数组的形式指定。
gen_contour_polygon_xld创建不带圆角的多边形轮廓,坐标同样可以使用数组的形式指定。

10 求交点

intersection_lines()

你可能感兴趣的:(halcon,图像处理)