Arrays 这是什么:uint8((双(weather1618)。/maxv)。*50);?
这段代码(几乎)满足了我的要求,但我不明白它怎么会这么简单。有人能解释一下这个代码是怎么工作的吗 FIY,weather1618是一个384x384阵列,范围从-76到-30。maxv的值为-30Arrays 这是什么:uint8((双(weather1618)。/maxv)。*50);?,arrays,image,matlab,matlab-figure,uint8t,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是相同的 如果我直接做的话 image(weather1618
mapped_array = uint8((double(weather1618) ./ maxv) .* 50);
image(mapped_array);
为什么.*50.*100给出不同的图像,而.*100.*500.*1000是相同的
如果我直接做的话
image(weather1618);
image(weather1618);
我只会得到一张蓝色的照片
这段代码(几乎)实现了我想要的功能,但我不明白它是如何实现的
就这么简单。有人能解释一下这个代码是怎么写的吗
工作
请注意,这类问题通常是。但是,由于您已经缩小了不理解的代码行,我将向您解释
你提到:
FIY,weather1618
是一个384x384阵列,范围从-76到-30。
而maxv
的值为-30
mapped_array = uint8((double(weather1618) ./ maxv) .* 50);
image(mapped_array);
第一行代码:
mapped_array = uint8((double(weather1618) ./ maxv) .* 50);
image(mapped_array);
调用以下函数/运算符:
- (功能)-转换为双精度
- (运算符)-按元素划分
- (运算符)-按元素乘法
- (函数)-转换为8位无符号整数
double(weather1618)
将weather1618
矩阵转换为,因此矩阵的值现在是十进制数。在MATLAB中,对于负值,double可以表示从-1.79769e+308到-2.22507e-308的数字,对于正值,double可以表示从2.22507e-308到1.79769e+308的数字()。进行此转换的可能原因是为了避免在步骤2中出现错误(下面解释)/maxv
将矩阵的每个元素除以-30。这将翻转矩阵中每个元素的符号,并将数据缩放1/30倍。由于矩阵在上一步中转换为double,因此除法后获得的数组也将是double类型,并且它将包含十进制数*50
将矩阵的每个元素乘以50。这将按50倍的比例缩放数据。乘法后获得的数组将继续是double类型,与前面一样uint8(…)
将矩阵的类型从double转换为uint8(),因此矩阵的值现在将在0到255之间mapped_array = uint8((double(weather1618) ./ maxv) .* 50);
image(mapped_array);
调用函数以显示在步骤4中获得的阵列的图像
如果我直接做的话
image(weather1618);
image(weather1618);
我只会得到一张蓝色的照片
好发现!之所以只看到蓝色图像,是因为默认情况下,图像
功能不使用中的全部颜色范围,因此即使图像中有信息,也无法区分它,因为它不是使用全部颜色范围显示的。另一方面,该函数默认使用全部颜色范围
看看我做的这个例子:
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
这段代码(几乎)实现了我想要的功能,但我不明白它是如何实现的
就这么简单。有人能解释一下这个代码是怎么写的吗
工作
请注意,这类问题通常是。但是,由于您已经缩小了不理解的代码行,我将向您解释
你提到:
FIY,weather1618
是一个384x384阵列,范围从-76到-30。
而maxv
的值为-30
mapped_array = uint8((double(weather1618) ./ maxv) .* 50);
image(mapped_array);
第一行代码:
mapped_array = uint8((double(weather1618) ./ maxv) .* 50);
image(mapped_array);
调用以下函数/运算符:
- (功能)-转换为双精度
- (运算符)-按元素划分
- (运算符)-按元素乘法
- (函数)-转换为8位无符号整数
double(weather1618)
将weather1618
矩阵转换为,因此矩阵的值现在是十进制数。在MATLAB中,对于负值,double可以表示从-1.79769e+308到-2.22507e-308的数字,对于正值,double可以表示从2.22507e-308到1.79769e+308的数字()。进行此转换的可能原因是为了避免在步骤2中出现错误(下面解释)/maxv
将矩阵的每个元素除以-30。这将翻转矩阵中每个元素的符号,并将数据缩放1/30倍。由于矩阵在上一步中转换为double,因此除法后获得的数组也将是double类型,并且它将包含十进制数*50
将矩阵的每个元素乘以50。这将按50倍的比例缩放数据。乘法后获得的数组将继续是double类型,与前面一样uint8(…)
将矩阵的类型从double转换为uint8(),因此矩阵的值现在将在0到255之间mapped_array = uint8((double(weather1618) ./ maxv) .* 50);
image(mapped_array);
调用函数以显示在步骤4中获得的阵列的图像
如果我直接做的话
image(weather1618);
image(weather1618);
我只会得到一张蓝色的照片
好发现!之所以只看到蓝色图像,是因为默认情况下,图像
功能不使用中的全部颜色范围,因此即使图像中有信息,也无法区分它,因为它不是使用全部颜色范围显示的。另一方面,该函数使用完整的r