[英]What is the difference between a uint8 and a single image?
我已經知道uint8
包含0到255(2 8 -1)之間的強度值,single包含0到1之間的強度值,它用於保存較大的值而不會改變范圍誤差。 但是,除此之外,還有其他區別嗎?
imagesc((I/64)*64)
和imagesc((Is/64)*64)
之間有什么區別,其中I
為uint8
, Is
為single
?
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
類型的真彩色圖像數據,則使用以下命令將其轉換為double:RGB64 = double(RGB8)/255;
要將真彩色圖像數據從
double
類型轉換為整數類型,請重新縮放數據並使用round
確保所有值都是整數。 例如,如果RGB64
是double
類型的圖像數據,則使用以下命令將其轉換為uint8
:RGB8 = uint8(round(RGB64*255));
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
bin,也為0,因此uint8
映像可能有5個值。 但是,使用single
會保留所有唯一數字,因為精度要高得多。
如果對rand
的很多元素(階數2 ^ 52)進行相同的測試並使用double
您會發現它再次具有single
唯一元素數的2 ^ 32倍,就像uint16
將具有2 ^ 8 uint8
的唯一元素的數量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.