Matlab函数陷阱

一、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()的原理。

    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)表示计算矩阵的列数。不会产生歧义。

猜你喜欢

转载自blog.csdn.net/gaohanggaolegao/article/details/51130733