1.序列号读取
1.1 应用示例目的与思路
- 获取光盘的外接圆;
- 然后进行极坐标变换,获取字符所在的区域;
- 最后进行字符分割、识别及其在原图上显示。
1.2 应用示例相关算子介绍
(1) mean_image(Image : ImageMean : MaskWidth, MaskHeight : )
功能:对输入图像进行均值滤波(线性平滑)
图形输入参数:Image:输入图像;
图形输出参数:ImageMean:均值滤波后的图像;
控制输入参数:( MaskWidth, MaskHeight):滤波器的大小(宽高)。
(2) dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )
功能:从输入图像中选择像素满足阈值条件的那些区域(使用局部阈值分割图像)。
图像输入参数1:OrigImage:输入图像;
图形输入参数2:ThresholdImage:包含局部阈值的图像阈值图像是原始图像的平滑版本(例如,通过应用mean_image、binomial_filter、gauss_filter等);
图形输出参数:RegionDynThresh:分割后的区域;
控制输入参数1:Offset:应用于ThresholdImage图像的偏移,选择的“偏移”越大,提取的区域就越小;
控制输入参数2:LightDark:提取的模式(明亮、黑暗和相似),List of values: 'dark', 'equal', 'light', 'not_equal'。
(3) fill_up(Region : RegionFillUp : : )
功能:填充区域中的孔洞。
图形输入参数:Region:包含孔洞的输入区域;
图像输出参数:RegionFillUp:无孔洞的输出区域。
(4) gen_contour_region_xld(Regions : Contours : Mode : )
功能:从区域中根据Mode生成相应的xld轮廓。
图形输入参数:Regions:输入的区域;
图形输出参数:Contours:输出的轮廓;
控制输入参数:Mode:生成轮廓的模式,List of values: 'border', 'border_holes', 'center'。'border':边界像素的外部边界用作轮廓点;'border_holes':除了输入区域的外部边界之外,还可以获得所有孔洞的轮廓;'center':边界像素的中心被用作轮廓点。
(5)fit_circle_contour_xld(Contours : : Algorithm, MaxNumPoints, MaxClosureDist, ClippingEndPoints, Iterations, ClippingFactor : Row, Column, Radius, StartPhi, EndPhi, PointOrder)
功能:通过圆近似XLD轮廓(拟合圆)
图形输入参数:Contours:输入的轮廓;
控制输入参数1:Algorithm:用于拟合圆的算法,可选的参数有:
'algebraic' (“代数”方法使轮廓点和生成的圆之间的代数距离最小化);
'ahuber'(类似于“代数”方法,根据Huber的方法对轮廓点进行加权,以减少异常值的影响);
'atukey'(类似于“代数”方法,根据Tukey的方法对轮廓点进行加权,并忽略异常值);
'geometric'(“几何”方法使轮廓点和生成的圆之间的几何距离最小化);
'geohuber'(类似于“几何”方法,根据Huber的方法对轮廓点进行加权,以减少异常值的影响);
'geotukey'(类似于“几何”方法,根据Tukey的方法对轮廓点进行加权,并忽略异常值);
控制输入参数2:MaxNumPoints:用于计算的最大轮廓点数(所有点为-1),Default value: -1;
控制输入参数3:MaxClosureDist:轮廓端点之间的最大距离视为“闭合”,Default value: 0.0;
控制输入参数4:ClippingEndPoints:拟合要忽略的等高线起点和终点的点数,Default value: 0;
控制输入参数5:Iterations:指定算法“algebraic”、“ahuber”和“atukey”的迭代次数,Default value: 3;
控制输入参数6:ClippingFactor:用于消除异常值的剪裁因子(典型值:Huber为1.0,Tukey为2.0),Default value: 2.0;
控制输出参数1:(Row, Column):拟合圆的中心坐标;
控制输出参数2:Radius:拟合圆半径;
控制输出参数3:(StartPhi, EndPhi):拟合圆的起始和终止角度;
控制输出参数4:PointOrder:沿着边界点的顺序。
(6) polar_trans_image_ext(Image : PolarTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
功能:将图像中的环形弧转换极坐标系下为Width x Height的方形图像。
图形输入参数:Image:输入图像;
图形输出参数:PolarTransImage:输出图像;
控制输入参数1:(Row, Column):输入图像中环形弧中心的行列坐标;
控制输入参数2:(AngleStart, AngleEnd):输入图像中环形弧的起始和终止角度;
控制输入参数3:( RadiusStart, RadiusEnd):输入图像中环形弧的起始和终止半径;
控制输入参数4:(Width, Height):输出图像的宽和高;
控制输入参数5:Interpolation:变换中使用的插值方法。
(7) polar_trans_region_inv(PolarRegion : XYTransRegion : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, WidthIn, HeightIn, Width, Height, Interpolation : )
功能:将极坐标中的区域变换回笛卡尔坐标系下的环形区域。
图形输入参数:PolarRegion:输入区域;
图形输出参数:XYTransRegion:输出区域;
控制输入参数1:(Row, Column):输出区域中环形弧中心的行列坐标;
控制输入参数2:(AngleStart, AngleEnd):输出区域中环形弧的起始和终止角度;
控制输入参数3:( RadiusStart, RadiusEnd):输出区域中环形弧的起始和终止半径;
控制输入参数4:(WidthIn, HeightIn):变换区域XYTransRegion的虚拟输入图像尺寸;
控制输入参数4:(Width, Height):变换区域XYTransRegion的虚拟输出图像尺寸;
控制输入参数5:Interpolation:变换中使用的插值方法。
(8) connection(Region : ConnectedRegions : : )
功能:计算输入区域的连接组件(连通区域)。
图形输入参数:Region:输入区域;
图形输出参数:ConnectedRegions:输出的连通区域;
(9) sort_region(Regions : SortedRegions : SortMode, Order, RowOrCol : )
功能:根据区域的相对位置对区域进行排序。
图形输入参数:Regions:输入区域;
图形输出参数:SortedRegions:排完序的输出区域;
控制输入参数1:SortMode:排序的种类;
控制输入参数2:Order:升序排列或降序排列;
控制输入参数3:RowOrCol:按行或按列进行排序。
(10) read_ocr_class_mlp( : : FileName : OCRHandle)
功能:从文件中读取OCR分类器模型。
控制输入参数:FileName:文件路径+文件名;
控制输出参数:OCRHandl:OCR分类器句柄。
(11) do_ocr_multi_class_mlp(Character, Image : : OCRHandle : Class, Confidence)
功能:使用OCR分类器对多个字符进行分类。
使用OCR分类器对多个字符进行分类。
图形输入参数1:Character:待识别的字符区域;
图形输入参数2:Image:待识别字符的灰度图像;
控制输入参数:OCRHandle:OCR分类器句柄;
控制输出参数1:Class:字符的分类结果;
控制输出参数2:Confidence:字符类别的置信度。
1.3 应用示例示例代码
*读取图片
read_image (CD_Image, './cd_print.png')
*获取图像的宽高
get_image_size (CD_Image, Width, Height)
*均值滤波
mean_image (CD_Image, ImageMean, 51, 51)
*动态阈值分割
dyn_threshold (CD_Image, ImageMean, RegionDynThresh, 15, 'dark')
*填充孔洞
fill_up (RegionDynThresh, RegionFillUp)
*获取区域圆的外轮廓
gen_contour_region_xld (RegionFillUp, ContourBorder, 'border')
*获取拟合圆的圆心和半径
fit_circle_contour_xld (ContourBorder, 'algebraic', -1, 0, 0, 3, 2, CenterRow, CenterColumn, Radius, StartPhi, EndPhi, PointOrder)
*环面的内径与外边界半径之比
AnnulusInner:=0.90
*环面的外径与外边界半径之比
AnnulusOuter:=0.99
*圆周率Pi
Pi := acos(0.0) * 2
*待变换图像的宽度
WithPolar:= 2*Pi*Radius*AnnulusInner
*待变换图像的高度
HeightPolar:= Radius*(AnnulusOuter-AnnulusInner)
RadiusStart:= Radius*AnnulusOuter
RadiusEnd:= Radius*AnnulusInner
AngleStart:= 2*Pi-2*Pi/WithPolar
AngleEnd:= 0
*极坐标变换
polar_trans_image_ext (CD_Image, PolarTransImage, CenterRow, CenterColumn, AngleStart, AngleEnd, RadiusStart, RadiusEnd, WithPolar, HeightPolar, 'bilinear')
*字符宽度与WithPolar之比
CharWidthFraction:=0.01
*字符宽度
CharWidth:=WithPolar*CharWidthFraction
*字符高度
CharHeight:=CharWidth
*均值滤波
mean_image (PolarTransImage, ImageMean1, 2*CharWidth, 2*CharHeight)
*动态阈值分割
dyn_threshold (PolarTransImage, ImageMean1, RegionDynThresh1, 10, 'dark')
*连通区域分析
connection (RegionDynThresh1, ConnectedRegions)
*区域筛选
select_shape (ConnectedRegions, RegionChar, ['height','width','row'], 'and', [CharHeight*0.1,CharWidth*0.3,HeightPolar*0.25], [CharHeight*1.1,CharWidth*1.1,HeightPolar*0.75])
*区域分类
sort_region (RegionChar, RegionCharSort, 'character', 'true', 'row')
read_ocr_class_mlp ('./Industrial_Rej.omc', OCRHandle)
do_ocr_multi_class_mlp (RegionCharSort, PolarTransImage, OCRHandle, Class,Confidence)
SNString:=sum(Class)
polar_trans_region_inv (RegionCharSort, XYTransRegion, CenterRow, CenterColumn, AngleStart, AngleEnd, RadiusStart, RadiusEnd, WithPolar, HeightPolar,Width,Height, 'nearest_neighbor')
dev_close_window ()
dev_open_window (0, 0, Width,Height, 'black', WindowID)
set_display_font (WindowID, 16, 'mono', 'true', 'false')
dev_display (CD_Image)
dev_display (XYTransRegion)
disp_message (WindowID, SNString, 'image', 80, 80, 'green', 'false')
结果展示: