Halcon real类型TIF与16位PNG相互转换算法

这篇博客详细介绍了如何将TIFF图像转换为PNG格式,并在转换过程中保存和恢复编码信息以确保精度。通过设置特定的标志位、进行图像处理和灰度值转换,博主优化了转换过程,减少了精度损失,最终随机选取点进行对比,精度丢失控制在1um左右。此外,还涉及了图像编码信息的存储和解析,以及转换回TIFF的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

***************
*Tif转PNG
***************
*图片的编码信息
Z_MAX:=[]
Z_MIN:=[]
Z_SCALE:=[]
X_OFFSET:=0
X_SCALE:=1
Y_OFFSET:=0
Y_SCALE:=1
Z_SCALE:=[]
*************
*开始tif转PNG
read_image (InputImage, 'D:/00-halcon程序代码/Tif2PNG/12-03-15-43-20-652.tif')
count_seconds(t1)
get_image_size (InputImage, Width, Height)
**************************************************
*判断的三个标志位;标志位分别为于最后一行28、29、30处
flagRows:=[Height,Height,Height]
flagColumns:=[28,29,30]
flagValue:=[88,28888,58888]
***********************
*获取图像上最低点和最高点
threshold (InputImage, Region, -200, 200)
min_max_gray (Region, InputImage, 0, Z_MIN, Z_MAX, Range)
***********
*Z向放缩系数
SCALE:=65535/Range
*****************
*将图像转为16位图像
gen_image_proto (InputImage, ImageCleared, Z_MIN)
sub_image (InputImage, ImageCleared, ImageSub, SCALE, 0)
convert_image_type (ImageSub, Image2, 'uint2')
**************
*将两张图象融合
gen_image_const (OutImage, 'uint2', Width, Height+1)
gen_rectangle1(Rectangle, 0, 0, Height-1, Width-1)
get_region_points (Rectangle, Rows, Columns)
get_grayval_interpolated (Image2, Rows, Columns, 'bilinear', Grayval)
set_grayval (OutImage, Rows, Columns, Grayval)
************
*存储编码信息
if (Z_MAX<65)
    Z_SCALE:=1000
    Z_MAX:=Z_MAX*Z_SCALE
    Z_MIN:=Z_MIN*Z_SCALE
else
    Z_SCALE:=100
    Z_MAX:=Z_MAX*Z_SCALE
    Z_MIN:=Z_MIN*Z_SCALE
endif
codeRows:=[Height,Height,Height,Height,Height,Height,Height]
codeColumns:=[0,3,7,11,15,19,23]
codeValue:=[X_OFFSET,X_SCALE,Y_OFFSET,Y_SCALE,Z_MIN,Z_MAX,Z_SCALE]
set_grayval (OutImage, codeRows, codeColumns, codeValue)
******************
*三个标志位存储信息
set_grayval (OutImage, flagRows, flagColumns, flagValue)
count_seconds(t2)
time:=t2-t1
*******************************************************
*随机找两个点,对比一下实数型图片转为16位灰度图像素值的误差
Rows1:=[1456,1519]
Columns1:=[1878,1926]
get_grayval (Image2, Rows1, Columns1, Grayval1)
get_grayval (ImageSub, Rows1, Columns1, Grayval2)
write_image (OutImage, 'png', 0, 'D:/00-halcon程序代码/Tif2PNG/test.png')
***************
*PNG转Tif
***************
read_image (InputImage1,'D:/00-halcon程序代码/Tif2PNG/test.png')
**************************************
*根据标志位判断图片是否符合定义的编码格式
get_grayval (InputImage1, flagRows, flagColumns, Grayval3)
if (Grayval3==flagValue)
    ************
    *读取编码信息
    get_grayval (InputImage1, codeRows, codeColumns, codeGrayval)
    ********************************************************
    *将整数数据转为float;转为C#代码可以忽略,因为C#转类型更方便
    tuple_real (codeGrayval, Real)
    ********
    *分项读取
    X_OFFSET1:=Real[0]
    X_SCALE1:=Real[1]
    Y_OFFSET1:=Real[2]
    Y_SCALE1:=Real[3]
    Z_MIN1:=Real[4]
    Z_MAX1:=Real[5]
    Z_SCALE1:=Real[6]
    Z_MAX1:=Z_MAX1/Z_SCALE1
    Z_MIN1:=Z_MIN1/Z_SCALE1
else
    return()
endif
******************************
*将图片最后一行存有编码信息的裁掉
crop_part (InputImage1, ImagePart, 0, 0, Width, Height)
gen_rectangle1 (Rectangle1, 0, 0, Height-1, Width-1)
get_region_points (Rectangle1, Rows2, Columns2)
get_grayval (ImagePart, Rows2, Columns2, Grayval4)
zoomFactor:=65535/(Z_MAX1-Z_MIN1)
Grayval5:=Grayval4/zoomFactor+Z_MIN1
gen_image_const (Image, 'real', Width, Height)
set_grayval (Image, Rows, Columns, Grayval5)
****************************************
*将转后的tif图和原始tif图读一些位置进行对比
*对比看看转换前后的精度丢失情况
testRows:=[1584,1599,192,10]
testColumns:=[1781,1993,1156,145]
get_grayval (InputImage, testRows, testColumns, Grayval6)
get_grayval (Image, testRows, testColumns, Grayval7)

这次在之前博客写的基础上优化而来,提升了转换后对比度,增加了防呆标志位。

 将tif转为PNG后,再将PNG转为tif,随机取点进行前后对比,精度丢失为1um左右

``` dev_update_off() * 参数定义 GaussSize := 3 ScratchLengthMin := 100 StainAreaMin := 100 * 获取图像文件列表 ImageFolder := 'E:/毕业论文/瓶盖图/' list_files(ImageFolder, ['files','follow_links'], ImageFiles) tuple_regexp_select(ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles) * 创建日志文件 open_file('defect_log.txt', 'output', FileHandle) * 主循环 for ImgIndex := 0 to |ImageFiles| - 1 by 1 * 窗口管理 dev_close_window() dev_open_window(0, 0, 600, 400, 'black', WindowHandle) * 文件读取(带异常捕获) try read_image(Image, ImageFiles[ImgIndex]) catch (Exception) write_string(FileHandle, 'Failed:'+ImageFiles[ImgIndex]+'\n') continue endtry get_image_size (Image, Width, Height) GaussSize := min([int(Width/500),int(Height/300),11])*2+1 // 动态核尺寸 dev_open_window (0, 0, 600, 400, 'black', WindowHandle) set_display_font (WindowHandle, 16, 'mono', 'true', 'false') dev_set_draw ('margin') dev_set_line_width (2) * 1. 图像预处理(保留S通道信息) try decompose3 (Image, R, G, B) trans_from_rgb (R, G, B, H, S, V, 'hsv') gauss_filter (S, SFiltered, GaussSize) catch (Exception) disp_message (WindowHandle, '预处理错误', 'window', 12, 12, 'red', 'true') stop() endtry * 2. 瓶盖区域定 binary_threshold (SFiltered, Regions, 'max_separability', 'dark', UsedThreshold) connection (Regions, ConnectedRegions) select_shape(ConnectedRegions, SelectedRegions, ['area','circularity'], 'and', [5000,0.7], [9999999,1.0]) // 添加circularity≥0.7约束 fill_up (SelectedRegions, RegionFillUp) shape_trans (RegionFillUp, CapRegion, 'convex') * 3. 缺陷检测流程 * 3.1 划痕检测 reduce_domain (SFiltered, CapRegion, VReduced) equ_histo_image (VReduced, VEquHist) edges_sub_pix (VEquHist, Edges, 'canny', 0.8, 15, 25) select_shape_xld(Edges, Scratches, ['contlength','width'], 'and', [100,1], [9999,3]) gen_region_contour_xld (Scratches, ScratchesRegion, 'filled') * 3.2 污渍检测 texture_laws(VReduced, TextureEL, 'el', 5, 5) texture_laws(VReduced, TextureLE, 'le', 5, 5) add_image(TextureEL, TextureLE, TextureCombined, 0.5, 0) var_threshold(TextureEL, Stains, 15, 15, 0.15, 1.2, 'dark') // 缩小窗口,降低标准差比例 connection (Stains, ConnectedStains) select_shape (ConnectedStains, SelectedStains, ['area','compactness'], 'and', [100,0.1], [9999,0.7]) * 4. 合并缺陷区域 union2 (ScratchesRegion, SelectedStains, AllDefects) * 5. 后处理 connection (AllDefects, ConnectedDefects) closing_circle(ConnectedDefects, FinalDefects, 1.5) * 6. 结果显示 count_obj (FinalDefects, NumDefects) // 此时NumDefects会被正确初始化 dev_display (Image) dev_set_color ('green') dev_display (CapRegion) if (NumDefects > 0) * 划痕显示(蓝色) dev_set_color ('blue') dev_display (ScratchesRegion) * 污渍显示(紫色) dev_set_color ('magenta') dev_display (SelectedStains) * 添加图例说明 disp_message (WindowHandle, '检测结果:', 'window', 12, 12, 'white', 'true') disp_message (WindowHandle, '蓝色:划痕缺陷', 'window', 40, 12, 'blue', 'true') disp_message (WindowHandle, '紫色:污渍缺陷', 'window', 60, 12, 'magenta', 'true') else disp_message (WindowHandle, '检测通过:无缺陷', 'window', 12, 12, 'green', 'true') endif endfor *主循环结束```加入检测是否印刷模糊、缺失图案
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyond951

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值