HALCON 基础:2. 一维码、二维码、OCR识别与图像的增强和运算
本篇主要介绍在HALCON中,如何识别一维码、二维码以及OCR字符,同时介绍了不同种类的字符的识别,以及如何识别汉字,同时介绍了如何运用HALCON的OCR助手训练自己所需的OCR模型。最后介绍了图像增强的算子,包括多种滤波方式的原理及其应用场景,介绍了图像的几何变换与算术运算。
文章目录
1.一维码识别
基本流程: 创建条形码模型、设置参数、搜索条形码
用到的算子:
create_bar_code_model()
set_bar_code_param()
find_bar_code()
get_bar_code_result()
clear_bar_code_model() //清除内存,识别句柄不能使用
create_bar_code_model( : : GenParamName, GenParamValue : BarCodeHandle)
//GenParamNames:可选参数名称
//GenParamValues:可选参数设置值
//BarCodeHandle:条形码模板句柄
//(获取条形码模型参数 )
set_bar_code_param( : : BarCodeHandle, GenParamName, GenParamValue : )
//BarCodeHandle(in) ——模型句柄
//GenParamNames(in) ——参数名称
//GenParamValues(in) ——参数值
相关参数如下:
//识别一维码
find_bar_code(Image ,SymbolRegions ,BarCodeHandle, CodeType , DecodedDataStrings)
//Image 输入图像
//SymbolRegions 检测到的条形码区域(输出)
//BarCodeHandle 条形码句柄
//CodeType// 条形码类型
//DecodedDataStrings 识别结果(输出)
get_bar_code_param()
//获取解码时的参数(如果没有设置过,则获得的是默认值)
get_bar_code_result()
//获得解码后的结果,例如可以获得条码的类型(Code 128、Code 39等等)
get_bar_code_object()
//获得解码时的一些对象,例如可以获得解码后的条码区域
2.二维码识别
基本流程: 创建模型、设置参数、搜索二维码、获取到信息进行下一步操作、清除模型
create_data_code_2d_model(SymbolType, GenParamName, GenParamValue ,DataCodeHandle)
//SymbolType二维数据代码的类型。
/* ‘Aztec Code’, ‘Data Matrix ECC 200’, ‘DotCode’, ‘GS1 Aztec Code’, ‘GS1 DataMatrix’, ‘GS1 DotCode’, ‘GS1 QR Code’, ‘Micro QR Code’, ‘PDF417’, ‘QR Code’
//GenParamName可以为 2D 数据代码模型调整的通用参数的名称。
//‘additional_levels’, ‘candidate_selection’, ‘contrast_min’, ‘contrast_tolerance’, ‘default_parameters’, ‘finder_pattern_tolerance’, ‘mirrored’, ‘model_type’, ‘module_aspect’, ‘module_aspect_max’, ‘module_aspect_min’, ‘module_gap’, ‘module_gap_max’, ‘module_gap_min’, ‘module_grid’, ‘module_size’, ‘module_size_max’, ‘module_size_min’, ‘module_width’, ‘module_width_max’, ‘module_width_min’, ‘persistence’, ‘polarity’, ‘position_pattern_min’, ‘slant_max’, ‘small_modules_robustness’, ‘strict_model’, ‘strict_quiet_zone’, ‘symbol_cols’, ‘symbol_cols_max’, ‘symbol_cols_min’, ‘symbol_rows’, ‘symbol_rows_max’, ‘symbol_rows_min’, ‘symbol_shape’, ‘symbol_size’, ‘symbol_size_max’, ‘symbol_size_min’, ‘timeout’, ‘version’, ‘version_max’, ‘version_min’
*/
//GenParamValue可以为 2D 数据代码模型调整的通用参数的值。
/*‘standard_recognition’, ‘enhanced_recognition’, ‘maximum_recognition’, ‘yes’, ‘no’, ‘any’, ‘dark_on_light’, ‘light_on_dark’, ‘square’, ‘rectangle’, ‘small’, ‘big’, ‘fixed’, ‘variable’, ‘low’, ‘high’, ‘default’, ‘extensive’, 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 30, 50, 70, 90, 12, 14, 16, 18, 20, 22, 24, 26, 32, 36, 40, 44, 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144*/
//DataCodeHandle用于使用和访问二维数据代码模型的句柄。
//设置参数
set_data_code_2d_param( DataCodeHandle, GenParamName, GenParamValue )
//DataCodeHandle 句柄
//GenParamName 为 2D 数据代码调整的通用参数的名称
//'abort'、'additional_levels'、'candidate_selection'、'contrast_min'、'contrast_tolerance'、'decoding_scheme'、'default_parameters'、'discard_undecoded_candidates'、'finder_pattern_tolerance'、'format'、'mirrored'、'model_type ' , 'module_aspect' , 'module_aspect_max' , 'module_aspect_min' , 'module_gap' , 'module_gap_max' , 'module_gap_min' , 'module_grid', 'module_size' , 'module_size_max' , 'module_size_min' , 'module_width' , 'module_width_max' , 'module_width_min' , 'persistence' , 'polarity' , 'position_pattern_min' , 'quality_isoiec15415_aperture_size' , 'slant_max' , ' small_modules_robustness ' strict_model','strict_quiet_zone','string_encoding','symbol_cols','symbol_cols_max', 'symbol_cols_min' , 'symbol_rows', 'symbol_rows_max' , 'symbol_rows_min' , 'symbol_shape' , 'symbol_size' , 'symbol_size_max' , 'symbol_size_min' , 'timeout' , 'trained' , 'version' , 'version_max' , 'version_min'
//GenParamValue 要调整的参数的值
//查找二维码
find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, GenParamName, GenParamValue, ResultHandles, DecodedDataStrings)
//Image(输入对象) 单通道图像
//SymbolXLDs xld_cont对象
//DataCodeHandle 句柄
//GenParamName 控制操作行为的(可选)参数的名称
//GenParamValue 参数可选值
//ResultHandles 返回成功解码的二维数据代码符号句柄
//DecodedDataStrings 所有检测到的二维数据码符号的解码数据串。
//清除模型
clear_data_code_2d_model (DataCodeHandle)
3. OCR
HALCON字符识别训练集是白底黑字。(切记!!!)
识别流程:
获取图像——图像预处理——图像分割——生成识别用的分类器句柄——开始识别字符——关闭识别句柄释放资源
/*****************
了解OCR的常用方法:
1. 统计特征字符识别:这类方法先从字符图像中提取字形,将其与事先存储的字形进行比较,将相似度最高的匹配结果作为分类结果。这类方法的匹配算法简单,具有较快的匹配速度和较高的识别率。但是这类方法对于变形、选择等改变方向字符的识别能力较弱。
2. 结构字符识别:该类方法首先对待识别字体进行字体结构识别,利用字符的轮廓结构特征和统计特征来确定字符的模式、基元等特征,并通过基元的排序、组合形成字符特征。该类方法需要较高的图像分辨率,以便获得清晰的图像特征结构,但是这会影响图像识别的速度。
3. 神经网络的识别:该类方法将提取到的字符特征向量输入神经网络进行识别。该类方法能够有效地对各种模糊字符进行正确判断,但是学习速度慢,泛化能力较弱。
4. 深度学习的方法:这类方法通常用深度神经网络来充当字符的特征提取器和分类器,不需要人为设计字符特征,从而减少了人为设计特征造成的不完备性,提高识别的准确率。它的缺点是要达到很好的精度,需要大数据支撑,以及更多更好的硬件支持。
***/
//读取分类器。使用read_ocr_class_mlp算子读取以“.omc”结尾的分类器文件。
read_ocr_class_mlp( : : FileName : OCRHandle)
// FileName 文件路径
// OCRHandle 字符识别句柄
//使用OCR分类器对多个字符进行实例分类
do_ocr_multi_class_mlp(Character, Image : : OCRHandle : Class, Confidence)
//Character:输入参数,输入需要辨认的字符区域。
//Image:输入参数,输入需要辨认字符的灰度值图像。
//OCRHandle:输入参数,OCR_mlp分类器的句柄。
//Class:输出参数,输出MLP识别对应的结果,该值保存的值为识别出来的字母或者数字或者符号等(数组)。Class == Character。
//Confidence:输出参数, 输出对应的特征相似值(数组),该值≤1.0,Confidence == Character。
TXET分割识别:
- get_text_model_parm 设置文本模型参数
- create_text_model_reader
- set_text_model_param
- find_text
- get_text_object
- get_text_result
点状字符识别:
主要是对点状字符所在区域的识别,常用到切分法,并用到膨胀,closing、intersection、partition_rectangle等算子
环形字符识别:
应用:环形物料上的字符,需要拉直进行识别,这里要用到极坐标的变换。
步骤:通常求内圆外圆,切出环形区域,进行极坐标的转换拉直,进行识别
汉字识别:
训练自己的OCR模型
采集图像、预处理、分割、训练、创建神经网络、形成trf文件、训练(本质是优化参数,沿着梯度最小的方向)、训练文件的读和写
核心算子:
write_ocr_trainf //写入trf文件
read_ocr_trainf_names //读取trf文件
create_ocr_class_mlp //创建ocr分类器
trainf_ocr_class_mlp //训练ocr分类器
write_ocr_class_mlp //写入ocr分类器
read_ocr_class_mlp //读取ocr分类器
OCR助手的使用:
主要学习如何使用OCR助手,包括打开图像,选取区域,希望读取的文本、调整参数、插入代码等
复杂背景下的OCR识别:
将图像划分通道,利用图像差分算法(sub_image),根据区域的灰度值进行区域的拓展连接(expand_gray_ref),直到找出想要识别的区域,再进行识别
4. 图像平滑处理
-
均值滤波:所有像素取平均值。
mean_image()
mean_image(Image : ImageMean : MaskWidth, MaskHeight : ) //Image:输入图像(byte’/ int2’/ uint2’/ int4’/ int8 /real’/ vector_field); //MaskWidth:输入平滑蒙板宽度,默认 9’参考 3, 5, 7, 9, 11, 15, 23, 31, 43, 101 , 1 < MaskWidth < 501 //MaskHeight:输入平滑蒙板高度,默认 9, 参考 3, 5, 7, 9, 11, 15, 23, 31, 43, 61, 101 , 1 < MaskH //lmageMean:输出平滑图像(byte/ int2 / uint2 / int4 / int8 /real/ vector_field),
-
高斯滤波:高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到
gauss_filter()
gauss_filter(Image : ImageGauss : Size : ) //Image 输入灰度图像 //ImageGausss 输出高斯滤波后的图像 //Size 数值越大 祛除得的杂点越大 最大值11
-
中值滤波:将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.
优势:消除杂点比均值滤波效果要好
median_image()
median_rect(Image : ImageMedian :MaskWidth,MaskHeight:) //Image 输入灰度图像 //ImageMedian 输出中值滤波后的灰度图像 //MaskWidth 中值矩阵的宽,数值通常为奇数,数值越大效果越明显 //MaskHeight 中值矩阵的高,数值通常为奇数,数值越大效果越明显
-
RANK滤波:
基于对图像的区域进行奇异值分解而得到。换句话说,如同均值滤波,总有一个filter区域,在该区域取均值填充,秩滤波也取filter,只是将filter的像素进行奇异值分解后,用结果数据填充。
中值滤波是取中间,Rank滤波专门取两头
rank_image(Image, Mask : ImageRank : Rank, Margin : ) //Image:输入被测量图片 //Mask:过滤区域(圆,矩形均可)用gen_circle (Mask, 200, 200, 10.5)语句生成; //ImageRank:被分成等级的图像,输出项。 //Rank:被分的等级,1 ≤ Rank ≤ 4095,考虑其它亚像素图像,这个等级很多。 //Margin:是对边缘如何处理,或补零、或镜像等。
5. 图像增强
-
增强
emphasize()
增强图像的高频区域(边缘和拐角),使图像看起来更清晰。
emphasize(Image : ImageEmphasize : MaskWidth, MaskHeight, Factor : ) //Image : ImageEmphasize 输入:输出 //MaskWidth 输入的掩膜宽度 //MaskHeight 高度 //Factor /********************* 1.第一步 使用 宽为 MaskWidth,高为MaskHeight的 mean_image (均值滤波器) 进行均值滤波。滤波后的图像灰度记为 mean, 滤波前的灰度记为 orig 2.将图像按如下公式进行计算 res := round((orig - mean) * Factor) + orig ********************/
-
一致性扩散增强
coherence_enhancing_diff()
对于纹理比较明显的情况,可以增强纹理;当类似纹理缺陷或者纹理很淡的时候,处理效果不明显,这里理解可以针对纹理明显的图像进行纹理增强和平滑。
执行对输入图像的各向异性扩散过程来增加图像所包含的图像结构的连贯性
coherence_enhancing_diff(Image : ImageCED : Sigma, Rho, Theta, Iterations : ) //Image : ImageCED 输入输出 //sigma,rho 与平滑和模糊图像有关,并且这两个参数影响纹理是否连接不间断,是否纹理较光滑Theta是迭代步长,Iterations 是迭代次数 //Theta, Iterations 时间步
-
比例增强
scale_image_max
作用:把图像的灰度值缩放到0-255范围内;
scale_image_max(Image : ImageScaleMax : : ) //输入输出图像
-
冲击滤波
shock_filter
主要增强边缘,减少图像边缘扩散,更便于边缘提取等操作。
在图像边缘产生强的不连续性,在一个区段内(包含一个最大影响区和一个最小影响区的范围简称为区段)图像是分段常数
shock_filter(Image : SharpenedImage : Theta, Iterations, Mode, Sigma : ) // Theta:即Δt // Iterations:迭代次数 // Mode:可选canny或laplacian, 二维微分算子 // Sigma:平滑参数,为了使边缘提的更鲁棒,Sigma是高斯平滑的标准差
6. 图像的算术运算
加减乘除、翻转、灰度取大、灰度取小、灰度比例拉伸运算
//加—— 用于图像合成,降低图像的随机噪声
add_image
//减—— 检测多幅图像之间的变化,用来把目标从背景中分离出来
sub_image
//乘—— 提取局部区域,通过掩模运算,将二值图像和原图像做乘法运算,实现图像的局部提取
mult_image
//除—— 校正阴影,实现归一化
div_image
//翻转
invert_image
//灰度取大—— 逐像素计算两个图像的最大值。
max_image
//灰度取小—— 逐像素计算两个图像的最小值。
min_image
//灰度比例拉伸—— 缩放图像的灰度值。
scale_image
7. 图像的几何变换
这部分内容与区域变换基本相似,其算子参数基本一致
-
仿射变换
affine_trans_image
affine_trans_image(Image : ImageAffineTrans : HomMat2D, Interpolation, AdaptImageSize : ) //Image : ImageAffineTrans //HomMat2D 变换矩阵 //Interpolation 插值转换 //AdaptImageSize 尺寸自适应
-
镜像变换
mirror_image
-
投射变换
projective_trans_image
projective_trans_image_size (指定输出图像的大小)
-
极坐标变换
polar_trans_image_ext
polar_trans_image_ext(Image : PolarTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : ) //Image : 待处理图片 //PolarTransImage :处理后的图片 //Row, Column, 极坐标原点坐标(圆心坐标) //AngleStart, AngleEnd, (弧度pi)开始、结束的弧度如上图,0弧度就是对应刻度2.5,pi/2对应5,逆时针 //RadiusStart, RadiusEnd, 极坐标开始的极长,一般是0,和圆半径r //Width, Height, 图片长宽 //Interpolation :未知
-
图像旋转
rotate_image
rotate_image(Image : ImageRotate : Phi, Interpolation : ) //Image是输入图像 //ImageRotate是旋转后的输出图像 //Phi是旋转角度 //Interpolation 是图像变换后的插值方式,这里选择的常量
-
缩小图像
zoom_image_size
zoom_image_size(Image : ImageZoom : Width, Height, Interpolation : ) //Image : ImageZoom 输入输出 //Width, Height 缩放的宽度高度 //插值类型
8. 图像灰度形态学
gray_erosion_shape(Image : ImageMin : MaskHeight, MaskWidth, MaskShape : )
//Image:输入参数,输入要腐蚀的图像。
//ImageMin:输出参数,输出掩码灰度最小化的图像。
//MaskHeight:输入参数,掩码(滤波器)的高度。范围 1.0 ≤ MaskHeight。
//MaskWidth:输入参数,掩码(滤波器)的宽度。范围1.0 ≤ MaskWidth。
//MaskShape:输入参数,掩码的外形 。'octagon'八角形, 'rectangle'长方形, 'rhombus'菱形。
-
灰度膨胀
gray_dilation_shape
-
灰度腐蚀
gray_erosion_shape
-
灰度开(先腐蚀后膨胀)
gray_opening_shape
-
灰度闭(先膨胀后腐蚀)
gray_closing_shape
9. 其他
锐化
作用:加强高频成分或减弱低频成分。锐化能够加强细节和边缘,对图像有去模糊的作用。同时,由于噪声主要分布在高频部分,如果图像中存在噪声,锐化处理对噪声将会有一定的放大作用。
索贝尔算法:
采用两列或者两行加权和的差值。
1、由于引入了平均因素,因而对图像中的随机噪声有一定的平滑作用;
2、由于它是相隔两行或两列的差分,故边缘两侧的元素得到增强,边缘显得粗而亮。
拉普拉斯算法:
拉普拉斯算子能对由扩散引起的图像模糊起到增强边界轮廓的效果,增强图像的同时也增强了噪声,所以进行边缘检测时,仍然有必要先对图像进行平滑或者去噪处理。