大家好,又见面了,我是你们的朋友全栈君。
在一个驱动程序中看到uint16,uint32,unit8,int8…
uint16 :无符号16bit整数,
uint32:无符号32bit整数,
unit8:无符号8bit整数,
int8:有符号8bit整数。
其作用是程序更加简洁,增强可移植性和可维护性,尤其是在16位机器,32位,或者是64位机器上相互之间移植的时候只需要修改这些宏定义就可以满足要求了,而不需要去修改整个工程里边的每一个变量定义。
在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?很多人有这样的疑问。论坛上就有人问:以*_t结尾的类型是不是都是long型的?在baidu上查一下,才找到答案,这时才发觉原来自己对C掌握的太少。
那么_t的意思到底表示什么?具体的官方答案没有找到,不过我觉得有个答案比较接近。它就是一个结构的标注,可以理解为type/typedef的缩写,表示它是通过typedef定义的,而不是其它数据类型。
uint8_t,uint16_t,uint32_t等都不是什么新的数据类型,它们只是使用typedef给类型起的别名,新瓶装老酒的把戏。不过,不要小看了typedef,它对于你代码的维护会有很好的作用。比如C中没有bool,于是在一个软件中,一些程序员使用int,一些程序员使用short,会比较混乱,最好就是用一个typedef来定义,如:
typedef char bool。
一般来说,一个C的工程中一定要做一些这方面的工作,因为你会涉及到跨平台,不同的平台会有不同的字长,所以利用预编译和typedef可以让你最有效的维护你的代码。为了用户的方便,C99标准的C语言硬件为我们定义了这些类型,我们放心使用就可以了。
matlab图像处理关于unit8的问题
为了节省存储空间,matlab为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称作8位图像。
imread把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中。
因此,matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。所以要先将图像转为double格式的才能运算,
I2=im2double(I1) %把图像I1转换成double精度类型 (假设图形矩阵范围0~255)
或者
I64=double(I8)/255; %uint转换成double
如果不转换,计算会产生溢出。
matlab unit8是什么类型的数据?
写错了吧,应该是uint8,表示变量是无符号整数,范围是0到255.
uint8是指0~2^8-1 = 255数据类型,一般在图像处理中很常见。
matlab 中如何将unit8转成double型
在矩阵中使用的数据类型是double。因此可以通过语句I2=im2double(I1) ;把图像数组I1转换成double精度类型;如果不转换,在对uint8进行加减时会产生溢出,可能提示的错误为:Function ‘*’ is not defined for values of class ‘uint8’
再给你几条语句,希望对你有帮助:
im2double():将图像数组转换成double精度类型
im2uint8():将图像数组转换成unit8类型
im2uint16():将图像数组转换成unit16类型
matlab unit8格式
代表无符号的8位整数,最大值为255。
MATLAB支持的数据类型有:
double — Double precision floating point numeric array
logical — Logical array
char — Character array
single — Single precision floating-point numeric array
float — Double or single precision floating-point numeric array
int8 — 8-bit signed integer array
int16 — 16-bit signed integer array
int32 — 32-bit signed integer array
uint32 — 32-bit unsigned integer array
int64 — 64-bit signed integer array
integer — An array of any of the 8 integer classes above
numeric — Integer or floating-point array
cell — Cell array
struct — Structure array
function_handle Function handle
‘class_name’ Custom MATLAB object class or Java class
matlab中如何将unit8转换为double
内存不足,说明你的数据量太大了,一个double是8字节,值uint8的8倍。
试试single看看,single是double的一半内存。
要是还内存不够,除非你改算法;或者用64bit的matlab试试。
matlab数据类型转换——int8转换成unit8
最简单的方法是把I改为double型后做 128计算再转为uint8。
即
I=double(I) 128;
I=uint8(I);
当然你也可逐点遍历I,以求得新的一个unit8矩阵J,通过判断正负给该点J(i,j)赋值:
若I(i,j)>=0时:J(i,j)=128 uint8(I(i,j));
若I(i,j)<0时, J(i,j)=128-uint8(abs(I(i,j)));
但需要说明的是matlab中循环的效率不及矩阵直接运算的高。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/192490.html原文链接:https://javaforall.cn