halcon视觉缺陷检测常用的6种方法

1.blob+特征
2.blob+差分+特征
3.光度立体
4.特征训练
5.测量拟合
6.频域+空间结合
halcon——缺陷检测常用方法总结(频域空间域结合)

图像滤波

  • 噪声模型,主要有高斯,瑞丽,伽马,指数,均匀,椒盐,周期等
    椒盐噪声:对于椒盐采用中值滤波可以很好的去除。用均值也可以取得一定的效果,但是会引起边缘的模糊。
    高斯白噪声:白噪音在整个频域的都有分布,好像比较困难。

  • 图像去噪
    噪音是高频,从频域的角度来看,就是需要用一个低通滤波器对图像进行处理。通过低通滤波器可以抑制图像的高频分量。但是这种情况下常常会造成边缘信息的抑制。
    常见的去噪模板有均值滤波 mean_image,高斯滤波median_image等。这两种滤波器都是在局部区域抑制图像的高频分量,模糊图像边缘的同时也抑制了噪声。高斯滤波的过程就是对图像进行加权平均。
    还有一种非线性滤波中值滤波median_image。中值滤波对脉冲型噪声有很好的去掉。因为脉冲点都是突变的点,排序以后输出中值,那么那些最大点和最小点就可以去掉。中值滤波对高斯噪音效果较差。

  • 图像增强
    图像增强经常是需要增强图像的边缘,
    常见的图像增强方法有对比度拉伸,直方图均衡化,图像锐化等。前面两个是在空域进行基于像素点的变换,后面一个是在频域处理。

  • 保边滤波,如双边滤波、导向滤波

  • 频域滤波:傅里叶、gabor、小波

图像特征匹配

  • 特征匹配与灰度匹配的区别:灰度匹配是基于像素的,特征匹配则是基于区域的,特征匹配在考虑像素灰度的同时还应考虑诸如空间整体特征、空间关系等因素。
  • 特征匹配是指通过分别提取两个或多个图像的特征(点、线、面等特征),对特征进行参数描述,然后运用所描述的参数来进行匹配的一种算法。基于特征的匹配所处理的图像一般包含的特征有颜色特征、纹理特征、形状特征、空间位置特征等。

图像矩特征

矩是概率与统计中的一个概念,是随机变量的一种数字特征。针对于一幅图像,我们把像素的坐标看成是一个二维随机变量(X,Y),那么一幅灰度图像可以用二维灰度密度函数来表示,因此可以用矩来描述灰度图像的特征。不变矩(Invariant Moments)是一处高度浓缩的图像特征,具有平移、灰度、尺度、旋转不变性。

纹理特征提取方法

一般分为四大类:
a.基于统计的方法:灰度共生矩阵、灰度行程统计、灰度差分统计、局部灰度统计、半方差图、自相关函数等
优点:方法简单,易于实现。
缺点:无法利用全局信息,与人类视觉模型不匹配;计算复杂度较高,计算耗时。
较为经典的算法为灰度共生矩阵方法,其通过统计不同灰度值对的共现频率得到灰度共生矩阵,基于矩阵可计算出14种统计量:能量、熵、对比度、均匀性、相关性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相关信息测度以及最大相关系数。灰度梯度共生矩阵将图梯度信息加入到灰度共生矩阵中,综合利用图像的灰度与梯度信息,效果更好。图像的梯度信息一般通过梯度算子(也称边缘检测算子)提取,如sobel、canny、reborts等。
b.基于模型的方法:同步自回归模型、马尔可夫模型、吉布斯模型、滑动平均模型、复杂网络模型等
c.基于结构的方法:句法纹理分析、数学形态学法、Laws纹理测量、特征滤波器等
d.基于信号处理的方法:Radon变换、离散余弦变换、局部傅里叶变化、Gabor变换、二进制小波变换、树形小波分解等

灰度共生矩阵GLCM

灰度共生矩阵概念最早由Haralick于1973年提出。图像纹理一般具有重复性,纹理单元往往会以一定的规律出现的图像上,因此这种图像中一定距离之内往往会有两两灰度相同的像素点对,这种特性就适合用灰度共生矩阵表示。

cooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)
(1)能量:表示灰度共生矩阵中的元素的平方和。能量越大,表示灰度变化比较稳定,反映了纹理变化的均匀程度。
(2)相关性:表示纹理在行或者列方向的相似程度。相关性越大,相似性越高。
(3)局部均匀性:反映图像局部纹理的变化量。值越大,表示图像局部的变化越小。
(4)反差(对比度):表示矩阵的值的差异程度,也间接表现了图像的局部灰度变化幅度。反差值越大,图像中的纹理深浅越明显,表示图像越清晰;反之,则表示图像越模糊。

    read_image (Image, 'xxx')
    decompose3 (Image, R, G, B)
    * defects are characterized by dark patches. Hence, by substracting the
    * estimated background illumination from the original image the
    * defects become more apparent
    estimate_background_illumination (B, ImageFFT1)
    sub_image (B, ImageFFT1, ImageSub, 2, 100)
    * median filter smooths out the fine texture, simplifying the following
    * segmentation and final detection of defects
    median_image (ImageSub, ImageMedian, 'circle', 9, 'mirrored')
    watersheds_threshold (ImageMedian, Basins, 20)
    * dark patches corresponding to defects have a very low energy
    cooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)
    tuple_find (sgn(Energy-0.05), -1, Indices)
    select_obj (Basins, Defects, Indices+1)
    * 
    dev_display (Image)
    dev_display (Defects)

在这里插入图片描述

灰度梯度共生矩阵

洪继光于1984年在灰度共生矩阵的基础上提出灰度梯度共生矩阵,反应图像中两种最基本信息像素灰度和梯度(边缘)的相互关系。

Tamura纹理特征

基于人类对纹理的视觉感知心理学研究,提出6种属性,即:粗糙度(Coarseness)、对比度( Contrast)、方向度( Directionality)、线性度( Linelikeness)、规则度(Regularity)和粗略度(Roughness)。前面三个特征线性无关,后面三个特征和前面三个特征是线性相关的,因此只采用前三个特征。

局部二值模型LBP

用于纹理特征提取,具有旋转不变性和灰度不变性等显著优点。

二维码识别

single_cell_mm:=1
dev_set_draw ('margin')
read_image (Image, 'C:/Users/30063/Desktop/CV算法数据 - 喷码散点/light/_[2022_11_22_10_13_30_217]_H742233AC00055M239H__UUT_Front_Light___9611_33.bmp')
*输入选取的标定区域的一个矩形的左上角点坐标和右下角点坐标
*只能框柱2*2的二维码区域,不能比这个阵列多(也可以循环多次框区域进行求均值)
draw_rectangle1 (3600, Row12, Column12, Row22, Column22)
Row1:=Row12
Column1:=Column12
Row2:=Row22
Column2:=Column22
* Row1:=1571
* Column1:=4936
* Row2:=2165
* Column2:=5878
*输出水平X方向的标定值:x_mm
*输出垂直Y方向的标定值:y_mm
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
reduce_domain (Image, Rectangle, ImageReduced2)
emphasize (ImageReduced2, ImageEmphasize, 7, 7, 1)
gen_empty_obj (SymbolXLDs)

create_data_code_2d_model ('Data Matrix ECC 200', ['default_parameters'], ['maximum_recognition'], DataCodeHandle)
query_data_code_2d_params (DataCodeHandle, 'get_model_params', GenParamNames)
find_data_code_2d (ImageEmphasize, SymbolXLDs, DataCodeHandle, 'stop_after_result_num', 8, ResultHandles, DecodedDataStrings)
area_center_xld (SymbolXLDs, Area, Row, Column, PointOrder)
clear_data_code_2d_model (DataCodeHandle)

在这里插入图片描述

Hough变换

把原始图像中给定直线的检测问题,转化为寻找参数空间的(局部)最大值问题。图像空间(笛卡尔空间)中的一条线是参数空间(霍夫空间)中的一个点。
霍夫变换(Hough Transform)
一文解读经典霍夫变换(Hough Transform)
在这里插入图片描述

击中-击不中

击中-击不中可以实现对象的细化和剪枝操作,常用于物体识别、图像细化。严格来说,击中击不中并非相当于腐蚀操作,而是类似于严格的模板匹配。只有符合要求的形状,才会在最终结果中显示出来。
OpenCV 中的函数 cv.morphologyEx 可以实现击中-击不中变换,但要将参数 op 设为 cv.MORPH_HITMISS,并使用 CV_32SC 数据类型。
使用击中-击不中变换进行特征识别,提取绳结特征。
在这里插入图片描述

什么时候使用傅里叶变换进行频域分析?

1)具有一定纹理特征的图像,纹理可以理解为条纹,如布匹、木板、纸张等材质容易出现。
2)需要提取对比度低或者信噪比低的特征。
3)图像尺寸较大或者需要与大尺寸滤波器进行计算,此时转换至频域计算,具有速度优势。因为空间域滤波为卷积过程(加权求和),频域计算直接相乘。
halcon——缺陷检测常用方法总结(频域空间域结合)

  • 图像傅里叶变换的频谱图:中间亮点是指图像低频的信息,外面的一周黑色是高频信息。
    浅谈傅里叶变化的应用
    在这里插入图片描述
  • 根据卷积定理,时域卷积等价与频域乘积。因此,在时域内对图像做模板运算就等效于在频域内对图像做滤波处理。比如说一个均值模板,其频域响应为一个低通滤波器;在时域内对图像作均值滤波就等效于在频域内对图像用均值模板的频域响应对图像的频域响应作一个低通滤波。

(1) 脏污检测(低通滤波,差分,线提取)
在塑料薄膜上有一些线条型的脏污,在空间域中向提取脏污的区域是比较困难的(方格会影响空间域的二值化),所以我们就想到了在频域中去处理它。
在这里插入图片描述

(2)检测表面微小凸起(高斯差分,灰度差,二值化)
使用两个低通滤波器,进行相减后构造了一个带阻滤波器来提取缺陷分量。通过带阻滤波后获得的频率成分对背景中的纹理要有明显的抑制,并且突出缺陷成分,在频域处理完成转会空间域之后,又用了一个能扩大亮点区域的函数:gray_range_rect 辅助后面的二值化,最终完成了缺陷的检测,这个函数可以说是点睛之笔。
在这里插入图片描述

(3) 检测磨砂表面的缺陷(高斯滤波差分,分水岭,灰度共生矩阵)
由于磨砂表面粗糙(噪点很多,影响二值化) 因此该例程使用了频域高斯滤波差分后,在空间域的blob分析用了分水岭域分割滤波后的图像,计算每个区域灰度共生矩阵,通过能量筛选缺陷。
在这里插入图片描述

光度立体法

光度立体法是多张图片合成的一种方法,可以解决单次拍摄无法拍到的问题,例如带有方向性的划伤缺陷,光度立体法可以根据二维纹理信息提取出三维模型。photometric_stereo算子至少需要三张图,这些图是在相机和物体相对位置不变条件下,通过不同方向打光获取的。

光度立体法的局限性:光度立体法基于Woodham算法。因此,一方面假定相机是无畸变成像,也就是说必须使用远心镜头或者长焦镜头。另一方面假定每一个光源发射的光束都是平行且均匀的,也就是说必须使用具有均匀强度的远心照明光源,或者使用远距离的点光源代替。此外,物体必须具有朗伯反射特性,即它必须以漫反射的方式反射入射光。有镜面反射的物体或者区域(镜子或者光滑的表面)不能使用此方法,会得到一个错误的结果。
halcon——缺陷检测常用方法总结(光度立体)

光照不均匀如何处理

方法1:采用通道分离方式对彩色图像进行光线均衡化。
1、输入光照不均匀的彩色图像。黑白单通道不适用这种方法,可直接直方图均衡
2、分离出RGB通道,每个通道单独一副图像
3、对每个通道进行直方图均衡
4、平滑后的3个通道组成彩色图像
5、结合滤波、增强再次优化

dev_close_window ()
read_image (test, 'data/label')
get_image_size(test, imageWidth, imageHeight)
dev_open_window (0, 0, imageWidth, imageHeight, 'black', WindowHandle)
*通道分离
decompose3(test, image1, image2, image3)
mean_image (image1, Mean1, 9, 9)
emphasize (Mean1, em1, 5, 5, 1.5)
illuminate (em1, ImageI1, 20, 20, 0.55)
equ_histo_image (image2, ImageEquHisto2)
equ_histo_image (image3, ImageEquHisto3)
compose3 (ImageI1, ImageEquHisto2, ImageEquHisto3, MultiChannelImage)
dev_display(MultiChannelImage)	
dev_open_window (0, 0, imageWidth, imageHeight, 'black', WindowHandle)
*增强对比度
emphasize (MultiChannelImage, ImageEmphasize, 10, 10, 5)
*高斯滤波
gauss_filter(ImageEmphasize, ImageGauss, 3)
dev_display(ImageGauss)

在这里插入图片描述
方法2:消除图像处理中的光照不均(matlab版)
1.进行最大(最小)值滤波初步得到光照图
2.进行均值(或高斯)滤波得到最终的光照分布图
3.原始图像减去光照图,得到前景目标

方法3:基于颜色的方法:将图像的颜色信息和亮度信息分离,只对颜色信息进行处理,从而去除光照的影响。

高阶算子

  • 骨架 → XLD 轮廓
    gen_contours_skeleton_xld (Skeleton, Contours, 1, ‘filter’)

  • 合并共线轮廓
    union_collinear_contours_xld (Contours, UnionContours, 30, 2, 10, 0.7, ‘attr_keep’
    在这里插入图片描述

  • 获取骨架区域的交点和结束点(端点)
    junctions_skeleton(Skeleton, EndPoints, JuncPoints)

  • split_skeleton_lines(SkeletonRegion::MaxDistance:BeginRow, BeginCol, EndRow, EndCol)
    功能:把骨骼分割为多条宽度为一个像素,无分支的直线。如果一条直线段A上的点到另外一条与A端点相连的直线段B的最大距离大于MaxDistance,那么把这个线段A分割为一个独立的直线区域。
    split_skeleton_region(SkeletonRegion:RegionLines:MaxDistance:)

  • 和空目标对比
    gen_empty_obj (EmptyObject)
    test_equal_obj (EmptyObject, Region, IsEqual)

  • derivate_gauss 将图像和高斯函数的导数求卷积,与高斯滤波不同
    read_image (Meningg5, ‘meningg5’)
    derivate_gauss (Meningg5, Smoothed, 2, ‘none’)
    convert_image_type (Smoothed, SmoothedByte, ‘byte’)
    watersheds (SmoothedByte, Basins, Watersheds)
    在这里插入图片描述

  • highpass_image从图像中提取高频分量
    在这里插入图片描述

  • mean_curvature_flow平均曲率滤波,比均值滤波mean_image边缘更清晰
    在这里插入图片描述

  • get_region_polygon 提取区域的拐点、折点
    在这里插入图片描述

  • gray_projections灰度投影
    在这里插入图片描述

  • distance_transform (SelectedRegions, DistanceImage, ‘octagonal’, ‘true’, 380, 350)距离变换 Foreground是TRUE表示测试region内部的点到region边缘的距离。为false 表示在region外的点到region的边缘
    在这里插入图片描述

  • dots_image对点状图形的提取
    在这里插入图片描述

======================================================================================================================================================================================

窗口显示

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)将窗口的内容截图成图像

基础算子

## 图像、区域
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') 填充区域间隙、把相互重叠部分分开

腐蚀膨胀

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

修改图像或区域的值


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)的灰度值

仿射变换

两种实现旋转的方法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')将图像按照指定的角度旋转

求角度

计算直线与水平轴之间的夹角 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)

求距离

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)

分割

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,则被合并到一起。


亚像素轮廓


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创建不带圆角的多边形轮廓,坐标同样可以使用数组的形式指定。

字符检测

Halcon汉字OCR训练识别
[Halcon&识别] OCR字符识别
基于HALCON的喷码字符自训练与识别
HALCON OCR识别实战
基于halcon的字符缺陷检测系统
Halcon学习笔记(九)——OCR实战练习 倾斜日期检测、倒着的字符检测
halcon之ocr识别(个人总结)

trf为文本与字符的关联;omc为神经网络分类器,osc支持向量机分类器,不能被OCR助手读取;可以被ocr读取函数读取。

create_ocv_proj (‘A’, OCVHandle)  创建OCV句柄
traind_ocv_proj (ImageReduced, OCVHandle, ‘A’, ‘single’)  训练OCV句柄
write_ocv (OCVHandle, ‘test_ocv.ocv’)  保存OCV句柄
read_ocv (‘test_ocv.ocv’, OCVHandle)  读取OCV句柄
do_ocv_simple (ImageReduced, OCVHandle, ‘A’, ‘true’, ‘true’, ‘true’, ‘true’, -1, Quality)  使用OCV工具验证样品
close_ocv (OCVHandle)


write_ocr_trainf (Characters, ImageReduced, Classes, TrainFile)将内容导入到trf文件夹中,trf文件夹目录已经提前初始化
read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)读取文件内容,为了创建分类器的时候提供要分类的字符

append_ocr_trainf(Character, Image : : Class, TrainingFile : )
四个参数分别是:字符Region、字符Image、字符文本、OCR训练的.trf文件路径。
如果该路径下不存在.trf文件,那么它会自动生成该文件。
该算子作用是将单个字符区域、单个字符图像和对应的字符文本写入TrainingFile 文件。
create_ocr_class_mlp (8, 10, 'constant', 'default', Char, 40, 'none', 10, 42, OCRHandle)OCR分类器其实有很多,但是通常mlp分类器效果较好,使用较多。
trainf_ocr_class_mlp (OCRHandle, 'letters.trf', 200, 1, 0.01, Error, ErrorLog)
write_ocr_class_mlp (OCRHandle, 'letters')
read_ocr_class_mlp (FontName, OCRHandle)
do_ocr_multi_class_mlp (FinalNumbers, Bottle, OCRHandle, RecNum, Confidence)
clear_ocr_class_mlp (OCRHandle)
create_ocr_class_svm 使用支持随机向量机制创建OCR分类器。

模板匹配

基于HALCON的模板匹配方法总结(基于形状)
HALCON丨HDevelop常用工具之模板匹配
模板匹配按照逆时针找模板
Halcon模板匹配主要三种:
Gray-Value-Based:基于灰度
Shape-Based:基于形状
Component-Based:基于组件


一、基于灰度的模板匹配:
应用场合:定位对象内部的灰度值没有大的变化,没有缺失部分,没有干扰图像和噪声的场合。
1.创建模板:create_template()
2.寻找模板:best_match (ImageSearch, TemplateID, 30, 'false', RowNew, ColumnNew, Error)
参数:输入图像,模板编号,灰度值的最大平均差,是否采用亚像素,匹配的行坐标,匹配的列坐标,最佳匹配的灰度值的平均发散度
3.释放模板:clear_template()

二、基于形状的模板匹配:
应用场合:定位对象内部的灰度值可以有变化,但对象轮廓一定要清晰平滑。
0.[可选]监视模板:inspect_shape_model()检查参数的适用性,还能帮助找到合适的参数
1.创建形状模型:create_shape_model()
2.保存、读入形状模板:write_shape_model (ModelID, 'green-dot.shm')、read_shape_model ('green-dot.shm', ModelID)
3.[可选]获得这个模板的轮廓,用于后面的匹配get_shape_model_contours ()
4.寻找形状模型:find_shpae_model(),返回一个模板实例的长、宽和旋转角度
5.释放形状模型:clear_shape_model()
6.结果转化 vector_angle_to_rigid或 affine_trans_contour_xld后期结果的仿射变换和轮廓处理

三、基于组件的模板匹配:
应用场合:组件匹配是形状匹配的扩展,但不支持大小缩放匹配,一般用于多个对象(工件)定位的场合。
1.获取组件模型里的初始控件 gen_initial_components()
2.根据图像模型,初始组件,训练图片来训练组件和组件相互关系  train_model_components()
3.创建组件模型 create_trained_component_model()
4.寻找组件模型 find_component_model()
5.释放组件模型 clear_component_model()


基于局部变形匹配:
应用场合:搜索对象有轻微的变形。
1.创建模板:create_local_deformable_model()
2.寻找模板:find_local_deformable_model()
3.释放模板:clear_deformable_model()

基于线性变形匹配:
应用场合:搜索对象有线性的变形,模板在行列方向上可以分别独立的进行一个适当的缩放变形来匹配, 主要参数有行列方向查找缩放比例、图像金字塔、行列方向匹配分数(指可接受的匹配分数,大于这个值就接受,小于它就舍弃)、设置超找的角度、已经超找结果后得到的位置和匹配分数。 分带标定的可变形模板匹配和不带标定的可变形模板匹配。
带标定的需要先读入摄像机内参 read_cam_par和外参 read_pose
1.创建模板:create_planar_calib_deformable_model()、create_planar_uncalib_deformable_model()
2.寻找模板:find_planar_calib_deformable_model()、find_planar_uncalib_deformable_model()
3.释放模板:clear_deformable_model()

基于比例缩放变形匹配:
应用场合:搜索对象有比例缩放的变形, 介于一般形状匹配和线性变形匹配之间的一种方法。它可以匹配放大或是缩小的模板,但是仅限于模板大小的缩放,即行列缩放因子一样。这也是它和线性缩放最大的不同。
1.创建模板:create_scaled_shape_model()
2.寻找模板:find_scaled_shape_model()
3.释放模板:clear_deformable_model()



基于互相关匹配:
应用场合:搜索对象有轻微的变形,大量的纹理,图像模糊等场合,速度快,精度低。
1.创建模板:create_ncc_model()
2.寻找模板:find_ncc_model()
3.释放模板:clear_ncc_model()

基于变化模型匹配
应用场合:搜索对象有轻微的变形。
1.创建模板:create_variation_model()
2.准备和训练模型:prepare_variation_model()、train_variation_model()
3.比较模板:compare_variation_model()
4.释放模板: clear_variation_model()

基于描述匹配:
应用场合:搜索对象有轻微的变形,透视的场合,根据一些描述点的位置和灰度值来进行匹配。
1.创建模板:create_calib_descriptor_model()
2.寻找模板:find_calib_descriptor_model()
3.释放模板:clear_descriptor_model()

halcon数组

## 创建数组1)gen_tuple_const函数
tuple := gen_tuple_const(100,4711) //创建一个具有100个元素的,每个元素都为4711的数据
tuple_new := gen_tuple_const(|tuple_old|,4711) //创建一个和原来数据长度一样的数据
tuple_new := (tuple_old * 0) + 4711和上一个结果相同
(2)当数组中的元素不同时,需要用循环语句对数组中的每一个元素赋值
tuple := []                                        		//创建空数组
for i := 1 to 100 by 1                                  //建立步长为1的循环
	tuple := [tuple,i*i]                                //将i方的值赋给数组的第i个元素
endfor                                                 //循环结束

Tuple1 := [1,0,3,4,5,6,7,8,9]    // 对数组进行初始化
Val := sin(1.2) + cos(1.2)        // 对某一个值进行赋值
Tuple2 := []                           // 数组定义
Tuple1[1] := 2						//修改索引为1

Halcon图像数据类型

Halcon中将16位的图像转化为8位的图像
在这里插入图片描述

Halcon正则表达式

在这里插入图片描述
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐