二维码质量等级参数
基于ISO/IEC 15415:2011标准,演示ECC200数据代码打印质量等级的示例程序。
该程序调查所有提到的元素,除了整体质量和解码。对于其他六个打印质量元素,程序在几个迭代步骤中调整图像以模拟各种质量。然后为每个迭代步骤计算并显示用于评估打印质量的等级(从最低:0到最高:4)和相应的原始值。
Labels:
* - Overall quality
* - Contrast
* - Modulation
* - Fixed pattern damage
* - Decode
* - Axial non-uniformity
* - Grid non-uniformity
* - Unused error correction
* - Reflectance Margin
* - Print Growth
* - Contrast Uniformity
* - Aperture
*显示设置,进行简短描述
dev_update_off ()
dev_close_window ()
*
read_image (Image, 'datacode/ecc200/ecc200_print_quality_01')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_set_color ('green')
dev_set_line_width (3)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*
Message := 'This program demonstrates the print quality'
Message[1] := 'grades of ECC200 data codes based on the'
Message[2] := 'standard ISO/IEC 15415:2011.'
Message[3] := 'Successively images with various qualities'
Message[4] := 'are generated and the respective print'
Message[5] := 'quality grades queried. The grades are'
Message[6] := 'values from 0 (lowest) to 4 (highest).'
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* Constants for quality grade access
* The grades correpond to the position of the elements in the tuple
*质量等级访问的常量
*等级对应于元组中元素的位置
GRADE_CONTRAST := 1
GRADE_MODULATION := 2
GRADE_FIXED_PATTERN_DAMAGE := 3
GRADE_DECODE := 4
GRADE_AXIAL_NON_UNIFORMITY := 5
GRADE_GRID_NON_UNIFORMITY := 6
GRADE_UNUSED_ERROR_CORRECTION := 7
GRADE_UNUSED_REFECTANCE_MARGIN := 8
GRADE_UNUSED_PRINT_GROWTH := 9
GRADE_UNUSED_CONTRAST_UNIFORMITY := 10
Wait := .5
*
* Create a model of a 2D data code class //创建模型
create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle)
*
* Set the parameters to enhanced recognition mode//设置'enhanced_recognition'参数,提高识别率
set_data_code_2d_param (DataCodeHandle, 'default_parameters', 'enhanced_recognition')
* Get the grade labels of the print quality elements (e.g., 'Contrast')
*获取打印质量元素的等级标签(例如“Contrast”)
get_data_code_2d_results (DataCodeHandle, 'general', 'quality_isoiec15415_labels', Labels)
*
ModuleWidth := 10
1、Contrast——对比度
逐渐降低对比度,对比度越低,等级越低
Contrast: 最小和最大像素强度之间的范围
for Index := 1 to 10 by 1
* Minimize the contrast in each iteration step a little more
* by scaling the gray values of the image
*通过缩放图像的灰度值来最小化每个迭代步骤中的对比度
scale_image (Image, ImageScaled, 1.0 / Index * 1.15, Index * 20 - 50)//灰度缩放
*逐渐降低对比度,识别二维码
* Find the 2d data code symbol in the image with reduced contrast
find_data_code_2d (ImageScaled, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
*
* Get the current grades of assessment of the print quality elements
* and the respective raw values//获得当前印刷质量要素的考核等级和各自的原始值
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality)
get_data_code_2d_results (DataCodeHandle, ResultHandles,'quality_isoiec15415_values', QualityValues)
dev_display (ImageScaled)
dev_display (SymbolXLDs)
*
* Compute and display a message with the current assessment
* grade for contrast and the respective raw value.
*计算并显示带有当前评估等级对比和各自原始值的消息
*显示函数
grade_message_text (Labels, Quality, QualityValues, GRADE_CONTRAST, Message)
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
wait_seconds (Wait)
endfor
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
2、Modulation and Contrast Uniformity——调制和对比度均匀性(一致性)
在同一个条码内,可能既有高对比度又有低对比度的区域(通常是由于墨分布不均)。整个符号的对比度一致性称为调制。
Modulation and Contrast Uniformity:
*调制度量符号内模块振幅的均匀性调制等级高 意味着振幅大,模块分配更好。
*对比度均匀性是在任何模块中发现的最小调制值。
*对比度均匀度是可选参数,不影响整体等级。
*定义一个矩形,在其中模拟图像中的缺陷
gen_rectangle1 (Defect, 160, 220, 320, 335)
*
for Offset := 0 to 110 by 10
* Brighten the image in each iteration step a little more
*在每个迭代步骤中稍微提亮图像
scale_image (Image, ImageScaled, 1, Offset)
dev_display (ImageScaled)
*
* 将增亮图像的域缩小到预定义的矩形,然后将其灰度值绘制到原始图像中。
*这将生成一个包含一个矩形的图像,其中灰度值在每一个迭代步骤中变得越来越亮
reduce_domain (ImageScaled, Defect, ImageReduced)
*将一个图像的灰度值绘制到另一个图像中。
paint_gray (ImageReduced, Image, ImageModulation)
* Find the data code symbols in the generated image//识别二维码
find_data_code_2d (ImageModulation, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
*
* Get the current grades of assessment of the print quality elements
* and the respective raw values//获得当前印品质量要素的评定等级和各自的原始值
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality)
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues)
*
* Display the image with the defect//显示有缺陷的图像
dev_display (ImageModulation)
dev_set_color ('green')
dev_display (SymbolXLDs)
dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'reflectance_margin_module_grades', 'isoiec15415', [], [], [])
set_line_style (WindowHandle, [2,4])
gen_contour_region_xld (Defect, Contours, 'border')
dev_set_color ('red')
dev_display (Contours)
set_line_style (WindowHandle, [])
*
* Compute and display a message with the current assessment
* grade for modulation and the respective raw value.
*计算并显示带有当前调制评估等级和各自原始值的消息。
grade_message_text (Labels, Quality, QualityValues, GRADE_MODULATION, MessageModulation)
*
* Compute and display a message with the current assessment
* grade for contrast uniformity and the respective raw value.
*计算并显示带有对比均匀性的当前评估等级和各自原始值的消息。
grade_message_text (Labels, Quality, QualityValues, GRADE_UNUSED_CONTRAST_UNIFORMITY, MessageContrastUniformity)
dev_disp_text ([MessageModulation,MessageContrastUniformity], 'window', 'top', 'left', 'black', [], [])
wait_seconds (Wait)
endfor
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
3、Fixed Pattern Damage——固定图案损坏
二维码有定位图案(L)及时钟图案(边框交替出现黑色和白色的单元格)等,任何对这些必备元素的障碍都将被视为固定模式的损坏等级。
Fixed Pattern Damage:
*评估固定模式或各自安静区域的退化/损坏,从而描述在图像中定位和识别符号的可靠性
*(1)生成和调查图像与损坏的安静区
for NumModules := 0 to 10 by 1
*
* 首先创建一个平行于坐标轴的矩形,然后将其以灰度值0绘制到图像中,生成一个有受损安静区的图像
gen_rectangle1 (Defect, 388, 171, 398, NumModules * ModuleWidth + 171)
paint_region (Defect, Image, ImageDefect, 0, 'fill')
* Find the data code symbol in the image with damaged quiet zone//识别二维码
find_data_code_2d (ImageDefect, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
* 获得对应值
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality)
get_data_code_2d_results (DataCodeHandle, ResultHandles,'quality_isoiec15415_values', QualityValues)
*
* Display the image with the defect//显示有缺陷的图像
dev_display (ImageDefect)
dev_set_color ('green')
dev_display (SymbolXLDs)
set_line_style (WindowHandle, [2,4])
gen_contour_region_xld (Defect, Contours, 'border')
dev_set_color ('red')
dev_display (Contours)
set_line_style (WindowHandle, [])
dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'bad_modules', 'isoiec15415', [], [], [])
*
grade_message_text (Labels, Quality, QualityValues, GRADE_FIXED_PATTERN_DAMAGE, Message)
Message[1] := 'Damaged quiet zone'
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
wait_seconds (Wait)
endfor
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
(2)生成并研究在查找器模式的L型处有损坏的图像
for NumModules := 0 to 10 by 1
*
* 通过首先在查找器模式处创建水平矩形,然后将其以灰度值0绘制到图像中,生成具有查找器模式损坏的l型图像
gen_rectangle1 (Defect, 375, 171, 385, NumModules * ModuleWidth + 171)
paint_region (Defect, Image, ImageDefect, 255, 'fill')
* Find the data code in the image with damaged finder pattern
find_data_code_2d (ImageDefect, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
*
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality)
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues)
*
* Display the image with the defect
dev_display (ImageDefect)
dev_set_color ('green')
dev_display (SymbolXLDs)
set_line_style (WindowHandle, [2,4])
gen_contour_region_xld (Defect, Contours, 'border')
dev_set_color ('red')
dev_display (Contours)
set_line_style (WindowHandle, [])
dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'bad_modules', 'isoiec15415', [], [], [])
grade_message_text (Labels, Quality, QualityValues, GRADE_FIXED_PATTERN_DAMAGE, Message)
Message[1] := 'Damaged L-shape of finder pattern'
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
wait_seconds (Wait)
endfor
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
(3)生成并研究在查找器模式交替一侧有损坏的图像
for NumModules := 0 to 10 by 1
*
* 通过首先在交替一侧创建一个垂直的矩形,然后将灰度值为0的矩形绘制到图像中,生成具有查找器模式损坏的交替一侧的图像
gen_rectangle1 (Defect, 226, 376, NumModules * ModuleWidth + 226, 386)
paint_region (Defect, Image, ImageDefect, 255, 'fill')
* Find the data code in the image with damaged alternating side
find_data_code_2d (ImageDefect, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
*
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality)
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues)
*
* Display the image with the defect
dev_display (ImageDefect)
dev_set_color ('green')
dev_display (SymbolXLDs)
set_line_style (WindowHandle, [2,4])
gen_contour_region_xld (Defect, Contours, 'border')
dev_set_color ('red')
dev_display (Contours)
set_line_style (WindowHandle, [])
dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'bad_modules', 'isoiec15415', [], [], [])
grade_message_text (Labels, Quality, QualityValues, GRADE_FIXED_PATTERN_DAMAGE, Message)
Message[1] := 'Damaged alternating side of the\nfinder pattern'
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
wait_seconds (Wait)
endfor
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
4、Axial non-uniformity——轴向不均匀性
测量符号整体宽高比。大多数二维码由单个方块组成,如果这些单元由于太高或太宽看起来更像长方形,那么包含它们的符号在轴向不均匀性方面将会得到很低的评级。
Axial non-uniformity:宽高比的畸变导致轴向不均匀性的退化
IterationIndex := 0
for Scale := 1 to 1.2 by 0.02
*仅通过缩放图像的高度来生成符号纵横比失真的图像
affine_trans_image (Image, ImageDeformed, [Scale,0,(-Scale + 1) * 140,0,1,0], 'weighted', 'false')//对图像应用仿射二维变换
* Find the data code in the image with distorted aspect ratio//识别二维码
find_data_code_2d (ImageDeformed, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
*
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality)
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues)
*
* Display the image with the distortion
dev_display (ImageDeformed)
dev_set_color ('green')
dev_set_line_width (2)
dev_display (SymbolXLDs)
dev_set_line_width (1)
dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'grid', 'isoiec15415', [], [], [])
*
grade_message_text (Labels, Quality, QualityValues, GRADE_AXIAL_NON_UNIFORMITY, Message)
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
wait_seconds (Wait)
endfor
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
5、Grid non-uniformity——网格不均匀性
测量网格交叉点与理想位置的最大适量偏差,即符号的斜向拉伸程度
Grid non-uniformity:
除了仿射畸变,透视或其他畸变也会降低网格的非均匀性质量。
for Diff := 0 to 4 by 1
R := [40,40,210,210]
C := [30,200,200,30]
R2 := R + [0,0,Diff,0]
C2 := C + [0,0,Diff,0]
*
* 通过对计算出的变换矩阵的图像应用射影变换,生成一个模块偏离其理想网格的图像(对于每个迭代增加偏差)。
*利用给定的点对应关系计算一个射影变换矩阵
vector_to_proj_hom_mat2d (R, C, R2, C2, 'normalized_dlt', [], [], [], [], [], [], HomMat2D, Covariance)
*对图像应用射影变换
projective_trans_image (Image, ImageDeformed, HomMat2D, 'bilinear', 'false', 'false')
* 识别二维码
find_data_code_2d (ImageDeformed, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
*
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality)
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues)
*
* Display the image with the distortio
dev_display (ImageDeformed)
dev_set_color ('green')
dev_set_line_width (2)
dev_display (SymbolXLDs)
dev_set_line_width (1)
dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'grid', 'isoiec15415', [], [], [])
*
grade_message_text (Labels, Quality, QualityValues, GRADE_GRID_NON_UNIFORMITY, Message)
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
wait_seconds (Wait)
endfor
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
6、Unused error correction——未使用纠错
Unused error correction:
尚未使用的纠错容量反映了解码过程的可靠性
for NumModules := 1 to 18 by 1
*
* for NumModules := 1 to 18 by 1
*
* 通过在图像内部创建一个白色矩形,为每次迭代生成一个具有更多缺陷的图像,这样在每次迭代中未使用的错误修正量就会减少。
gen_rectangle1 (Defect, 270, 171, 310, NumModules * ModuleWidth + 171)
paint_region (Defect, Image, ImageDefect, 255, 'fill')
*
find_data_code_2d (ImageDefect, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
*
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality)
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues)
*
dev_display (ImageDefect)
dev_set_color ('green')
dev_set_line_width (2)
dev_display (SymbolXLDs)
set_line_style (WindowHandle, [2,4])
gen_contour_region_xld (Defect, Contours, 'border')
dev_set_color ('red')
dev_display (Contours)
set_line_style (WindowHandle, [])
dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'bad_modules', 'isoiec15415', [], [], [])
*
grade_message_text (Labels, Quality, QualityValues, GRADE_UNUSED_ERROR_CORRECTION, Message)
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
wait_seconds (Wait)
endfor
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
7、Print Growth——印刷增长(打印单元格增大):
度量模块是否在标称大小的基础上增长或缩小
Print Growth:
for Erosion := 1 to 17 by 2
* 在每个迭代步骤中稍微削弱图像
zoom_image_factor (Image, ImageZoomed, 4, 4, 'bilinear')//按给定因子缩放图像
*确定所选掩码内的最小灰度值
gray_erosion_shape (ImageZoomed, ImageZoomedErosion, Erosion, Erosion, 'octagon')
zoom_image_factor (ImageZoomedErosion, ImageErosion, 0.25, 0.25, 'bilinear')
dev_display (ImageErosion)
* 识别二维码
find_data_code_2d (ImageErosion, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
*
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality)
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues)
dev_set_color ('green')
dev_display (SymbolXLDs)
*
grade_message_text (Labels, Quality, QualityValues, GRADE_UNUSED_PRINT_GROWTH, Message)
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
wait_seconds (Wait)
endfor
*
for Dilation := 1 to 17 by 2
* 在每个迭代步骤中稍微扩大图像
zoom_image_factor (Image, ImageZoomed, 4, 4, 'bilinear')
gray_dilation_shape (ImageZoomed, ImageZoomedDilation, Dilation, Dilation, 'octagon')
zoom_image_factor (ImageZoomedDilation, ImageDilation, 0.25, 0.25, 'bilinear')
dev_display (ImageDilation)
*
find_data_code_2d (ImageDilation, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
*
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality)
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues)
dev_set_color ('green')
dev_display (SymbolXLDs)
*
grade_message_text (Labels, Quality, QualityValues, GRADE_UNUSED_PRINT_GROWTH, Message)
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
wait_seconds (Wait)
endfor
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
8、Reflectance Margin——反射率裕度
检查整体亮和暗的全局阈值,并确定亮或暗符号将如何正确识别的可能性。它不衡量强度差异,而是衡量对比度问题(或反射在代码表面的光线问题)会导致错误的可能性。
Reflectance Margin:
测量每个模块如何正确区分为亮和暗
*低反射率边际等级增加了模块被错误识别的概率。
*定义一个模仿图像缺陷的矩形
gen_rectangle1 (Defect, 160, 220, 320, 335)
*
for Offset := 50 to 90 by 6
* 在每个迭代步骤中稍微提亮图像
scale_image (Image, ImageScaled, 1, Offset)
dev_display (ImageScaled)
*
* 将增亮图像的域缩小到预定义的矩形,然后将其灰度值绘制到原始图像中。这将生成一个包含一个矩形的图像,其中灰度值随着每一个迭代步骤变得越来越亮。
reduce_domain (ImageScaled, Defect, ImageReduced)
paint_gray (ImageReduced, Image, ImageReflectanceMargin)
*
find_data_code_2d (ImageReflectanceMargin, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
*
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality)
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues)
*
dev_display (ImageReflectanceMargin)
dev_set_color ('green')
dev_display (SymbolXLDs)
set_line_style (WindowHandle, [2,4])
gen_contour_region_xld (Defect, ContoursContrast, 'border')
dev_set_color ('red')
dev_display (ContoursContrast)
set_line_style (WindowHandle, [])
dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'reflectance_margin_module_grades', 'isoiec15415', [], [], [])
*
grade_message_text (Labels, Quality, QualityValues, GRADE_UNUSED_REFECTANCE_MARGIN, Message)
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
wait_seconds (Wait)
endfor
*
for NumModules := 1 to 10 by 1
*
* 通过在图像内部创建一个白色矩形,为每次迭代生成一个具有更多缺陷的图像
gen_rectangle1 (Defect, 270, 171, 310, NumModules * ModuleWidth + 171)
paint_region (Defect, ImageReflectanceMargin, ImageDefect, 255, 'fill')
*
find_data_code_2d (ImageDefect, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
*
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415', Quality)
get_data_code_2d_results (DataCodeHandle, ResultHandles, 'quality_isoiec15415_values', QualityValues)
*
dev_display (ImageDefect)
dev_set_color ('green')
dev_display (SymbolXLDs)
set_line_style (WindowHandle, [2,4])
gen_contour_region_xld (Defect, ContoursDefect, 'border')
dev_set_color ('red')
dev_display (ContoursDefect)
dev_display (ContoursContrast)
set_line_style (WindowHandle, [])
dev_display_data_code_2d_print_quality_results (DataCodeHandle, ResultHandles, 'reflectance_margin_module_grades', 'isoiec15415', [], [], [])
*
grade_message_text (Labels, Quality, QualityValues, GRADE_UNUSED_REFECTANCE_MARGIN, Message)
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
wait_seconds (Wait)
endfor
dev_disp_text (' End of program ', 'window', 'bottom', 'right', 'black', [], [])