天天看點

利用Matlab進行圖像處理

1.   前言

MATLAB是Math Works公司于1982年推出的一套高性能的數值計算和可視化軟體,它集數值分析、矩陣運算、信号處理和圖形顯示于一體,構成了一個友善的,界面友好的使用者環境。MATLAB的推出得到了各個領域專家學者的廣泛關注,其強大的擴充功能為各個領域的應用提供了基礎。由各個領域的專家學者相繼推出了MATLAB工具箱,而且工具箱還在不斷的增加,這些工具箱給各個領域的研究和工程應用提供了有力的工具。借助于這些“巨人肩上的工具”,各個層次的研究人員可直覺、友善地進行分析、計算及設計工作。進而大大地節省了時間。

2.  本文所用到的MATLAB指令

imread();  image();  whos; for;  randn();  double();  uint8();  cat();  dwt2();

關于上述的指令使用方法可以參考一些MATLAB方面的書籍或者用MATLAB自帶的幫助(help)指令.

如  我想知道dwt2()指令的使用方法 可以執行下面的指令

>> help dwt2

系統就會告訴你它的使用要求和方法,如果系統說找不到對應的幫助檔案,那就可能是你裝的MATLAB裡面沒有這個指令,那很可能這個指令就不能使用

. 本文所用到的圖像都是作者直接把圖像檔案放到Matlab的work子目錄裡面的。如果直接在Matlab上運作作者所寫的代碼,肯定不會通過。不過Matlab自己也帶有圖像,查閱一下相關的資料,就很容易明白怎麼去做。

3. 程式和實驗結果

>> [x,map]=imread('lena.bmp');

>> image(x);colormap(map);

>> whos x

  Name      Size        Bytes  Class     

  x       256x256       65536  uint8 array 

Grand total is 65536 elements using 65536 bytes

利用Matlab進行圖像處理

  圖1為運作結果                               

                圖1                     

⑵.圖像的旋轉

① >> image(x');colormap(map);   x’是x的轉置

② >> [x,map]=imread('lena.bmp');

>> for i=1:128

for j=1:256

t=x(i,j);

x(i,j)=x(256-i+1,j);

x(256-i+1,j)=t;

end

end

>> image(x);colormap(map);

①和②的運作結果,自己先想想應該是什麼一個結果,然後再到電腦上實作一下,看看是否與自己的想法一緻。

③>> [x,map]=imread('lena.bmp');    

>> for i=1:128

for j=1:256

x(i,j)=x(256-i+1,j);

end

end

>> image(x);colormap(map);

運作結果如圖2

利用Matlab進行圖像處理

                                       圖2

④ >> [x,map]=imread('lena.bmp');              

>> b=randn(256);

>> x=double(x)*b;

>> image(x);colormap(map);

運作結果将是原圖像變成了一個模糊的一個圖像,和原圖像完全不一樣。

⑤ >> det(b) 

ans = -5.3438e+252

>> image(x*inv(b));colormap(map);

   我們将會看到,圖像又被還原成了原來的圖像。

.通過這幾個例子,可以看出利用矩陣的知識來處理圖像,是很友善的,當然矩陣有很多變換方式,有興趣的自己可以做一些變換,看看得到什麼效果.

⒋ MATLAB在小波中的應用

MATLAB工具箱中,有專門的小波處理圖像的函數指令,這對我們對圖像利用小波的知識進行相應的變換提供了友善,這裡我們隻是對灰階圖像和彩色圖像進行小波分解。限于篇幅,沒有把運作結果顯示在文章中。

  • 灰階圖像的分解

① >> [x,map]=imread('lena.bmp');          >> [ca,ch,cv,cd]=dwt2(x,'db1');

>> image([ca,ch;cv,cd]);colormap(map);      

② >>image([ca,4*ch;4*cv,4*cd]);colormap(map);

 對後面的三個都乘以一個數,主要是為了能看清楚這三個分量。                                   

⑵ 對彩色圖像的分解

彩色圖像在存儲在電腦上是以三位矩陣的方式存儲的,關于圖像的存儲方法自己可以查閱相關的資料.

     MATLAB提供的小波分解函數一般隻對二維矩陣可以進行分解和重構;根據彩色圖像成像的原理,我們把彩色圖像的RGB三個分量先提出來,對三個分量進行分解,然後再加起來,就得到了彩色圖像的分解。MATLAB也提供了從三維矩陣提取二維矩陣的方法.

① >> [x,map]=imread('Barbara.bmp');

>> image(x);colormap(map);

② >> [x,map]=imread('Barbara.bmp');

>> image(x);colormap(map);

>> a=x(:,:,1);

>> b=x(:,:,2);

>> c=x(:,:,3);

>> [ca,ch,cv,cd]=dwt2(a,'db1');

>> [ca1,ch1,cv1,cd1]=dwt2(b,'db1');

>> [ca2,ch2,cv2,cd2]=dwt2(c,'db1');

>> B=uint8(cat(3,ca,ca1,ca2));

>> B1=uint8(cat(3,ch,ch1,ch2));

>> B2=uint8(cat(3,cv,cv1,cv2));

>> B3=uint8(cat(3,cd,cd1,cd2));

>> image([B,B1;B2,B3]);colormap(map);

三個分量看得不是很明顯;我們适當地擴大分量,來看一下效果

B1=uint8(cat(3,4*ch,4*ch1,4*ch2));

B2=uint8(cat(3,4*cv,4*cv1,4*cv2));

B3=uint8(cat(3,4*cd,4*cd1,4*cd2));

image([B,B1;B2,B3]);colormap(map);

實驗結果可以看出,其它三個被突出了。                                        

為了說明a,b,c是原來彩色圖像的三個RGB分量,我們可以用a,b,c再組合成原來的彩色的圖像.

>> image(cat(3,a,b,c));colormap(map);

 運作結果可以看出,和原來的彩色圖像是一樣的。                                             

⒌ 結束語

   本文隻是進行了一些簡單的圖像處理,Mtalab軟體本身還包含一些複雜的圖像處理指令,如邊緣檢測,圖像的增強等等,另外,對圖像進行了小波分解以後,還可以進行圖像的壓縮,還可以利用二進小波變換來求圖像的奇異點。總之,Mtalab作為一個強大的資料處理軟體,

為我們進行科學研究提供了極大的友善。