这段代码(差不多)做了我想要的但我不明白它是如何做到的那么简单。那么有人可以解释一下这段代码是如何工作的吗?
FIY,weather1618是一个384x384阵列,范围从-76到-30。而且maxv的值为-30。
mapped_array = uint8((double(weather1618) ./ maxv) .* 50);
image(mapped_array);
为什么。* 50。* 100会给出不同的图像,但是。* 100。* 500。* 1000是相同的?
如果我是直接做的,
image(weather1618);
我只会得到一张蓝色图片。
答案 0 :(得分:3)
这段代码(几乎)做了我想要的但我不明白它是怎么做的 就这么简单。那么有人可以解释一下这段代码是怎么回事 作品?
请注意,此类问题通常为not the best fit for Stack Overflow。但是,由于您已经缩小了您不理解的代码行,我将向您解释。
你提到过:
FIY,
weather1618
是一个384x384阵列,范围从-76到-30。maxv
的值为-30。
第一行代码:
mapped_array = uint8((double(weather1618) ./ maxv) .* 50);
调用以下函数/运算符:
发生了什么:
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(接下来解释)。./ maxv
将矩阵的每个元素除以-30。这将翻转矩阵中每个元素的符号,并将数据缩放1/30倍。由于矩阵在前一步骤中被转换为double,因此在除法后得到的数组也将是double类型,并且它将包含十进制数。.* 50
将矩阵的每个元素乘以50.这会将数据缩放50倍。乘法后获得的数组将继续为double类型,如前所述。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。