zoukankan      html  css  js  c++  java
  • Halcon中将16位的图像转化为8位的图像

     

    Halcon中Image有多种像素表示方式,这方面网上找到的资料比较少,有一张大恒图像培训的文档中提到过,感觉描述比较准确:

    里面有四种类型比较类似:uint2、int1、int2、int4

    区分起来很简单,带1表示8位,带2表示16位,带4表示32位,带u表示无符号(即无“负号”这种符号)

     

    我用Photoshop生成一张0-255黑白渐变的黑白bmp图片(尺寸256*256),如下:

     

    下面我想探究一下,看这几种不同的图像格式各自的灰度取值范围是多少。

    1 read_image (Image, '8bit.bmp')                // byte: 0-255
    2 
    3 *转换格式观察
    4 convert_image_type(Image,Image_int1,'int1')   // 0-127
    5 convert_image_type(Image,Image_direction,'direction')   // 0-179、255

     

    通过convert_image_type转换为“int1”、“direction”格式时,图片发生了很大变化(如上图所示)。而转换为其他格式时,图像样子基本与原图(byte格式)差异不大,这是为什么呢?

     

    因为“int1”是8位有符号数,如果类比计算机科学的话,取值范围应该是-128-127,显然无法兼容灰度范围在0-255的byte类型图像。“direction”应该也是类似原因。

    而其他的“uint2”、“int2”、“int4”等,取值范围都不比“byte”小,因此能兼容“byte”格式的图片,所以转换以后,图像没有发生什么变化。

     

    一般来说,从相机取出的图像通常都是8位的bmp图像,或者16位的bmp图像,它们对应Halcon中的格式分别是“byte”(8bits无符号)和“uint2”(16bits无符号)

     

    16位的图像虽然在Halcon中也能处理,但是用起来还是不太顺手,并且有部分算子不兼容16位图像(比如执行以后得不到预计中的结果)。并且16位的图像在上位机软件中处理、显示可能也会遇到兼容性问题,所以经常有将16位图像转为8位图像的需求。

     

    相机取出的16位图像的灰度范围一般是0-65535,如果将这种16位图像直接通过convert_image_type转换为“byte”、“int1”、“direction”格式时,通常都会变成“全白”的一张图,因为容纳不了那么高的灰度值,超出范围的灰度色阶会被截断

    为了适应“byte”类型,一般情况下先调用scale_image算子对灰度值进行映射转换(映射到0-255范围内),然后再用convert_image_type算子进行转换。

    通过使用scale_image算子对图像灰度值进行缩放映射。scale_image使用以下公式计算:


    GMax和GMin可以通过min_max_gray算子计算。

    代码如下:(由于博客园不支持tif图像,16位的tif就更不用说了,所以这里就不放原图Image了)

     1 dev_set_draw ('margin')
     2 read_image (Image, '0.tif')
     3 
     4 *如果16位图像非常暗的话,建议在这一步进行提亮,因为后面8位图像大幅度提亮易造成色阶断裂,出现不连续的像素块
     5 * scale_image (Image, Image, 25, 0)
     6 
     7 get_domain (Image, rectangle)
     8 * 获取全图中像素灰度值的最大和最小值
     9 min_max_gray(rectangle, Image, 0, Min, Max,range)
    10 
    11 *将16位图的灰度值映射到0-255上
    12 Mult := 255.0 / (Max - Min)
    13 Add := -Mult * Min
    14 scale_image (Image, Image_scaled, Mult, Add)
    15 
    16 * 转换为'byte'类型
    17 convert_image_type (Image_scaled, ImageConverted, 'byte')
    18 
    19 *如果转换以后图像整体对比度太低的话,可以提高对比度(这里是对8位图像处理)
    20 Min := 20
    21 Max := 160
    22 Mult := 255.0 / (Max - Min)
    23 Add := -Mult * Min
    24 scale_image (ImageConverted, ImageConverted_scaled, Mult, Add)

    至于8位转为16位,以及彩色图像中8位和16位的互相转换,这里就暂不分析了,感兴趣的可以看一下第三篇参考资料文章。(注意参考资料中的内容仅供参考,其中是有一些讹误的。)

    参考资料:

    halcon中Image的像素类型
    11-Halcon视觉学习实例入门:图像类型转换及图像灰度值缩放

    halcon 16bit与8bit图像数据相互转换

  • 相关阅读:
    java 基本数据类型的取值范围
    警惕自增的陷阱
    三元操作符的类型务必一致
    不要随便设置随机种子
    优先使用整形池
    IN、ANY、ALL与SOME
    第六章-序列:字符串、列表和元组 笔记
    第十二章-安全性
    第五章-数字 课后答案
    第十一章-约束、视图与事务
  • 原文地址:https://www.cnblogs.com/xh6300/p/12107990.html
Copyright © 2011-2022 走看看