1. 程式人生 > >MATLAB基本的使用方法(影象,矩陣及函式)

MATLAB基本的使用方法(影象,矩陣及函式)

讀取影象:用imread函式讀取影象檔案,檔案格式可以是TIFF、JPEG、GIF、BMP、PNG等。比如

  >> f = imread('chestxray.jpg');
  讀進來的影象資料被儲存在變數f中。尾部的分號用來抑制輸出。如果圖片是彩色的,可以用rgb2gray轉換成灰度圖:

  >> f = rgb2gray(f);
  然後可以用size函式看影象的大小

  >> size(f)
  如果f是灰度影象,則可以用下面的命令把這個影象的大小賦給變數M和N

  >> [M, N] = size(f);
  用whos命令檢視變數的屬性

  >> whos f

  顯示影象:用imshow顯示影象

  imshow(f, G)
  其中f是影象矩陣,G是畫素的灰度級,G可以省略。比如

  >> imshow(f, [100 200])
  影象上所有小於等於100的數值都會顯示成黑色,所有大於等於200的數值都會顯示成白色。pixval命令可以用來檢視影象上游標所指位置的畫素值。

  pixval
  例如

  >> f = imread('rose_512.tif');
  >> whos f
  >> imshow(f)
  如果要同時顯示兩幅影象,可以用figure命令,比如

  >> figure, imshow(g)
  用逗號可以分割一行中的多個命令。imshow的第二個引數用一個空的中括號:


  >> imshow(h, [])
  可以使動態範圍比較窄的影象顯示更清楚。
  寫影象。用imwrite寫影象

  imwrite(f, 'filename')
  檔名必須包括指明格式的副檔名。也可以增加第三個引數,顯式指明檔案的格式。比如

  >> imwrite(f, 'patient10_run1.tif', 'tif')
  也可以寫成

  >> imwrite(f, 'patient10_run1.tif')
  還可以有其他引數,比如jepg影象還有質量引數:

  >> imwrite(f, 'filename.jpg', 'quality', q)

  q是0到100之間的一個整數。對比不同質量的影象效果。用imfinfo命令可以檢視一個影象的格式資訊,比如

  >> imfinfo bubbles25.jpg
  可以把影象資訊儲存到變數中

  >> K = imfinfo('bubbles25.jpg');
  >> image_bytes = K.Width * K.Height * K.BitDepth / 8;
  >> compressed_btyes = K.FileSize;
  >> compression_ratio = image_bytes / compressed_bytes
  資料型別。MATLAB的資料型別包括:

  double 雙精度浮點
  uint8 無符號8位整數
  uint16 無符號16位整數
  uint32 無符號32位整數
  int8 有符號8位整數
  int16 有符號16位整數
  int32 有符號32位整數
  single 單精度
  char 字元
  logical 邏輯型(二值)
  資料型別轉換

  B = data_class_name(A)
  比如

  >> C = [1.4 1.5]
  >> D = uint8(C)
  影象型別分為:

  Intensity image 灰度圖
  Binary image 二值圖
  Indexed image 索引圖
  RGB image 彩色圖
  在灰度圖中每個畫素可以是整型、浮點型或者邏輯型。影象型別的畫素型別可以轉換

  function to from
  im2uint8 uint8 logical,uint8,uint16,double
  im2uint16 uint16 logical,uint8,uint16,double
  mat2gray double double
  im2double double logical,uint8,uint16,double
  im2bw logical uint8,uint16,double
  比如

  g = mat2gray(A, [Amin, Amax]);
  g = mat2gray(A);
  g = im2double(h);
  g = im2bw(f, T)
  其中A是浮點型的影象,Amin和Amax是浮點數的範圍,h和f是任意型別的影象,T是分割的閾值。
  陣列(向量)索引:建立向量(陣列):

  >> v = [1 3 5 7 9 11 13]
  用小括號對向量進行索引(取陣列中的某個元素):

  >> v(2)
  轉置(將行向量通過轉置變成列向量):

  >> w = v.'
  取向量其中的一部分:

  >> v(1:3) 第1個到第3個
  >> v(2:4)
  >> v(3:end) 第3個到最後一個
  >> v(1:end)
  >> v(:) 全部
  >> v(1:2:end) 第1個到最後一個,每次增加2
  >> v(end:-2:1) 最後一個到第1個,每次減2
  其中end總是表示最後一個。

  >> x = linspace(1, 5, 10)
  >> v([1 4 5])
  linspace函式產生一個範圍內的平均分佈。
  矩陣索引:建立矩陣

  >> A = [1 2 3; 4 5 6; 7 8 9]
  取矩陣中的一個元素

  >> A(2, 3)
  取矩陣中的一行或者一列

  >> C3 = A(:, 3)
  >> R2 = A(2, :)
  取矩陣中某些行某些列

  >> T2 = A(1:2, 1:3)
  對矩陣中某些元素進行賦值:

  >> B = A;
  >> B(:, 3) = 0
  用end表示最後一行或者最後一列:

  >> A(end, end) 最後一行最後一列
  >> A(end, end-2) 最後一行倒數第三列
  >> A(2:end, end:-2:1) 第2行到最後一行,最後一列到第一列,每次減2
  >> E = A([1 3], [2 3]) 第1、3行,第2、3列
  >> D = logical([1 0 0; 0 0 1; 0 0 0])
  >> A(D) 取A中由D指定的位置上的元素
  >> v = T2(:) 把矩陣變成一個向量
  >> s = sum(A(:)) 求和
  >> sum(sum(A))
  可以把矩陣操作用在影象上

  >> f = imread('filename');
  >> fp = 矩陣列倒轉
  >> imshow(fp)
  >> fc =
  >> imshow(fc)
  >> fs =
  >> imshow(fs)
  >> plot(f(512,:))
  矩陣可以是多維的,用size看矩陣大小,用ndims命令常看矩陣的維數

  >> size(A, 1)
  >> ndims(A)
  一些常用的矩陣

  zeroes(M, N)
  ones(M, N)
  true(M, N)
  false(M, N)
  magic(M)
  rand(M, N)
  randn(M, N)
  其中M、N表示矩陣的行數和列數。比如

  >> A = 5 * ones(3, 3)
  >> magic(3)
  >> B = rand(2, 4)
  函式:可以把一系列的MATLAB語句或者一個帶引數的函式放在副檔名叫做m的檔案中。一個帶函式的m檔案有一下部分組成

  函式定義行
  H1行
  幫助部分
  函式體
  註釋
  函式定義行的格式是

  function [outputs] = name(inputs)
  比如要寫一個函式計算兩個影象的和以及乘積

  function [s, p] = sumprod(f, g)
  其中f和g是輸入的影象,而s是和,p是乘積。返回值用中括號括起來,如果返回值只有一個,可以省略中括號。如果函式沒有輸出,則中括號和等號都可以省略。函式名字的命名規則和C語言是相同的。定義好的函式可以在命令列呼叫:

  >> [s, p] = sumprod(f, g);
  也可以被其它函式呼叫。如果只有一個返回值,呼叫時中括號也是可以省略的,比如

  >> y = sum(x);
  H1行是文字的第一行,是一個單行的註釋,緊跟在函式定義行後面,之間不能有空行。比如

  % SUMPROD Computes the sum and product of two images.
  百分號開始的文字表示註釋。當使用幫助命令

  >> help function_name
  時,這個H1行會被首先顯示出來。如果使用lookfor命令,則會在所有H1行中查詢指定的關鍵字。這一行應該提供這個函式功能的一個概述。幫助部分是緊跟在H1後的文字塊,中間沒有空行,用來提供對這個函式更詳細的幫助說明。在使用help命令時會顯示所有這部分內容。這部分內容由註釋語句構成,全部由%開始。接下來第一個非註釋語句表示函式體的開始。函式體包含進行計算的語句和給返回值賦值的語句。函式題中的所有註釋(百分號開始的行)被認為是普通的註釋,不是H1或者幫助部分。m檔案可以用任何文字編輯器建立和編輯,只要用.m副檔名儲存在MATLAB可以搜尋到的路徑裡面。另一個建立和編輯函式的方法是在命令列輸入edit命令,比如

  >> edit sumprod
  這命令會編輯已經存在的sumprod.m檔案,如果沒有則自動在當前目錄中建立一個sumprod.m並開始編輯。
  運算子。運算子可以分為算術運算子,關係運算符和邏輯運算子。算術運算子分為矩陣算術運算子和陣列算術運算子。

  + 矩陣和陣列加法 plus(A, B) a+b, A+B
  - 矩陣和陣列減法 minus(A,B) a-b, A-B
  .* 陣列乘法 times(A,B) C=A.*B, 意味著C(I,J) = A(I,J)*B(I,J)
  * 矩陣乘法 mtimes(A,B) A*B, 表示線性代數中的矩陣運算,或者a*A
  ./ 陣列右除 rdivide(A,B) C=A./B, 意味著C(I,J)=A(I,J)/B(I,J)
  .\ 陣列左除 ldivide(A,B) C=A.\B, 意味著C(I,J)=B(I,J)/A(I,J)
  / 矩陣右除 mrdivide(A,B) A/B 意味著A*inv(B), inv是矩陣求逆
  \ 矩陣左除 mldivide(A,B) A\B 意味著inv(A)*B
  .^ 陣列指數 power(A, B) C=A.^B,意味著C(I,J)=A(I,J)^B(I,J)
  ^ 矩陣指數 mpower(A,B) 請檢視幫助
  .' 向量和矩陣轉置 transpose(A) A.'
  ' 複數的共軛 ctranspose(A) A'
  + 單目加號 uplus(A) +A 與0+A相同
  - 單目負號 uminus(A) -A 與0-A相同
  影象處理工具包還提供其他一些算術運算

  imadd 兩個影象相加,或者一個影象加上一個常量
  imsubstract 兩個影象相減,或者一個影象減掉一個常量
  immultiply 兩個影象相乘,或者一個影象乘上一個常量
  imdivide 兩個影象相除,或者一個影象除以一個常量
  imabsdiff 兩個影象的差的絕對值
  imcomplement 求一個影象的反色圖
  inlincomb 求一組影象的線性組合
  關係運算符包括

  <
  <=
  >
  >=
  ==
  ~=
  關係運算符的結果是邏輯型的矩陣,比如

  >> A = [1 2 3; 4 5 6; 7 8 9]
  >> B = [0 2 4; 3 5 6; 3 4 9]
  >> A == B
  >> A >= B
  如果關係運算符兩邊都是矩陣,則要求兩邊的矩陣是同樣大小的。或者一邊是矩陣一邊是常數,或者兩邊都是常數,那也是可以。

  >> A > 3
  >> 3 ~= 4
  邏輯運算子包括與、或、非三個運算

  & AND
  | OR
  ~ NOT
  在matlab中非0被認為是真,0被認為是假。比如

  A = [1 2 0; 0 4 5]
  B = [1 -2 3; 0 1 1]
  >> A & B
  MATLAB還有其它一些邏輯運算函式:

  xor 異或
  all 如果一整列都是真,則結果是真
  any 如果一整列只要有一個是真,則結果是真
  比如

  >> xor(A, B)
  >> all(A)
  >> any(A)
  >> all(B)
  >> any(B)
  一些重要的常量

  ans
  eps
  i(或者j)
  NaN或者nan
  pi
  realmax
  realmin
  computer
  version
  MATLAB中一般常量的寫法

  3
  -99
  0.00001
  9.6397238
  1.60210e-20
  6.02252e23