uint8和单个图像有什么区别?

时间:2019-07-17 07:54:59

标签: matlab image-processing image-scaling unsigned-integer single-precision

我已经知道uint8包含0到255之间的强度值(2 8 -1),单个包含0到1之间的强度值,它用于保存较大的值而不会影响范围错误。但是,除此之外,还有其他区别吗?

imagesc((I/64)*64)imagesc((Is/64)*64)有什么区别,其中Iuint8,而Issingle

2 个答案:

答案 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以确保所有值都是整数。例如,如果roundX64类型的索引图像数据,则使用以下命令将其转换为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。