【问题标题】: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) 有什么区别,其中I 是uint8 而Is 是single?
【问题讨论】:
标签:
matlab
image-processing
image-scaling
unsigned-integer
single-precision
【解决方案1】:
imagesc 只是在下面调用image。至于image,如果提供整数或浮点数,它的行为会有所不同,这可以从image 的文档中了解到:
如果C 是double 类型,则[0 0 0] 的RGB 三元组值对应黑色,[1 1 1] 对应白色。
如果C 是整数 类型,则图像使用全范围数据来确定颜色。例如,如果C 的类型为uint8,则[0 0 0] 对应黑色,[255 255 255] 对应白色。如果CData 是int8 类型,则[-128 -128 -128] 对应黑色,[127 127 127] 对应白色。
...
数据类型之间的转换
要将索引图像数据从整数类型转换为double 类型,请加1。例如,如果X8 是uint8 类型的索引图像数据,则使用以下方法将其转换为double 类型:
X64 = double(X8) + 1;
要将索引图像数据从double 类型转换为整数类型,请减1 并使用round 确保所有值都是整数。例如,如果X64 是double 类型的索引图像数据,则将其转换为uint8 使用:
X8 = uint8(round(X64 - 1));
要将真彩色图像数据从整数类型转换为double 类型,请重新缩放数据。例如,如果RGB8 是uint8 类型的真彩色图像数据,则使用以下方法将其转换为双精度:
RGB64 = double(RGB8)/255;
要将真彩色图像数据从double 类型转换为整数类型,请重新缩放数据并使用round 以确保所有值都是整数。例如,如果RGB64 是double 类型的图像数据,则将其转换为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 的唯一元素数。