【问题标题】:what is this : uint8((double(weather1618) ./ maxv) .* 50);?这是什么:uint8((double(weather1618) ./ maxv) .* 50);?
【发布时间】:2017-05-06 22:18:43
【问题描述】:

这段代码(几乎)可以满足我的要求,但我不明白它怎么会这么简单。那么有人可以解释一下这段代码是如何工作的吗?

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

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

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

如果我直接做的话,

 image(weather1618);

我只会得到一张蓝色的图像。

【问题讨论】:

  • class(weather1618) 返回什么?
  • 如果该行唯一要做的就是为image 准备数据,那么您可以将其完全替换为imshow(weather1618,[])imagesc(weather1618)
  • @codeaviator 'double'

标签: arrays image matlab matlab-figure uint8t


【解决方案1】:

这段代码(几乎)可以满足我的需求,但我不明白它是如何做到的 就这么简单。所以有人可以请解释一下这段代码是怎么回事 有效吗?

请注意,此类问题一般为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 中,双精度数可以表示从 -1.79769e+308 到 -2.22507e-308 的负值和从 2.22507e-308 到 1.79769e+308 的正值 (source)。进行此转换的可能原因是避免在第 2 步中出现integer division(接下来解释)。
  2. ./ maxv 将矩阵的每个元素除以 -30。这将翻转矩阵中每个元素的符号,并将数据缩放 1/30 倍。由于上一步将矩阵转换为double,除法后得到的数组也将是double类型,并且会包含十进制数。
  3. .* 50 将矩阵的每个元素乘以 50。这会将数据缩放 50 倍。乘法后获得的数组将继续为 double 类型,和以前一样。
  4. uint8(...) 将矩阵从 double 类型转换为 uint8 类型 (unsigned integer),因此矩阵的值现在将介于 0 到 255 之间。

第二行代码:

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.

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

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

因为uint8可以存储的最大值是255,所以任何大于255的值都会被截断为255。这就是为什么乘以100、500和1000根本没有区别,因为得到的值都超过了255 .

【讨论】:

  • 哇!我觉得我学到了很多!感谢您抽出宝贵时间向我解释清楚! :D
猜你喜欢
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 2017-09-16
  • 2019-11-26
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多