一些圖像處理函數用法(精華)

【轉自】 http://www.cnblogs.com/wuxinrui/archive/2011/04/14/2016027.html

% 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('用拉普拉斯高斯算子')

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