首頁 > 其他

matlab互動式程式設計範例:[1]數位影像處理

2019-12-25 17:36:45

MATLAB是美國MathWorks公司出品的商業數學軟體,用於演算法開發、資料視覺化、資料分析以及數值計算的高階技術計算語言和互動式環境,主要包括MATLAB和Simulink兩大部分。

1

運用互動式的設計方法,把直方圖-Cameraman試驗 及拉普拉斯濾波器影象增強試驗結合一塊組成一個MATLAB影象處理系統小系統,兩個試驗分別在test1.m 和test2.m檔案中,總的系統呼叫在program.m檔案中。

為了好對比,每一個試驗的如果都以subplot()的方式,共同顯示在表單中。如下圖

在對於test2.m裡的拉普拉斯濾波器影象增強試驗  採用互動的方法自主輸入不同的奇數方陣 還加入了數值型別判別異常冗錯功能。


2

對於直方圖-Cameraman試驗的主程式設計

%注意

%K = im2gray(K);

%H=histeq(K);

%histeq處理gray影象

clear;

close all;

a=imread('Cameraman.jpg');       %讀取影象至工作空間

         

subplot(3,3,1);

imshow(a);

title('Cameraman');

b=rgb2gray(a);           %RGB轉換為灰度影象

subplot(3,3,2);

imshow(b);                      %顯示影象

title('實驗1 灰度影象');

subplot(3,3,3);

imhist(b);

%imshow(j);

title('實驗2 灰度直方圖');

J=imadjust(b,[0.3,0.7],[0,1],1);

subplot(3,3,4),imshow(J);

title(' 實驗3 用 g(m,n)=a’+(b’-a’)* f(m,n) /(b-a)進行變換 ');

subplot(3,3,5);

g=im2bw(a,0.7);

imshow(g);

title(' 實驗4 影象二值化');

subplot(3,3,6);

w=histeq(b);

%K = im2gray(K);

%H=histeq(K);

%histeq處理gray影象

imhist(w);

title(' 實驗5 利用直方圖均衡化進行影象增強');

而後儲存為test1.m如下圖:


3

拉普拉斯濾波器影象增強試驗的主程式設計

f1=imread('moon.tif');

subplot(2,2,1);

w1=fspecial('laplacian',0);

w0=[1 1 1;1 -8 1;1 1 1];

f1=im2double(f1);

g1=f1-imfilter(f1,w1,'replicate');

imshow(f1);

title('原影象');

subplot(2,2,2);

g2=f1-imfilter(f1,w0,'replicate');

imshow(g2);

title('3*3中心為-8的拉普拉斯濾波器增強的影象');

while 1

n=input('請輸入一個奇數 例n=5, 9, 15, 25n n=');

try

if rem(n,2)==0

assert();

end

A=ones(n);

m=(n+1)/2;

n1=n^2;

n1=1-n1;

disp('你輸入的數對應的中心值是:');disp(n1);

A(m,m)=n1;

g3=f1-imfilter(f1,A,'replicate');

subplot(2,2,3);

imshow(g3);

title('對比測試影象');

catch

disp('你輸入的不是奇數');

end

s=input('是否結束拉普拉斯濾波器影象增強對比試驗n y代表結束返回主選單 n代表繼續試驗 例:n=y or nn n=','s');

if s=='y'

disp('結束拉普拉斯濾波器影象增強對比試驗,返回主選單');

break;

end %if

end  %while

而後儲存為test2.m如下圖:


4

對於拉普拉斯濾波器影象增強試驗,為了解決在n=input('請輸入一個奇數例n=5, 9,15, 25n n=');語句執行中,使用者輸入的不是奇數,想到了用MATLAB中的異常機制,try catch end 其中為了讓不是奇數自行丟擲異常而被 catch捕獲而執行catch中的語句我想到了用一個if end 來自行執行assert();丟擲異常因為assert()不是MATLAB中的語言所以一定會丟擲錯誤這樣就可以變向的達到自丟擲異常的作用了if rem(n,2)==0?assert();end?? 如果不是奇數就執行 assert 函數,catch收到異常就進行冗錯

5

互動式的主程式裡,主要運用一個switch語句來處理使用者的不同輸入 ,主程式program.m如下

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%運用互動式的設計方法,把直方圖-Cameraman試驗 及拉普拉斯濾波器影象增強試驗結合

%一塊組成一個MATLAB影象處理系統小系統,兩個試驗分別在test1.m 和test2.m檔案

%中,總的系統呼叫在program.m檔案中。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

disp('………………………………歡迎使用MATLAB影象處理系統………………………………');

disp('使用說明:請輸入一個數位進行選擇 0 代表:直方圖-Cameraman試驗 '); 

disp('1代表:拉普拉斯濾波器影象增強試驗 例num=0,1  '); 

disp('Designed by wangxiaobo王曉博 email:1wangxiaobo@163.com');

while 1

num=input('請輸入一個數位進行選擇例num=0, 1n num=');

switch num

case 0

disp('直方圖-Cameraman試驗');

 test1();

case 1

disp('拉普拉斯濾波器影象增強試驗');

 test2();

otherwise

end

s=input('是否結束MATLAB影象處理系統使用n n=y or nn n=','s');

if s=='y'

disp('謝謝使用');

exit;

break;

end

disp('………………………………主選單………………………………n');

end


6

兩個試驗分別在test1.m 和test2.m檔案中,總的系統呼叫在program.m檔案中。

使用方法:

第一步在command windows 裡輸入program  執行這個檔案。(原始碼要放到MATLAB的work工作目錄中,以待執行路徑搜尋)命令視窗如下圖所示


7

使用說明:輸入一個數位進行選擇

0 代表:直方圖-Cameraman試驗 

1代表:普拉斯濾波器影象增強試驗

所以上圖輸入的是0直方圖-Cameraman試驗執行,結果如下圖:


8

第二步   命令表單現在顯示的是

是否結束MATLAB影象處理系統使用

 n=yor n

 n=

就是說如果選擇y就結束程式的執行,如選擇n則繼續。回到主選單。我可以選擇0 代表:直方圖-Cameraman試驗 1代表:普拉斯濾波器影象增強試驗 ,這次選擇 1

提示如下圖:


9

進行拉普拉斯濾波器影象增強試驗,要我們選擇濾波的矩陣是多大的,我們可以選5

輸出中心值是-24,增強效果如下圖:


10

命令視窗提示我們是不是要結束拉普拉斯濾波器影象增強試驗 我們選n代表不結束,繼續試驗,如下圖命令視窗,


11

輸入9後的影象效果如下圖:


12

我們可以接著上面的樣子,輸入15,25,23,33,等分別以25 和33分效果展示如下圖25 33.



13

結束試驗可以選擇y代表 想結束,返回到主選單 再選擇y 退出matlab程式執行。

IT145.com E-mail:sddin#qq.com