1. 程式人生 > >MATLAB size/length/numel 影象的灰度化,顯示與判斷

MATLAB size/length/numel 影象的灰度化,顯示與判斷

size:獲取陣列的行數和列數

length:陣列長度(即行數或列數中的較大值)

numel:元素總數。

s=size(A),當只有一個輸出引數時,返回一個行向量,該行向量的第一個元素時陣列的行數,第二個元素是陣列的列數。

[r,c]=size(A),當有兩個輸出引數時,size函式將陣列的行數返回到第一個輸出變數,將陣列的列數返回到第二個輸出變數。

如果在size函式的輸入引數中再新增一項,並用1或2為該項賦值,則size將返回陣列的行數或列數。 其中r=size(A,1)該語句返回的時陣列A的行數, c=size(A,2) 該語句返回的時陣列A的列數。

n=numel(A)該語句返回陣列中元素的總數。    

n=length(A):如果A為非空陣列,返回行數和列數兩者之間數值較大的那一個值,即相當於執行了max(size(A));如果A為空陣列,則返回0;如果A是一個向量則返回A的長度。

n=max(size(A)):若A為非空陣列,返回A的最大維數;若A為空陣列,返回A中最長的非0維數。

彩色圖片為3維,灰度圖片為2維。

zhu和44為彩色圖片   12為灰度影象

vv=imread('D:\實驗圖片\zhu.jpg');
pp=imread('D:\實驗圖片\12.jpg');
gg=imread('D:\實驗圖片\44.jpg');
[a, b, c]=size(vv);
d=length(size(vv));
h=length(size(pp));
k=length(size(gg));

tt=size(pp);
[l, m, n]=size(gg) ;
[ll, mm, nn]=size(pp)

numel(size(vv))
numel(size(pp))
numel(size(gg))
執行結果為:

a =800
b = 600

c =   3

d =  3

h =2
k =3

tt =    1280        1024

l =  640

m =   670
n = 3

ll = 1280

mm =1024
nn =  1

ans =  3

ans = 2

ans =  3

通過imread(‘  ’)讀取圖片,讀入的影象為unit8型,而MATLAB中矩陣運算中要求所有的運算變數為double型(雙精度型)。通常使用im2double函式將影象資料轉換成雙精度型資料。

同時比較double、im2double、mat2gray區別

****************假設某影象資料A(uint8格式)**********************

A =

  235  200  89  20

>>double(A)                 %返回與原矩陣數值相同但型別為double的矩陣;

ans =

   235   200 89   20

>>im2double(A)              
%返回矩陣型別:double;數值範圍[0 1] ,0對應uint8中的0;1對應uint8中的255;

ans =

    0.9216    0.7843   0.3490    0.0784

>>mat2gray(A)                %對原矩陣歸一化

ans =

    1.0000    0.8372   0.3209      0

****************假設矩陣A為一般二維陣列,非影象資料(double格式)**********************

A =

   235   200    89    20 

>> double(A)

ans =

   235   200   89    20

>> im2double(A)

ans =

   235   200   89    20

>> mat2gray(A)

ans =

    1.0000    0.8372    0.3209      0 

**********************小結***************************

im2double:如果輸入型別是uint8、unit16 、logical,則按照0-->>0,255-->>1,將其值按比例處理成0~1之間的double數值;如果輸入型別是double,輸出沒有處理;

double:返回數值與輸入相同的double型別矩陣;

mat2gray:對輸入進行歸一化處理,最小值-->>0;最大值-->>1,輸出型別為double。

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

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

各資料型別的轉換參考:  http://blog.csdn.net/fx677588/article/details/53301740   此篇中,還有影象顯示imshow()的說明

判斷圖片是否為灰度圖

% check to see if the image is a color image...
d = length(size(im));
if d==3
    image=double(rgb2gray(im));
elseif d==2
    image=double(im);
end  或者 numel(size(im))>2 為彩色影象          numel(size(im))=2  為灰度影象