1. 程式人生 > >matlab中的imshow函式使用

matlab中的imshow函式使用

轉自 http://hi.baidu.com/redaiyu1989/item/3f39fe151b446fc039cb3087

網上搜的好東西 一些影象處理函式用法

% imshow imshow是用來顯示圖片的,如 >> I = imread('moon.tif'); >> figure,imshow(I); 而有時為了資料處理,要把讀取的圖片資訊轉化為更高的精度, >> I = double(imread('moon.tif')); 為了保證精度,經過了運算的影象矩陣I其資料型別會從unit8型變成double型。如果直接執行imshow(I),我們會發現顯示的是一個白色的影象。這是因為imshow()顯示影象時對double型是認為在0~1範圍內,即大於1時都是顯示為白色,而imshow顯示uint8型時是0~255範圍。而經過運算的範圍在0-255之間的double型資料就被不正常得顯示為白色影象了。 有兩個解決方法:                  1> imshow(I/256); -----------將影象矩陣轉化到0-1之間                  2> imshow(I,[]);   -----------自動調整資料的範圍以便於顯示. 從實驗結果看兩種方法都解決了問題,但是從顯示的影象看,第二種方法顯示的影象明暗黑白對比的強烈些! +++++++++++++++++++++++++++++++++++++++ IMSHOW(I) displays the grayscale image I. IMSHOW(I,[LOW HIGH]) displays the grayscale image I, specifying the display range for I in [LOW HIGH]. The value LOW (and any value less than LOW) displays as black, the value HIGH (and any value greater than HIGH) displays as white. Values in between are displayed as intermediate shades of gray,using the default number of gray levels.  If you use an empty matrix ([]) for[LOW HIGH], IMSHOW uses [min(I(:)) max(I(:))]; that is, the minimum value in I is displayed as black, and the maximum value is displayed as white. +++++++++++++++++++++++++++++++++++++++ 影象為y,為何用imshow(uint8(y))和imshow(y,[])時的影象顯示結果不同? 回答: imshow(uint8(y))是按照256級灰度顯示y得絕對資料。0表示黑色,255表示白色,y中大於255的值強制為255。  imshow(y,[]),將y中的最小值看作0(black),最大值看作255(white) -->增加影象的對比度。  所以兩者不同。 % padarray 功能:填充影象或填充陣列。 用法:B = padarray(A,padsize,padval,direction)       A為輸入影象,B為填充後的影象,       padsize給出了給出了填充的行數和列數,通常用[r c]來表示,       padval和direction分別表示填充方法和方向。 它們的具體值和描述如下:    padval:'symmetric' 表示影象大小通過圍繞邊界進行映象反射來擴充套件;                        'replicate' 表示影象大小通過複製外邊界中的值來擴充套件;                        'circular' 影象大小通過將影象看成是一個二維周期函式的一個週期來進行擴充套件。       direction:'pre' 表示在每一維的第一個元素前填充;                         'post' 表示在每一維的最後一個元素後填充;                        'both' 表示在每一維的第一個元素前和最後一個元素後填充,此項為預設值。 若參量中不包括direction,則預設值為'both';若參量中不包含padval,則預設用零來填充。若參量中不包括任何引數,則預設填充為零且方向為'both'。在計算結束時,影象會被修剪成原始大小。 舉例:       A = [1 2; 3 4];       B = padarray(A,[3 2],'replicate','post') imfinfo imfinfo函式用於讀取圖象檔案的有關資訊,其語法格式為 imfinfo(filename,fmt) imfinfo函式返回一個結構info,它反映了該圖象的各方面資訊,其主要資料包括:檔名(路徑)、檔案格式、檔案格式版本號、檔案的修改時間、檔案的大小、檔案的長度、檔案的寬度、每個畫素的位數、圖象的型別等。 imhist MATLAB圖象處理工具箱提供了imhist函式來計算和顯示圖象的直方圖,imhist函式的語法格式為: imhist(I,n) imhist(X,map) 其中imhist(I,n)計算和顯示灰度圖象I的直方圖,n為指定的灰度級數目,預設值為256。imhist(X,map)計算和顯示索引色圖象X的直方圖,map為調色盤。 例: I = imread('rice.tif'); imshow(I) figure, imhist(I) imadjust —>對比度增強    如果原圖象f(x,y)的灰度範圍是[m,M],我們希望調整後的圖象g(x,y)的灰度範圍是[n,N],那麼下述變換就可以實現這一要求。 MATLAB圖象處理工具箱中提供的imadjust函式,可以實現上述的線性變換對比度增強。Imadjust函式的語法格式為: J = imadjust(I,[low_in high_in],[low_out high_out]) J = imadjust(I,[low_in high_in],[low_out high_out])返回圖象I經過直方圖調整後的圖象J,[low_in high_in]為原圖象中要變換的灰度範圍,[low_out high_out]指定了變換後的灰度範圍。 例: I = imread('pout.tif'); J = imadjust(I,[0.3 0.7],[]); imshow(I), figure, imshow(J) imresize 幾何運算可改變影象中各物體之間的空間關係。這種運算可以被看成是將(各)物體在影象內移動。一個幾何運算需要兩個獨立的演算法。首先,需要一個演算法來定義空間變換本身,用它來描述每個畫素如何從其初始位置“移動”到終止位置,即每個畫素的“運動”。同時,還需要一個用於灰度插值的演算法,這是因為,在一般情況下,輸入影象的位置座標(x,y)為整數,而輸出影象的位置座標為非整數,反過來也如此。因此插值就是對變換之後的整數座標位置的畫素值進行估計。MATLAB提供了一些函式實現這些功能。    插值是常用的數學運算,通常是利用曲線擬合的方法,通過離散的取樣點建立一個連續函式來逼近真實的曲線,用這個重建的函式便可以求出任意位置的函式值。    最近鄰插值是最簡便的插值,在這種演算法中,每一個插值輸出畫素的值就是在輸入影象中與其最臨近的取樣點的值。最近鄰插值是工具箱函式預設使用的插值方法,而且這種插值方法的運算量非常小。當影象中包含畫素之間灰度級變化的細微結構時,最近鄰插值法會在影象中產生人工的痕跡。    雙線性插值法的輸出畫素值是它在輸入影象中2×2領域取樣點的平均值,它根據某畫素周圍4個畫素的灰度值在水平和垂直兩個方向上對其插值。    雙三次插值的插值核為三次函式,其插值鄰域的大小為4×4。它的插值效果比較好,但相應的計算量也比較大。    MATLAB影象處理工具箱中的函式imresize可以用上述的3種方法對影象進行插值縮放,如果不指定插值方法,則預設為最鄰近插值法。 Imresize函式的語法格式為: B = imresize(A,m,method)    引數method用於指定插值的方法,可選用的值為'nearest'(最鄰近法),'bilinear'(雙線性插值),'bicubic'(雙三次插值),預設為'nearest'。 B = imresize(A,m,method)返回原圖A的m倍放大的影象(m小於1時效果是縮小)。 imnoise 在MATLAB中提供了給影象加入噪聲的函式imnoise imnoise的語法格式為 J = imnoise(I,type) J = imnoise(I,type,parameters) 其中J = imnoise(I,type)返回對原始影象I新增典型噪聲的有噪影象J。 引數type和parameters用於確定噪聲的型別和相應的引數。 下面的命令是對影象eight.tif分別加入高斯噪聲、椒鹽噪聲和乘性噪聲,其結果如圖所示: 例: I=imread('eight.tif'); J1=imnoise(I,'gaussian',0,0.02); J2=imnoise(I,'salt & pepper',0.02); J3=imnoise(I,'speckle',0.02); subplot(2,2,1),imshow(I),title('原影象'); subplot(2,2,2),imshow(J1),title('加高斯噪聲'); subplot(2,2,3),imshow(J2),title('加椒鹽噪聲'); subplot(2,2,4),imshow(J3),title('加乘性噪聲'); MATLAB提供的快速傅立葉變換函式 (1)fft2 fft2函式用於計算二維快速傅立葉變換,其語法格式為: B = fft2(I) B = fft2(I)返回圖象I的二維fft變換矩陣,輸入圖象I和輸出圖象B大小相同。 例如,計算圖象的二維傅立葉變換,並顯示其幅值的結果,其命令格式如下 load imdemos saturn2 imshow(saturn2) B = fftshift(fft2(saturn2)); imshow(log(abs(B)),[],'notruesize') (2)fftshift MATLAB提供的fftshift函式用於將變換後的圖象頻譜中心從矩陣的原點移到矩陣的中心,其語法格式為:   B = fftshift(I) 對於矩陣I,B = fftshift(I)將I的一、三象限和二、四象限進行互換。 (3)ifft2 ifft2函式用於計算圖象的二維傅立葉反變換,其語法格式為: B = ifft2(I) B = ifft2(A)返回圖象I的二維傅立葉反變換矩陣,輸入圖象I和輸出圖象B大小相同。其語法格式含義與fft2函式的語法格式相同,可以參考fft2函式的說明。 conv2 MATLAB中提供了卷積運算的函式命令conv2,其語法格式為:   C = conv2(A,B) C = conv2(A,B)返回矩陣A和B的二維卷積C。若A為ma×na的矩陣,B為mb×nb的矩陣,則C的大小為(ma+mb+1)×(na+nb+1)。 例: A=magic(5) A =   17  24  1   8  15   23  5   7  14  16    4    6  13  20  22     10  12    19  21  3   11 18    25   2   9 >> B=[1 2 1 ;0 2 0;3 1 3] B =    1   2   1    0   2   0    3   1   3 >> C=conv2(A,B) C =   17  58  66  34  32  38  15   23  85  88  35  67  76  16   55  149  117  163  159  135  67   79  78  160  161  187  129  51   23  82  153  199  205  108  75   30  68  135  168  91  84   9   33  65  126  85  104  15  27 imfilter 語法:g=imfilter(f, w, filtering_mode, boundary_options, size_options) 說明:此函式用指定的模板實現對指定影象的空間濾波。f為待進行空間濾波的影象,w為濾波模板 濾波型別(filtering_mode) 'corr'    濾波器通過使用相關來完成。該值是預設值。 'conv'    濾波器通過使用卷積來完成 邊界填充選項(boundary_options)      P   輸入影象的邊界通過用值P來擴充套件。P的預設值為0。 'replicate'    影象大小通過複製外邊界的值來擴充套件。 'symmetric'    影象大小通過反射其邊界來擴充套件。 'circular'     影象大小通過將影象看成是二維周期函式的一個週期來擴充套件 大小選項(size_options) 'full'    輸出影象的大小與被填充後圖像的大小相同 'same'    輸出影象的大小與輸入影象的大小相同 注:imfilter與filter2區別 imfilter 可進行多維影象(RGB等)進行空間濾波,且可選引數較多 filter2 只能對二維影象(灰度圖)進行空間濾波 %例程 clc originalRGB = imread('peppers.png');  h = fspecial('laplacian');  filteredRGB = imfilter(originalRGB,h);  figure, imshow(originalRGB) figure, imshow(filteredRGB) filter2 MATLAB影象處理工具箱提供了基於卷積的圖象濾波函式filter2,filter2的語法格式為: Y = filter2(h,X) 其中Y = filter2(h,X)返回影象X經濾波運算元h濾波後的結果,預設返回影象Y與輸入影象X大小相同。其實filter2和conv2是等價的。MATLAB在計算filter2時先將卷積核旋轉180度,再呼叫conv2函式進行計算。  fspecial fspecial函式用於建立預定義的濾波運算元(掩膜),其語法格式為: h = fspecial(type) h = fspecial(type,parameters) 引數type制定運算元型別,parameters指定相應的引數,具體格式為: type='average',fspecial('average',[r c]),大小為rxc的矩形均值濾波器,預設值為[3 3]。 type= 'gaussian',fspecial('gaussian',[r c],sigma),大小為rxc的高斯低通濾波器,引數有兩個,[r c]表示模版尺寸,預設值為[3 3],sigma表示濾波器的標準差,單位為畫素,預設值為0.5。 type= 'laplacian',fspecial('laplacian',alpha)大小為3x3為拉普拉斯濾波器,引數為alpha,用於控制拉普拉斯運算元的形狀,取值範圍為[0,1],預設值為0.2。 type= 'log',fspecial('log',[r c],sigma),為拉普拉斯-高斯(LoG)運算元,引數有兩個,[r c]表示模版尺寸,預設值為[5 5],sigma為濾波器的標準差,單位為畫素,預設值為0.5 type= 'prewitt',fspecial('prewitt'),大小為為3x3的prewitt運算元掩膜Pv,它僅為垂直梯度(並非計算完整的Prewitt梯度),用於邊緣提取,水平梯度掩膜為其轉置。 type= 'sobel',fspecial('sobel'),為著名的sobel運算元,大小為為3x3的sobel運算元掩膜Sv,僅為垂直梯度(並非計算完整的Sobel梯度),用於邊緣提取,水平梯度掩膜為其轉置。 type= 'unsharp',為對比度增強濾波器,引數alpha用於控制濾波器的形狀,範圍為[0,1],預設值為0.2。 注:fspecial僅僅是定義了濾波運算元h,要想進行以該運算元為掩膜的二維影象卷積運算(濾波),還需要使用filter2。 綜合例程: clc  %對原圖象進行加噪  A=imread('cameraman.tif');  B=imnoise(A,'salt & pepper') ; %用fspecial和filter2命令實現'gaussian','laplacian'濾波  h=fspecial('gaussian',[3,3],0.5)    % 定義濾波運算元h X=filter2(h,B)/255;   % 卷積/濾波運算 figure,imshow(X),title('gaussian濾波');  k=fspecial('laplacian',0.2)    % 定義濾波運算元k Y=filter2(k,B);  figure,imshow(Y),title('laplacian濾波'); medfilt2 在MATLAB影象處理工具箱中,提供了medfilt2函式用於實現中值濾波。 medfilt2函式的語法格式為: B = medfilt2(A)       用3×3的濾波視窗對影象A進行中值濾波。 B = medfilt2(A,[m n])       用指定大小為m×n的視窗對影象A進行中值濾波。 edge MATLAB的影象處理工具箱中提供的edge函式可以實現檢測邊緣的功能,其語法格式如下: BW = edge(I,'sobel') BW = edge(I,'sobel',direction) BW = edge(I,'roberts') BW = edge(I,'log') 這裡BW = edge(I,'sobel')採用Sobel運算元進行邊緣檢測。BW = edge(I,'sobel',direction)可以指定運算元方向,即: direction=’horizontal’,為水平方向; direction=’vertical’,為垂直方向; direction=’both’,為水平和垂直兩個方向。 BW = edge(I,'roberts')和BW = edge(I,'log')分別為用Roberts運算元和拉普拉斯高斯運算元進行邊緣檢測。 例:用三種運算元進行邊緣檢測。 I=imread('eight.tif'); imshow(I) BW1=edge(I,'roberts'); figure ,imshow(BW1),title('用Roberts運算元') BW2=edge(I,'sobel'); figure,imshow(BW2),title('用Sobel運算元 ') BW3=edge(I,'log'); figure,imshow(BW3),title('用拉普拉斯高斯運算元')