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格式的才能運算,區別如下:
-
img = imread('./1.jpg'); % 讀入是unit8型(0~255)數據
-
I1 = im2double(img); % 把圖像轉換成double精度類型(0~1)
-
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區間。
