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

三、计算图像的梯度

imgradientxyz的计算结果Gx, Gy, Gz分别对应着column, row, slice方向,而不是row, column, slice方向。

  • https://www.mathworks.com/help/images/ref/imgradientxyz.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值