Matlab函数陷阱
2016-07-05 11:03
656 查看
一、uint8()和im2uint8()的区别
1.uint8()函数
输入 edit uint8,查看函数解释。
% Values outside this range saturate on overflow, namely they are mapped
% to 0 or 255 if they are outside the range.
从解释中可以看出,如果数据值超出0~255的范围,那么小于0的值将变为0,大于255的值将变为255。
2.im2uint8()函数
输入 edit im2uint8,查看函数源码。
这里以对int16类型的数据进行变换为例,说明im2uint8()的原理。
因为int16数据类型的范围是-32768~32767,所以,在转换时先将所有数值+32768,然后再将0~65535范围线性变换到0~255范围(double(z)*255/65535也就是源码中的double(z)*1/257)。
结论:uint8()对数据进行有损压缩,im2uint8()是进行的线性压缩,损失很小。
二、length()函数使用需谨慎
help length
Length of largest array dimension.
函数返回值为矩阵行数和列数的最大值,并不是固定方向的数值。为了安全起见,不要使用length函数,用size()函数代替。
size(array,1)表示计算矩阵的行数,size(array,2)表示计算矩阵的列数。不会产生歧义。
1.uint8()函数
输入 edit uint8,查看函数解释。
% Values outside this range saturate on overflow, namely they are mapped
% to 0 or 255 if they are outside the range.
从解释中可以看出,如果数据值超出0~255的范围,那么小于0的值将变为0,大于255的值将变为255。
2.im2uint8()函数
输入 edit im2uint8,查看函数源码。
这里以对int16类型的数据进行变换为例,说明im2uint8()的原理。
if strcmp(classImg, 'int16') z = uint16(int32(img) + 32768); u = uint8(double(z)*1/257); end
因为int16数据类型的范围是-32768~32767,所以,在转换时先将所有数值+32768,然后再将0~65535范围线性变换到0~255范围(double(z)*255/65535也就是源码中的double(z)*1/257)。
结论:uint8()对数据进行有损压缩,im2uint8()是进行的线性压缩,损失很小。
二、length()函数使用需谨慎
help length
Length of largest array dimension.
函数返回值为矩阵行数和列数的最大值,并不是固定方向的数值。为了安全起见,不要使用length函数,用size()函数代替。
size(array,1)表示计算矩阵的行数,size(array,2)表示计算矩阵的列数。不会产生歧义。
相关文章推荐
- 解析在main函数之前调用函数以及对设计的作用详解
- 详解Matlab中 sort 函数用法
- java和matlab画多边形闭合折线图示例讲解
- C#调用Matlab生成的dll方法的详细说明
- 简述Matlab中size()函数的用法
- 从java中调用matlab详细介绍
- 稀疏自动编码器 (Sparse Autoencoder)
- 详解Matlab中 sort 函数用法
- 简述Matlab中size()函数的用法
- VC++与Matlab混合编程的快速实现
- Matlab 矩阵运算
- matlab与opencv部分函数的对照
- matlab神经网络工具箱创建神经网络
- Matlab
- MATLAB 入门教程
- matlab函数_连通区域
- MATLAB中函数模式和命令模式的区别
- MATLAB 添加自定义的模块到simulink库浏览器
- Export Figures for LaTeX Writing