我已经知道uint8
包含0到255之间的强度值(2 8 -1),单个包含0到1之间的强度值,它用于保存较大的值而不会影响范围错误。但是,除此之外,还有其他区别吗?
imagesc((I/64)*64)
和imagesc((Is/64)*64)
有什么区别,其中I
是uint8
,而Is
是single
?
答案 0 :(得分:3)
imagesc
只是在下面调用image
。对于image
,如果提供整数或浮点数,则其行为略有不同,可以从image
的文档中了解到:
如果
C
的类型为 double ,则RGB三元组值[0 0 0]
对应黑色,[1 1 1]
对应白色。如果
C
是整数类型,则图像将使用全部数据来确定颜色。例如,如果C
的类型为uint8
,则[0 0 0]
对应于黑色,[255 255 255]
对应于白色。如果CData
的类型为int8
,则[-128 -128 -128]
对应黑色,[127 127 127]
对应白色。...
在数据类型之间转换
要将索引图像数据从整数类型转换为类型
double
,请添加1。例如,如果X8
是类型uint8
的索引图像数据,请将其转换为类型{{ 1}}使用:double
要将索引的图像数据从类型
X64 = double(X8) + 1;
转换为整数类型,请减去1并使用double
以确保所有值都是整数。例如,如果round
是X64
类型的索引图像数据,则使用以下命令将其转换为double
:uint8
要将真彩色图像数据从整数类型转换为
X8 = uint8(round(X64 - 1));
类型,请重新缩放数据。例如,如果double
是类型RGB8
的真彩色图像数据,请使用以下命令将其转换为double:uint8
要将真彩色图像数据从类型
RGB64 = double(RGB8)/255;
转换为整数类型,请重新缩放数据并使用double
以确保所有值都是整数。例如,如果round
是类型RGB64
的图像数据,则使用以下命令将其转换为double
:uint8
答案 1 :(得分:1)
I = uint8(255*rand(1e3));
Is = single(I)/255;
tmpI = (I/64)*64;
tmpIs = (Is/64)*64;
% plot for prosterity
% figure;
% subplot(211)
% imagesc(tmpI)
% subplot(212)
% imagesc(tmpIs)
numel(unique(tmpI(:))) % gives 5
numel(unique(tmpIs(:))) % gives 256
除整数基本上意味着对值进行装箱,然后将数据拉伸回原始扩展以进行绘图。在这种情况下,您将获得256/64 = 4
箱,也为0,因此uint8
图像有5个可能的值。但是,使用single
会保留所有唯一数字,因为精度要高得多。
如果您要对rand
中的元素(数量为2 ^ 52)进行相同的测试,并使用double
,您会发现该元素的数量再次为2 ^ 32倍single
的唯一元素,就像uint16
的{{1}}的唯一元素的数量是2 ^ 8。