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

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

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

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

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

 read_image (Image, '8bit.bmp')                // byte: 0-255

 *转换格式观察
convert_image_type(Image,Image_int1,'int1') // 0-127
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了)

 dev_set_draw ('margin')
read_image (Image, '0.tif') *如果16位图像非常暗的话,建议在这一步进行提亮,因为后面8位图像大幅度提亮易造成色阶断裂,出现不连续的像素块
* scale_image (Image, Image, , ) get_domain (Image, rectangle)
* 获取全图中像素灰度值的最大和最小值
min_max_gray(rectangle, Image, , Min, Max,range)

*将16位图的灰度值映射到0-255上
Mult := 255.0 / (Max - Min)
Add := -Mult * Min
scale_image (Image, Image_scaled, Mult, Add) * 转换为'byte'类型
convert_image_type (Image_scaled, ImageConverted, 'byte') *如果转换以后图像整体对比度太低的话,可以提高对比度(这里是对8位图像处理)
Min :=
Max :=
Mult := 255.0 / (Max - Min)
Add := -Mult * Min
scale_image (ImageConverted, ImageConverted_scaled, Mult, Add)

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

参考资料:

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

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

Halcon中将16位的图像转化为8位的图像的更多相关文章

  1. 16位的MD5加密和32位MD5加密的区别

    16位的MD5加密和32位MD5加密的区别 MD5加密后所得到的通常是32位的编码,而在不少地方会用到16位的编码它们有什么区别呢?16位加密就是从32位MD5散列中把中间16位提取出来!其实破解16 ...

  2. RGB格式图像转化为HSV格式

    注:在阴影检测算法中经常需要将RGB格式的图像转化为HSV格式,对于阴影区域而言,它的色度和饱和度相对于原图像而言变化不大,主要是亮度信息变化较大,,将RGB格式转化为HSV格式,就可以得到H.S.V ...

  3. IP地址转化为32位无符号数

    转自 http://blog.csdn.net/testcs_dn/article/details/38585719 一.将ip地址转成long数值 将IP地址转化成整数的方法如下: 1.通过Stri ...

  4. jsp中/el表达式中将后台传来的时间戳格式化为年月日时分秒

    sp中/el表达式中将后台传来的时间戳格式化为年月日时分秒1.引入相关标签库 <%@taglib prefix="c" uri="http://java.sun.c ...

  5. DICOM图像转出为bmp格式图像方法(matlab程序实现)

    在matlab中用dicomread读取dicom文件后,生成一个MxN矩阵(对应图像像素个数),每个像素灰度数据是int16格式 但是bmp图像灰度是int8格式的(灰度范围0~255),所以若想把 ...

  6. [ActionScript 3.0] AS3.0 将图像的Alpha通道转换为黑白图像(分离ARGB方式)

    import flash.display.BitmapData; import flash.display.Bitmap; /** * 将图像的Alpha通道转换为黑白图像(分离ARGB方式) */ ...

  7. VirtualBox没有64位选项,无法安装64位的解决方法(zhuan)

    http://www.askmaclean.com/archives/vbox-virtualbox-64-bit.html ************************************* ...

  8. Java移位运算符详解实例——左移位运算符>>、带符号的右移位运算符>>

    移位运算符也针对二进制的“位”,它主要包括:左移位运算符(<<).右移位运算符(>>>).带符号的右移位运算符(>>). 1.左移运算符左移运算符用“< ...

  9. 64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多?(一)

    前言: cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设计.64位操作系统针对的64位的CPU设计.操 ...

随机推荐

  1. spring boot 实战教程

    二八法则 - get more with less Java.spring经过多年的发展,各种技术纷繁芜杂,初学者往往不知道该从何下手.其实开发技术的世界也符合二八法则,80%的场景中只有20%的技术 ...

  2. Bulma CSS - 响应式

    Bulma CSS框架教程 Bulma CSS – 简介 Bulma CSS – 开始 Bulma CSS – CSS类 Bulma CSS – 模块化 Bulma CSS – 响应式 Bulma是一 ...

  3. vue学习(七)refs的使用

    ref的使用只有在特殊的情况下使用 1.如果给标签添加ref,获取的就是真实的DOM节点2. 如果给子组件添加ref,获取的就是当前的子组件对象 例子: <div id="app&qu ...

  4. 启用sql日志

    SHOW VARIABLES LIKE "general_log%"; -- 查询是否启用日志 SET GLOBAL general_log = 'ON';  -- 设置启用 SE ...

  5. Android_03android拨号软件

    今日开发了一个简单的安卓拨号软件. 步骤如下: 1.先构建用户界面 2.写java代码获取控件 3.进行逻辑的控制 4.添加权限 1.构建用户界面 2.点进R.java文件会发现系统已经自动生成索引, ...

  6. ES6中字符串的新增方法梳理

    1.String.fromCodePoint(); String,fromCodePoint()方法可以认为是对String.fromCharCode()方法的扩展,这两个方法的共同点在于都是用于Un ...

  7. RFX2401C与RFX2402E的区别

    随着科技的发展,射频设备也慢慢的普及,射频放大器在射频设备中起着非常重要的作用.为了能获得足够大的距离,必须都要外加射频信号放大器. 射频信号放大器简称 “PA”.PA主流应用主要有ZigBee .无 ...

  8. 深入理解java虚拟机第五部分高效并发

    volatile是java虚拟机提供最轻量级的同步机制. volatile两个特性:1,保证同步的变量对所有线程是可见的.虽然对所有线程是即时可见的,但是却不保证原子性,也就是不保证线程安全,比如对于 ...

  9. 字符,字符串,int之间互相转换

    字符转换成字符串:String str = String.valueOf(ch); 字符转换成int: int a = ch; 字符串转换成字符:char ch = str.charAt(0); 字符 ...

  10. foreach —(遍历数组或循环中的字符,以获取信息)

    namespace ConsoleApplication2{ class Program {//letter 字母 gigit 数字 symbol 符号 static void Main(string ...