1. 程式人生 > >matlab中圖片資料型別轉換uint8與double

matlab中圖片資料型別轉換uint8與double

matlab中處理影象畫素點資料:

img1=double(imread('lenna.bmp'));

matlab中imshow圖片,要先轉換成uint8:

subplot(1,2,1),imshow(uint8(img1)),title('original');
subplot(1,2,2),imshow(uint8(img2)),title('after');


 

matlab影象處理關於unit8的問題_百度知道 https://zhidao.baidu.com/question/545122188.html

 

為了節省儲存空間,matlab為影象提供了特殊的資料型別uint8(8位

無符號整數),以此方式儲存的影象稱作8點陣圖像。
imread把灰度影象存入一個8位矩陣,當為RGB影象時,就存入8位RGB矩陣中。

因此,matlab讀入影象的資料是uint8,而matlab中數值一般採用double型(64位)儲存和運算。所以要先將影象轉為double格式的才能運算,
I2=im2double(I1); %把影象I1轉換成double精度型別 (假設圖形矩陣範圍0~255)
或者
I64=double(I8)/255; %uint轉換成double
如果不轉換,計算會產生溢位。


 

matlab影象型別轉換以及uint8、double、im2double、im2uint8和mat2gray等說明 - Thomas會寫字 - CSDN部落格

https://blog.csdn.net/kakiebu/article/details/78959249

1. matlab影象儲存說明

  matlab中讀取圖片後儲存的資料是uint8型別(8位無符號整數,即1個位元組),以此方式儲存的影象稱作8點陣圖像,好處相比較預設matlab資料型別雙精度浮點double(64位,8個位元組),自然可以節省很大一部分儲存空間。 
  詳細來說imread把灰度影象存入一個8位矩陣,當為RGB影象時,就存入8位RGB矩陣中。例如,彩色影象畫素大小是400*300( 高 * 寬 ),則儲存的資料矩陣為400*300*3,其中每個顏色通道值是處於0~255之間。 
  但是雖然matlab中讀入影象的資料型別是uint8,而在影象矩陣運算的時候,使用的資料型別卻是double型別。一是為了保證精度,二是因為如果不轉換,在對uint8進行加減時會產生溢位,可能提示的錯誤為: 

Function ‘*’ is not defined for values of class ‘uint8’

  1個位元組無符號整型最大隻能儲存資料為255,對圖片的操作所以很容易溢位。

2. matlab影象型別轉換

 

  matlab讀入影象的資料是uint8,而matlab中數值一般採用double型(64位)儲存和運算。所以要先將影象轉為double格式的才能運算,區別如下:

 

  1.   img = imread('./1.jpg'); % 讀入是unit8型(0~255)資料
  2.   I1 = im2double(img); % 把影象轉換成double精度型別(0~1)
  3.   I2 = double(img)/255; % uint8轉換成double,作用同im2double

  這裡補充說明一下,im2double( )和double( )的區別。double( img)就是簡單的資料型別轉換,將無符號整型轉換為雙精度浮點型double,但是資料大小沒有變化,原本資料是0~255之間,轉化後還是0~255。例如原來是255,那麼轉換後為255.0,小數位0個數是由double資料長度決定,實際資料大小還是255,只不過這個255已經是double型別空間儲存了,再增加不會發生溢位情況。而im2double(img)則不僅僅是將uint8轉換到double型別,而且把資料大小從0~255對映到0~1區間。