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
  1i
  -3.14159j
  3e5j
  控制流。包括
  
  if if和else, elseif組合,條件執行一組語句
  for 指定次數重複執行一組語句
  while 按條件反覆執行一組語句
  break 終止for或者while循環
  continue 馬上開始下一次for或者while循環
  switch switch和case,otherwise結合,按照條件值的不同執行不同的語句塊
  return 終止當前函數,返回到調用它的地方
  try...catch 捕獲異常狀況
  if語句
  
  if expression_r1
  statements1
  elseif expression_r2
  statements2
  else
  statements3
  end
  for循環
  
  for index = start:increment:end
  statements
  end
  比如
  
  count = 0;
  for k = 0:0.1:1
  count = count +1
  end
  while循環
  
  while expression_r
  statements
  end
  比如
  
  a = 10;
  b = 5;
  while a
  a = a - 1;
  while b
   b = b - 1;
  end
  end
  switch語句
  
  switch switch_expression_r
  case case_expression_r
   statements
  case {case_expression_r1, case_expression_r2}
   statements
  otherwise
   statements
  end
  比如
  
  switch newclass
  case 'uint8'
   g = im2uint8(f);
  case 'uint16'
   g = im2uint16(f);
  case 'double'
   g = im2double(f);
  otherwise
   error('Unknown or improper image class.')
  end
  例子:寫一個函數計算一幅灰度圖像所有像素的平均值
  
  function av = average(A)
  %AVERAGE Computes the average value of an array
  % AV = AVERAGE(A) computes the average value of input array, A,
  % which must be a 1D or 2D array.
  
  % Check the validity of input.
  if ndims(A) > 2
  error('The dimensions of the input cannot exceed 2.')
  end
  % Computes the average
  av =
  例子:比較各種不同的JPEG質量下的圖像質量
  
  for q = 0:5:100
  filename = sprintf('series_%3d.jpg', q);
  imwrite(f, filename, 'quality', q);
  end
  其中sprintf語句和c語言的fprintf語句用法類似。例子:寫一個函數從一個圖像中取出一個矩形的子圖。
  
  function s = subdim(f, m, n, rx, cy)
  %SUBDIM Extracts a subimage, s, from a given image, f.
  % The subimage is of size m-by-n, and the coordinates of its top, left
  % corner are (rx, cy).
  
  s = zeros(m, n);
  rowhigh = rx + m - 1;
  colhigh = cy + n - 1;
  xcount = 0;
  for r = rx:rowhigh
  xcount = xcount + 1;
  ycount = 0;
  for c = cy:colhigh
   ycount = ycount + 1;
   s(xcount, ycount) = f(r, c);
  end
  end
  實際上這個功能可以用一個matlab語句就可以實現了。
  循環優化。一些循環可以被轉換成同樣向量計算來代替,比如f(x)=Asin(x/2pi),生成一個向量包含一組函數的值:
  
  for x = 1:M
  f(x) = A*sin((x-1)/(2*pi));
  end
  可以用下面兩個語句來代替
  
  x =
  f = A*sin(x/2(*pi))
  向量運算要比循環快得多。對於二維的情況,MATLAB提供了一個meshgrid函數
  
  [C, R] = meshgrid(c, r)
  比如
  
  >> r = [0 1 2];
  >> c = [0 1];
  >> [C, R] = meshgrid(c, r)
  >> h = R.^2 + C.^2
  例子:f(x, y) = Asin(ux + vy),生成一個矩陣,包含這個函數的值:
  
  function [rt, f, g] = twodsin(A, u0, v0, M, N)
  %TWODSIN compare for loops vs vectorization
  % The comparision is based on implementing the function
  % f(x, y) = Asin(u0x+v0y) for x = 0, 1, 2,..., M-1, and
  % y = 0, 1, 2, ..., N-1. The inputs to the function are
  % M and N and the constants in the function.
  
  tic
  for r = 1:M
  u0x = u0*(r-1);
  for c = 1:N
   v0y = v0*(c-1)
   f(r, c) = A*sin(u0x + v0y);
  end
  end
  t1 = toc;
  
  tic
  r =
  c =
  [C,R] = meshgrid(c, r);
  g = A*sin(u0*R + v0*C)
  t2 = toc;
  
  rt = t1/t2;
  運行這個例子可以看出,向量計算至少比循環要快30倍。如果只是針對圖像的一部分進行操作,可以簡單的提取出來,比如
  
  rowhigh = rx + m - 1;
  colhigh = cy + n - 1;
  s =
  同樣功能的程序,這個寫法比前面例子看到的寫法要快1000倍。
  用戶交互。函數disp用來提示用戶一些信息。比如
  
  >> A = [1 2; 3 4];
  >> disp(A)
  >> sc = 'Digital Image Processing.';
  >> disp(sc)
  >> disp('This is another way to display text.')
  input函數用來提示用戶輸入某些值:
  
  t = input('message')
  這個函數可以顯示message,並等待用戶輸入一個值,並存到t中。輸入的值可以是MATLAB允許的任何類型的值。而如下的格式只接受字符串輸入
  
  t = input('message', 's')
  如果字符串中包含的都是數字,則可以用函數str2num進行轉換
  
  n = str2num(t)
  比如
  
  >> t = input('Enter your data: ', 's')
  >> class(t)
  >> size(t)
  >> n = str2num(t)
  >> size(n)
  >> class(n)
  如果混合輸入字符串和數值,可以全部按照字符串讀入,再使用字符串處理函數strread,比如:
  
  >> t = '12.6, x2y, z';
  >> [a, b, c] = strread(t, '%f%q%q', 'delimiter', ',')
  >> d = char(b)
  其中%f表示浮點數,%q表示字符串。delimiter參數表示分割符。函數strcmp用來比較字符串,如果兩個字符串相等返回真,否則返回假。lower函數可以把字符串中的大寫字母全部變成小寫,upper函數可以把字符串中所有小寫字母全部變成大寫。
  Cell數組和結構體。Cell數組是指數組的元素本身還是一個數組,比如
  
  >> c = {'gause', [1 0; 0 1], 3}
  >> c{1}
  >> c{2}
  >> c{3}
  結構體和Cell數組類似,但是其中的元素是用一個名字去訪問的,比如
  
  >> S.char_string = 'gause';
  >> S.matrix = [1 0; 0 1];
  >> S.scalar = 3;
  >> S.matrix
  
  實驗任務
  MATLAB 沒有提供一個函數來確定數組的每個元素是不是整數(即...,-2,-1,0,1,2,...)。寫一個函數來實現這個功能,並滿足下面的格式:
  
  function I = isinteger(A)
  %ISINTEGER Determines which elements of an array are integers.
  % I = ISINTEGER(A) returns a logical array, I, of the same size
  % as A, with 1s (TRUE) in the locations corresponding to integers
  % (i.e., . . . -2 -1 0 1 2 . . . )in A, and 0s (FALSE) elsewhere.
  % A must be a numeric array.
  要求不能使用while或者for循環。提示:使用floor函數。如果你要做到能夠處理複數,那麼可以使用real和imag函數。
  MATLAB沒有提供一個函數用來確定數組的每個元素是不是偶數(即...,-4,-2,0,2,4,...)。寫一個函數來實現這個功能,並滿足下面的格式:
  
  function E = iseven(A)
  %ISEVEN Determines which elements of an array are even numbers.
  % E = ISEVEN(A) returns a logical array, E, of the same size as A,
  % with 1s (TRUE) in the locations corresponding to even numbers
  % (i.e., . . . -3, -1, 0, 2, 4, . . . )in A, and 0s (FALSE) elsewhere.
  % A must be a numeric array.
  要求不能使用while或者for循環。提示:使用floor函數。
  MATLAB沒有提供一個函數用來確定數組的每個元素是不是奇數(即...,?3,?1,1,3,...)。寫一個函數實現這個功能,並滿足下面的格式:
  
  function D = isodd(A)
  %ISODD Determines which elements of an array are odd numbers.
  % E = ISODD(A) returns a logical array, D, of the same size as A,
  % with 1s (TRUE) in the locations corresponding to odd numbers
  % (i.e., . . . -3, -1, 1, 3, . . . )in A, and 0s (FALSE) elsewhere.
  % A must be a numeric array.
  要求不能使用while或者for循環。提示:使用floor函數。
  寫一個函數滿足下面的規定:
  
  function H = imcircle(R, M, N)
  %IMCIRCLE Generates a circle inside a rectangle.
  % H = IMCIRCLE(R, M, N) generates a circle of radius R centered
  % on a rectangle of height M and width N. H is a binary image with
  % 1s on the circle and 0s elsewhere. R must be an integer >= 1.
  你的程序應該檢查R的合理性,使它能夠在矩形的內部。要求不能使用for或者while循環。提示:使用函數meshgrid和floor函數。
  這個實驗主要目的是學習如何顯示和改變目錄,並利用目錄信息來讀取圖像。寫一個函數滿足下面的規定:
  
  function [I, map] = imagein(path)
  %IMAGEIN Read image in from current-working or specified directory.
  % I = IMAGEIN displays a window containing all the files in the
  % current directory, and saves in I the image selected from the
  % current directory.
  % [I, MAP] = IMAGEIN variable MAP is required to be an output
  % argument when the image being read is an indexed image.
  % [ . . .] = IMAGEIN('PATH') is used when the image to be read
  % resides in a specified directory. For example, the input
  % argument 'C:\MY_WORK\MY_IMAGES' opens a window showing
  % the contents of directory MY_IMAGES. An image selected from
  % that directory is read in as image I.

  提示:使用在線幫助來熟悉cd,pwd,uigetfile函數的使用。或者也可以採用fullfile函數來代替cd函數


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/learngis/archive/2009/07/12/4342102.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章