这是什么:uint8((double(weather1618)./ maxv)。* 50);?

时间:2017-05-06 22:18:43

标签: arrays image matlab matlab-figure uint8t

这段代码(差不多)做了我想要的但我不明白它是如何做到的那么简单。那么有人可以解释一下这段代码是如何工作的吗?

FIY,weather1618是一个384x384阵列,范围从-76到-30。而且maxv的值为-30。

mapped_array = uint8((double(weather1618) ./ maxv) .* 50);
image(mapped_array);

为什么。* 50。* 100会给出不同的图像,但是。* 100。* 500。* 1000是相同的?

enter image description here

如果我是直接做的,

 image(weather1618);

我只会得到一张蓝色图片。

enter image description here

1 个答案:

答案 0 :(得分:3)

  

这段代码(几乎)做了我想要的但我不明白它是怎么做的   就这么简单。那么有人可以解释一下这段代码是怎么回事   作品?

请注意,此类问题通常为not the best fit for Stack Overflow。但是,由于您已经缩小了您不理解的代码行,我将向您解释。

你提到过:

  

FIY,weather1618是一个384x384阵列,范围从-76到-30。   maxv的值为-30。

第一行代码:

mapped_array = uint8((double(weather1618) ./ maxv) .* 50);

调用以下函数/运算符:

  • double(功能) - 转换为双精度
  • ./(运营商) - 元素划分
  • .*(运算符) - 元素乘法
  • unit8(函数) - 转换为8位无符号整数

发生了什么:

  1. double(weather1618)weather1618矩阵转换为double-precision floating-point format,因此矩阵的值现在是十进制数。在MATLAB中,对于负值,double可以表示-1.79769e + 308到-2.22507e-308的数字,对于正值(source),可以表示从2.22507e-308到1.79769e + 308的数字。执行此转换的可能原因是在步骤2中避免 integer division(接下来解释)。
  2. ./ maxv将矩阵的每个元素除以-30。这将翻转矩阵中每个元素的符号,并将数据缩放1/30倍。由于矩阵在前一步骤中被转换为double,因此在除法后得到的数组也将是double类型,并且它将包含十进制数。
  3. .* 50将矩阵的每个元素乘以50.这会将数据缩放50倍。乘法后获得的数组将继续为double类型,如前所述。
  4. uint8(...)将矩阵从double类型转换为uint8类型(unsigned integer),因此矩阵的值现在将介于0到255之间。
  5. 第二行代码:

    image(mapped_array);
    

    调用image函数显示在步骤4中获得的阵列图像。

      

    如果我是直接做的,

    image(weather1618);
    
         

    我只会得到一张蓝色图片。

    好发现!您只看到蓝色图像的原因是因为默认情况下image功能不使用colormap中的全部颜色,所以即使图像中有信息,也不是可以区分它,因为它没有使用全范围的颜色显示。另一方面,imagesc函数默认使用全范围的颜色。

    看看我做的这个例子:

    img = rand(50);     % Random image with values from 0 to 1.
    
    subplot(1, 2, 1);   % Left plot.
    image(img);         % Display image from array.
    colorbar;           % Colorbar showing color scale.
    
    subplot(1, 2, 2);   % Right plot.
    imagesc(img);       % Display image with scaled colors.
    colorbar;           % Colorbar showing color scale.
    

    image vs imagesc

    它们都是相同的图像,但颜色缩放比例不同(查看颜色栏)。

      

    为什么.*50.*100会给出不同的图像,.*100,   .*500.*1000相同?

    因为uint8可以存储的最大值是255,所以任何大于255的值都将被截断为255.这就是为什么乘以100,500和1000完全没有区别,因为获得的值全部超过255。