【问题标题】:What is the difference between a uint8 and a single image?uint8 和单个图像有什么区别?
【发布时间】:2019-07-17 07:54:59
【问题描述】:

我已经知道uint8 包含介于 0 和 255 (28-1) 之间的强度值,并且单个包含介于 0 和 1 之间的值,它用于保存更大的值而不会破坏范围误差.但是,除此之外,还有其他区别吗?

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

【问题讨论】:

  • "single 包含 0 到 1 之间的值" - 这是不准确的。 single-precision 变量可能包含小数,但也可以包含整数。您应该阅读有关数字的floating-point representation

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


【解决方案1】:

imagesc 只是在下面调用image。至于image,如果提供整数或浮点数,它的行为会有所不同,这可以从image 的文档中了解到:

如果Cdouble 类型,则[0 0 0] 的RGB 三元组值对应黑色,[1 1 1] 对应白色。

如果C整数 类型,则图像使用全范围数据来确定颜色。例如,如果C 的类型为uint8,则[0 0 0] 对应黑色,[255 255 255] 对应白色。如果CDataint8 类型,则[-128 -128 -128] 对应黑色,[127 127 127] 对应白色。

...

数据类型之间的转换

要将索引图像数据从整数类型转换为double 类型,请加1。例如,如果X8uint8 类型的索引图像数据,则使用以下方法将其转换为double 类型:

X64 = double(X8) + 1;

要将索引图像数据从double 类型转换为整数类型,请减1 并使用round 确保所有值都是整数。例如,如果X64double 类型的索引图像数据,则将其转换为uint8 使用:

X8 = uint8(round(X64 - 1));

要将真彩色图像数据从整数类型转换为double 类型,请重新缩放数据。例如,如果RGB8uint8 类型的真彩色图像数据,则使用以下方法将其转换为双精度:

RGB64 = double(RGB8)/255;

要将真彩色图像数据从double 类型转换为整数类型,请重新缩放数据并使用round 以确保所有值都是整数。例如,如果RGB64double 类型的图像数据,则将其转换为uint8,使用:

RGB8 = uint8(round(RGB64*255));

【讨论】:

    【解决方案2】:
    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 bins,也有 0,因此您的uint8 图像有 5 个可能的值。但是,使用 single 可以保留所有唯一数字,因为精度要高得多。

    如果您对 rand 中的很多(订购 2^52)个元素进行相同的测试并使用 double,您会看到它的唯一元素数量再次是 @ 的 2^32 倍987654327@,就像uint16 将有 2^8 个 uint8 的唯一元素数。

    【讨论】:

      猜你喜欢
      • 2011-11-16
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2017-01-26
      • 2020-08-21
      • 1970-01-01
      • 2017-11-12
      相关资源
      最近更新 更多