

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 基于MATLAB的圖像處理的課程設計</p><p><b> 目錄</b></p><p> 課程設計目的…………………..………………….…………3</p><p> 課程設計要求………………….………………………….….3</p><p> 課程設計的內容………………..…………………
2、…….……3</p><p> 題目分析…………………………………………….………..3</p><p> 總體設計……………….…………………………….……….4</p><p> 具體設計……………………………………………..…….…5</p><p> 文件……………….………………………………….……….5</p>
3、<p> 6.1.1、打開………..…………………………………….…………5</p><p> 6.1.2、保存…………………………..………………….…………5</p><p> 6.1.3、退出……………………..……………………………….…5</p><p> 6.2、編輯…………………………..…………………………………5</p&
4、gt;<p> 6.2.1、灰度………………………..………………….……………5</p><p> 6.2.2、亮度………………………..………………….……………6</p><p> 6.2.3、截圖…………………………..……………….……………7</p><p> 6.2.4、縮放…………………………..…………….………………7<
5、;/p><p> 6.3、旋轉…………………………………..…………………………9</p><p> 6.3.1、上下翻轉…………………….…………….………………9</p><p> 6.3.2、左右翻轉………………….…………….…………………9</p><p> 6.3.3任意角度翻轉…………………………….…………………9<
6、/p><p> 6.4、噪聲………………………………..…………..………………10</p><p> 6.5、濾波……………………………………..………..……………10</p><p> 6.6、直方圖統(tǒng)計……………………………………………………11</p><p> 6.7、頻譜分析………………………………………..…..…………1
7、2</p><p> 6.7.1、頻譜圖………………………… …… …… ……….……12</p><p> 6.7.2、通過高通濾波器………………… …… .……………….12</p><p> 6.7.3、通過低通濾波器……………………………….. ……….13</p><p> 6.8、灰度圖像處理………………………………………
8、… . …….14</p><p> 6.8.1、二值圖像……………………………………………….. .14</p><p> 6.8.2、創(chuàng)建索引圖像……………………………………… .…..14</p><p> 6.9、顏色模型轉換……………………………..… ..……………14</p><p> 6.10、操作界面設計……………
9、………………………..…………15</p><p> 程序調試及結果分析………………….……………………15</p><p> 心得體會…………………………….………………………16</p><p> 參考文獻…………………………….………………………17</p><p> 附錄………………………….………………………………18<
10、;/p><p> 基于MATLAB的圖像處理的課程設計</p><p><b> 摘要: </b></p><p> 數(shù)字圖像處理技術是20世紀60年代發(fā)展起來的一門新興學科,隨著圖像處理理論和方法的進一步完善,使得數(shù)字圖像處理技術在各個領域得到了廣泛應用,并顯示出廣闊的應用前景。MATLAB既是一種直觀、高效的計算機語言,同時又是一個科學計
11、算平臺。它為數(shù)據(jù)分析和數(shù)據(jù)可視化、算法和應用程序開發(fā)提供了最核心的數(shù)學和高級圖形工具。根據(jù)它提供的500多個數(shù)學和工程函數(shù),工程技術人員和科學工作者可以在它的集成環(huán)境中交互或編程以完成各自的計算。MATLAB中集成了功能強大的圖像處理工具箱。由于MATLAB語言的語法特征與C語言極為相似,而且更加簡單,更加符合科技人員對數(shù)學表達式的書寫格式,而且這種語言可移植性好、可擴展性強,再加上其中有豐富的圖像處理函數(shù),所以MATLAB在圖像處理
12、的應用中具有很大的優(yōu)勢。</p><p> 關鍵詞:MATLAB,數(shù)字圖像處理</p><p><b> 課程設計目的</b></p><p> 綜合運用MATLAB工具箱實現(xiàn)圖像處理的GUI程序設計。</p><p><b> 課程設計要求</b></p><p>
13、 1)熟悉和掌握MATLAB 程序設計方法</p><p> 2)掌握MATLAB GUI 程序設計</p><p> 3)學習和熟悉MATLAB圖像處理工具箱</p><p> 4)學會運用MATLAB工具箱對圖像進行處理和分析</p><p><b> 課程設計的內容</b></p><
14、p> 學習MATLAB GUI程序設計,利用MATLAB圖像處理工具箱,設計和實現(xiàn)自己的Photoshop 。要求:按照軟件工程方法,根據(jù)需求進行程序的功能分析和界面設計,給出設計詳細說明。然后按照自己擬定的功能要求進行程序設計和調試。 </p><p> 以下幾點是程序必須實現(xiàn)的功能。</p><p> 1)圖像的讀取和保存。</p><p> 2)
15、設計圖形用戶界面,讓用戶能夠對圖像進行任意的亮度和對比度變化調整,顯示和對比變換前后的圖像。</p><p> 3)設計圖形用戶界面,讓用戶能夠用鼠標選取圖像感興趣區(qū)域,顯示和保存該選擇區(qū)域。</p><p> 4)編寫程序通過最近鄰插值和雙線性插值等算法將用戶所選取的圖像區(qū)域進行放大和縮小整數(shù)倍的操作,并保存,比較幾種插值的效果。</p><p> 5)圖像
16、直方圖統(tǒng)計和直方圖均衡,要求顯示直方圖統(tǒng)計,比較直方圖均衡后的效果。</p><p> 6)能對圖像加入各種噪聲,并通過幾種濾波算法實現(xiàn)去噪并顯示結果。比較去噪效果。</p><p><b> 題目分析</b></p><p> 信息化社會中,計算機在各種信息處理中發(fā)揮著重要的作用。我們可以借助計算機,對數(shù)字圖像進行處理,以達到不同的效果
17、。根據(jù)題目的要求,除了實現(xiàn)要求的功能外,還有很多的功能需要用到。</p><p> ?。?)、將一個RGB圖像轉換為灰度圖像。</p><p> ?。?)、可以對圖像做各種變換,如旋轉等。</p><p> ?。?)、有時并不需要圖像顯示其細節(jié)部分,只要其輪廓,這時候不要很高的灰度級??梢园褕D像轉換為二值圖像,進行圖像腐蝕,或是創(chuàng)建索引圖像等。</p>
18、<p> ?。?)、分析一個圖像的頻譜特征,利用傅里葉變換,將圖像從空間域變換到頻域,然后進行各種處理,經(jīng)過高通濾波器或是低通濾波器。</p><p> ?。?)、為了科學地定量描述和使用顏色,人們提出了各種顏色模型,按用途可分為三類:計算顏色模型,視覺顏色模型和工業(yè)顏色模型。有時為了不同的需要,要對顏色模型進行轉換。</p><p><b> 總體設計</b
19、></p><p> 由于要實現(xiàn)的功能并不是很多,所以在排版的過程中,把各個功能都安排在目錄欄上,整體安排如下圖所示:</p><p> 同時在調節(jié)亮度時,雖然可以同對話框的形式輸入調節(jié)的比例系數(shù),但是這樣效果不好了,不容易調節(jié),因此這里考慮用滾動條來調節(jié)。因此,總體的設計界面如下圖所示:</p><p><b> 具體設計</b>
20、</p><p><b> 文件</b></p><p><b> 6.1.1、打開</b></p><p> 為了讓使用者更方便的使用,所以在設計的時候,通過對話框的形式來選擇文件,選擇uigetfile函數(shù)來實現(xiàn),uigetfile函數(shù)顯示一個打開文件對話框,該對話框自動列出當前路徑下的目錄和文件,由于這個GUI
21、程序的操作對象是圖像文件,所以設置這里的缺省后綴名為“.bmp”。</p><p> Uigetfile函數(shù)的調用格式為[name,path]=yigetfile(…), 在按下對話框中的執(zhí)行按鈕“打開”后,返回選擇的文件名和路徑,分別保存到“name”和“path”中。如果按下取消按鈕或是發(fā)生錯誤,則返回值是0。 根據(jù)返回值的情況,如果是0,則彈出提示錯誤的對話框,否則,通過imread函數(shù)讀出圖像數(shù)據(jù),把圖
22、像數(shù)據(jù)賦值給全局變量handles.img。</p><p><b> 6.1.2、保存</b></p><p> 同樣也通過對話框的形式來保存圖像數(shù)據(jù),通過uigetfile函數(shù)選擇文件名和路徑,用getimage(gca)取出坐標2變換后的圖像數(shù)據(jù)保存到變量i,最后用imwrite函數(shù),把數(shù)據(jù)i存到指定的文件。</p><p><
23、b> 6.1.3、退出</b></p><p> 退出比較簡單,程序如下所示:</p><p><b> clc;</b></p><p> close all;</p><p> close(gcf); </p><p><b> 編輯</b
24、></p><p><b> 6.2.1、灰度</b></p><p> 由于RGB圖像是三維圖像,所以圖像數(shù)據(jù)是一個三維數(shù)組,為了顯示灰度圖像,把三維圖像降為二維,可以只取其中的二維數(shù)據(jù),實現(xiàn)方法程序為:</p><p> y=(handles.img(:,:,1)); %當然也可以選擇(:,:,2) 或(:,:,3)&l
25、t;/p><p> imshow(y);</p><p> 但是這樣的話,根據(jù)程序所選的不同,圖像數(shù)據(jù)也不同,顯示也就不一樣。</p><p> 另一種方法就是,運用rgb2gray函數(shù)實現(xiàn)彩色圖像到灰度圖像的轉換。程序為:</p><p> y=rgb2gray(handles.img); </p><p&
26、gt; imshow(y);</p><p> 這個程序只能用于RGB圖像轉換灰度圖像,當原始圖像本來就是灰度圖像時,運行該程序時就會出錯,但是使用者在使用時有時并不知道這些,為了使該程序更加完善,應該在使用者原先圖像時灰度圖像時使用該功能時,應該要顯示提示類信息。所以在開始時應該要有一個RGB圖像或是灰度圖像的判斷過程。完整的程序如下: </p><p> i
27、f isrgb(handles.img) </p><p> y=rgb2gray(handles.img); </p><p> imshow(y);</p><p><b> else</b></p><p> msgbox('這已經(jīng)是灰度圖像','轉換失敗');&l
28、t;/p><p><b> end</b></p><p> 如果原圖是RGB,執(zhí)行該操作的結果如下圖:</p><p> 如果原圖本身已經(jīng)是灰度圖像了,執(zhí)行該操作彈出如 右圖所示的提示對話框</p><p><b> 6.2.2、亮度</b></p><p>
29、 用imadjust函數(shù),其調用格式如下:</p><p> g=imadust(f,[low_in high_in],[low_out high_out]),gamma)</p><p> gamma 表示映射性質,默認值是1 表示線性映射。</p><p> 由于該函數(shù)有五個參數(shù)需要輸入,為了方便用戶改變,所以這里設計一個輸入對話框,用戶通過對話框把五
30、個參數(shù)賦值給[low_in high_in],[low_out high_out],gamma這五個參數(shù),如下一組命令建立了如圖所示的輸入對話框:</p><p> prompt={'輸入?yún)?shù)1','輸入?yún)?shù)2','輸入gamma'};</p><p> defans={'[0 0.7]','[0 1]',
31、'1'};</p><p> p=inputdlg(prompt,'輸入?yún)?shù)',1,defans);</p><p> 但是,這種方法并不能很好的讓用戶能夠對圖像進行任意的亮度和對比度變化調整,有時并不事先知道參數(shù)的值要多少,也不關心,而是任意調節(jié)的,直到滿意為止。所以應該用滑動條來調節(jié)圖像的亮度和對比度,這樣更適合用戶的使用習慣。</p>
32、<p> 由于imadjust函數(shù)有五個參數(shù),所以原則上需要設計五個滑動條來調節(jié)對比度,這對用戶來說顯然比較麻煩,因此在設計的時候固定其中的三個參數(shù),通過調節(jié)兩個參數(shù)的值來改變亮度和對比度。</p><p> [0 handles.beta],[0 1],handles.gm,這里的變量handles.beta和handles.gm就通過滑動條得到,滑動條設計如下圖:</p><
33、;p> 亮度調整的tag名為ld,取值范圍0~1,gamma值的tag名為gamma,取值范圍為0~5。獲取滑動條參數(shù)的程序如下:</p><p> handles.beta=get(handles.ld,'value');</p><p> handles.gm=get(handles.gamma,'value');</p>&l
34、t;p> 執(zhí)行該操作,調節(jié)滑動條到上圖所示位置,結果如下圖:</p><p><b> 6.2.3、截圖</b></p><p> 在MATLAB中,用函數(shù)imcrop實現(xiàn)對圖像的剪切操作。該操作剪切的是圖像中的一個矩形子圖,用戶可以通過參數(shù)指定這個矩形四個頂點的坐標,也可以交互地用鼠標選取這個矩形。</p><p> Imcro
35、p函數(shù)的調用格式如下:</p><p> y=imcrop(handles.img);</p><p> 不管handles.img是三維的還是二維數(shù)據(jù),該函數(shù)都能進行操作。下圖就是對三維圖像的截圖:</p><p><b> 6.2.4、縮放</b></p><p> 在MATLAB中,用函數(shù)imresize來
36、實現(xiàn)對圖像的放大或縮小。插值方法可選用三種方法,最近鄰插值,雙線性插值,雙三次插值。</p><p> 該函數(shù)的調用格式如下:</p><p> B=imresize(A,m,method)</p><p><b> 其中:</b></p><p> 參數(shù)method用于指定插值的方法,可選的值為“nearest
37、”(最近鄰法),“bilinear”(雙線性插值)、“bicubic”(雙三次插值),缺省值為“nearest”。</p><p> B=imresizee(A.m,method)表示返回原圖A的m倍放大圖像(m小于1時實際上是縮小);</p><p> 下圖就是采用鄰近插值法的放大和縮小圖像,參數(shù)值保持默認設置:</p><p> 雖然處理后看不出放大的效果
38、,這是由于坐標軸限制的原因,如果把處理后的圖片保存起來,再把處理后的文件打開,就可以看到比較明顯的放大效果。</p><p><b> 縮小后的結果如下:</b></p><p><b> 旋轉</b></p><p> 6.3.1、上下翻轉</p><p> 函數(shù)flipud是實現(xiàn)一個二維
39、矩陣的上下翻轉,如</p><p> a=[1 2;3 4],經(jīng)過該函數(shù)處理后,原矩陣變?yōu)閇3 4;1 2];所以利用該函數(shù)也可以對圖像進行上下翻轉處理,但由于該函數(shù)針對二維數(shù)據(jù)的處理,所以在寫程序時,要對RGB圖像和灰度圖像分開處理,這就要用到isrgb函數(shù)來判斷,如果是灰度圖像,則可以直接用這個函數(shù)進行處理,否則就要對RGB圖像進行降維處理, for k=
40、1:3 </p><p> y(:,:,k)=flipud(x(:,:,k));</p><p><b> end</b></p><p><b> 處理結果如圖:</b></p><p> 6.3.2、左右翻轉</p><p> 對圖像的左右翻轉也可以用flipl
41、r函數(shù)來處理,同樣的,也要對灰度和彩色圖像分開處理,處理結果如圖:</p><p> 6.3.3任意角度翻轉</p><p> 用函數(shù)imrotate來實現(xiàn)對圖像的插值旋轉。</p><p> 該函數(shù)的調用格式如下:</p><p> B=imrotate(A,angle,method,’crop’)</p><p
42、> 其中,參數(shù)method用于指定插值的方法,可選的值可以有三種,分別為鄰近插值,雙線性插值,雙三次插值,缺省時為鄰近插值,參數(shù)angle代表旋轉的角度。</p><p> 一般來說,旋轉后的圖像會比原圖大,用戶可以指定“crop”參數(shù)對旋轉后的圖像進行剪切(取圖像的中間部分),使返回的圖像與原圖大小相同。執(zhí)行結果為:</p><p><b> 噪聲</b>
43、;</p><p> 經(jīng)常用到的噪聲有三種,高斯噪聲,椒鹽噪聲,乘性噪聲,可以通過以下三個函數(shù)來實現(xiàn):</p><p> y=imnoise(handles.img,'gaussian',p1,p2);%高斯噪聲</p><p> y=imnoise(x,'salt & pepper',p1); %椒鹽
44、噪聲</p><p> y=imnoise(handles.img,'speckle',p1); %乘性噪聲</p><p> p1,p2的參數(shù)也通過輸入對話框的形式得到,原圖加入高斯噪聲后結果如下所示:</p><p><b> 濾波</b></p><p> 這里選擇三種濾波方法,&l
45、t;/p><p> k=medfilt2(handles.noise_img);%中值濾波</p><p> k=wiener2(handles.noise_img,[5,5]);%自適應濾波</p><p> k=filter2(fspecial('average',3),handles.noise_img)/255;%平滑濾波</p>
46、;<p> 同樣的,這些函數(shù)也是針對二維數(shù)據(jù),所以要先判斷是彩色圖像還是灰度圖像,然后分別進行處理,下面是對彩色圖像的自適應濾波處理:</p><p> i=handles.noise_img;</p><p> if isrgb(i) </p><p> a=handles.noise_img(:,:,1);</p><p
47、> b=handles.noise_img(:,:,2);</p><p> c=handles.noise_img(:,:,3);</p><p> k(:,:,1)=wiener2(a,[5,5]);</p><p> k(:,:,2)=wiener2(b,[5,5]);</p><p> k(:,:,3)=wiener2
48、(c,[5,5]);</p><p> imshow(k);</p><p><b> 執(zhí)行結果如圖:</b></p><p> 對其他方法的濾波程序也類似,由于把各個濾波方法放在一個選擇框里,所以程序要用以下的選擇語句:</p><p> switch str</p><p> cas
49、e '中值濾波'</p><p> case '自適應濾波' </p><p> case '平滑濾波'</p><p><b> end</b></p><p><b> 直方圖統(tǒng)計</b></p><p> 用i
50、mhist函數(shù)對圖像數(shù)據(jù)進行直方圖統(tǒng)計,</p><p> x=imhist(handles.img(:,:,1));</p><p> bar(horz,x);</p><p> 其中,x矩陣的數(shù)據(jù)是0~255灰度值的統(tǒng)計個數(shù),如果直接對x矩陣數(shù)據(jù)進行圖形圖顯示,由于有256個數(shù)據(jù),在坐標系中就會很密集,為了更清楚的顯示條形圖,所以在程序設計時,把x數(shù)據(jù)進行
51、部分提取,</p><p> x1=x(1:10:256);</p><p> horz=1:10:256;</p><p> bar(horz,x1);</p><p> 除了顯示數(shù)據(jù)的直方圖統(tǒng)計外,還可以對圖像進行均衡處理,所用到的函數(shù)是histeq,這兩個函數(shù)同樣只使用于二維數(shù)據(jù),所以也要對二維和三維數(shù)據(jù)分開處理。</p&
52、gt;<p> 直方圖顯示和均衡后的圖像分別如下圖所示</p><p><b> 頻譜分析</b></p><p><b> 6.7.1、頻譜圖</b></p><p> 為了得到圖像的頻譜圖,先要對數(shù)據(jù)進行傅里葉變換,用fft2函數(shù)對二維數(shù)據(jù)進行快速傅里葉變換,同時為了更好的觀察頻譜圖,需要把fft
53、2變換后的數(shù)據(jù)進行平移,利用fftshift函數(shù),把快速傅里葉變換的DC 組件移到光譜中心。這樣圖像能量的低頻成分將集中到頻譜中心,圖像上的邊緣、線條細節(jié)信息等高頻成分將分散在圖像頻譜的邊緣。如下圖所示:</p><p> 6.7.2、通過高通濾波器</p><p> axes(handles.axes2);</p><p> x=(handles.img);
54、</p><p> if isrgb(x)</p><p> msgbox('這是彩色圖像,不能通過高通濾波器','失敗');</p><p><b> else</b></p><p> y1=imnoise(x,'gaussian');
55、 %加高斯噪聲</p><p> f=double(y1); % 數(shù)據(jù)類型轉換</p><p> k=fft2(f); % 傅立葉變換</p><p> g=fftshift(k); % 轉換
56、數(shù)據(jù)矩陣</p><p> [M,N]=size(g);</p><p><b> nn=2;</b></p><p> d0=3; %截止頻率為3</p><p> m=fix(M/2); n=fix(N/2);</p><p&
57、gt;<b> for i=1:M</b></p><p><b> for j=1:N</b></p><p> d=sqrt((i-m)^2+(j-n)^2); % 計算高通濾波器傳遞函數(shù)</p><p><b> if d<=d0</b></p><p>&
58、lt;b> h=0;</b></p><p><b> else h=1;</b></p><p><b> end</b></p><p> result(i,j)=h*g(i,j);</p><p><b> end</b></p>
59、<p><b> end</b></p><p> result=ifftshift(result);</p><p> y2=ifft2(result);</p><p> y3=uint8(real(y2));</p><p> imshow(y3); </p><p&
60、gt;<b> end</b></p><p> 6.7.3、通過低通濾波器</p><p> axes(handles.axes2);</p><p> x=(handles.img);</p><p> if isrgb(x)</p><p> msgbox('這是彩色圖像
61、,不能通過低通濾波器','失敗');</p><p><b> else</b></p><p> y1=imnoise(x,'salt & pepper'); % 疊加椒鹽噪聲</p><p> f=double(y1); % 數(shù)據(jù)類型轉換,不支持圖像的無符號整型的計算</p&g
62、t;<p> g=fft2(f); % 傅立葉變換</p><p> g=fftshift(g); % 轉換數(shù)據(jù)矩陣</p><p> [M,N]=size(g);</p><p> nn=2; % 二階巴特沃斯(Butterworth
63、)低通濾波器</p><p> d0=10; %截止頻率為10</p><p> m=fix(M/2); n=fix(N/2);</p><p><b> for i=1:M</b></p><p><b> for j=1:N</b>&l
64、t;/p><p> d=sqrt((i-m)^2+(j-n)^2);</p><p> h=1/(1+0.414*(d/d0)^(2*nn));% 計算低通濾波器傳遞函數(shù)</p><p> result(i,j)=h*g(i,j);</p><p><b> end</b></p><p>&
65、lt;b> end</b></p><p> result=ifftshift(result);</p><p> y2=ifft2(result);</p><p> y3=uint8(real(y2));</p><p> imshow(y3); % 顯示濾波處理后的圖像</p><p&g
66、t;<b> end</b></p><p><b> 灰度圖像處理</b></p><p> 6.8.1、二值圖像</p><p> 用j=im2bw(x);來對灰度圖像到二值圖像的轉換。轉換結果為:</p><p> 6.8.2、創(chuàng)建索引圖像</p><p>
67、 用X = grayslice(I,n)函數(shù)來實現(xiàn),轉換后得到的圖像為:</p><p><b> 顏色模型轉換</b></p><p> 下面是RGB顏色模型到HSV模型的轉換程序:</p><p> axes(handles.axes2);</p><p> x=(handles.img);</p>
68、;<p> if isrgb(x)</p><p> HSV=rgb2hsv(x);</p><p> imshow(HSV);</p><p><b> else</b></p><p> msgbox('這是灰度圖像,不能轉換','轉換失敗');</p&g
69、t;<p><b> end</b></p><p><b> 轉換后的結果為:</b></p><p> 同樣的,轉化為ntsc和ycbcr模型,只要改為相應的函數(shù)即可。函數(shù)如下:</p><p> rgb2ntsc(x);% rgb模型轉ntsc模型</p><p> r
70、gb2ycbcr(x);% rgb模型轉ycbcr模型</p><p><b> 操作界面設計</b></p><p> 為了使整個操作界面更加的美觀,對背景顏色和字體顏色進行設置。</p><p><b> 程序調試及結果分析</b></p><p> 在程序設計過程中,碰到很多的問題。&
71、lt;/p><p> 一個函數(shù)只能對灰度圖像處理,不能對RGB圖像處理,那么如何才能對RGB圖像處理呢?</p><p> 這主要是對MATLAB函數(shù)的不夠清楚,用到的很多函數(shù)是針對二維數(shù)據(jù)的,而RGB圖像的數(shù)據(jù)是一個三維矩陣,所以處理要與灰度圖像不同,在開始的時候,我認為應該找一個能夠應用于三維矩陣的函數(shù),結果卻沒找到,后來想到可以把三維數(shù)據(jù)進行降維處理,同樣使用二維的函數(shù),只要是同樣處
72、理三次。比如,彩色圖像的濾波處理,直方圖均衡等。</p><p> 同一個操作對灰度圖像可以使用,當用戶選擇的是彩色圖像時,該操作就會出錯?</p><p> 這是由于設計程序時,本身程序是有針對性的,有些程序只能對灰度圖像有效,有些對彩色圖像有效,但是用戶并不清楚這些,所以在設計的過程中就要考慮全面,要分開設計。在本次課程設計中,我均對每個程序的開始時,用if isrgb(x)進行判
73、斷。</p><p> 在沒有加入噪聲的情況下,點擊“中值濾波”或是其它濾波,會提示錯誤?</p><p> 這是由于在濾波程序設計的過程中,開始用到的變量是handles.noise_img,而這個變量是在加入噪聲時候才定義的,所以在沒有加入噪聲的情況下,點擊各個濾波就會彈出變量沒有定義的錯誤,解決方法就是在文件打開的時候就給定義handles.noise_img=x。</p&
74、gt;<p> 本次設計存在一個比較大的問題,就是每次操作都是獨立的,比如:要對圖像加入噪聲,然后在此基礎上進行亮度調整,截圖,頻譜分析等等就不行。</p><p> 我認為應該是整個程序設計過程中對變量的設置沒有做好,應該每次操作后,把處理后的數(shù)據(jù)保存在一個全局變量,這樣還要對處理后的數(shù)據(jù)進行在處理時,只要把這個全局變量作為原始數(shù)據(jù)帶入就可。</p><p><b
75、> 心得體會</b></p><p> 1、在這次課程設計過程中,感觸很深,由于對MATLAB圖像處理的函數(shù)不熟悉,導致自己走了很多的彎路,比如在設計圖像左轉90度和右轉90度時,由于開始并不知道imrotate函數(shù),只知道上下翻轉flipud和左右翻轉fliplr函數(shù),想著要怎么用這兩個函數(shù)來實現(xiàn)左轉和右轉呢,如果當當只用矩陣轉置的話,并不能達到要求,后來想可以結合flipud和flipl
76、r函數(shù)來實現(xiàn),下面程序是實現(xiàn)左轉90度:</p><p> axes(handles.axes2);</p><p> x=(handles.img);</p><p> if isrgb(handles.img) </p><p> a=x(:,:,1);</p><p> b=x(:,:,2);</
77、p><p> c=x(:,:,3);</p><p><b> e=a';</b></p><p><b> g=b';</b></p><p><b> f=c';</b></p><p> y(:,:,1)=e;<
78、/p><p> y(:,:,2)=g;</p><p> y(:,:,3)=f;</p><p> axes(handles.axes2);</p><p> for k=1:3 </p><p> f(:,:,k)=flipud(y(:,:,k)); </p><p><b>
79、 end</b></p><p> imshow(f); </p><p><b> else</b></p><p><b> m=x';</b></p><p> y=flipud(m);</p><p> imshow(y);</p
80、><p><b> end</b></p><p> 同理,也可以通過轉置和fliplr函數(shù)實現(xiàn)右轉90度。</p><p> 但是后來發(fā)現(xiàn)其實只要用imrotate函數(shù)就可以解決問題。通過這次經(jīng)歷后,后來在設計其它程序時,盡量找MATLAB自帶的現(xiàn)成函數(shù),而不是一碰到問題就自己想算法,這樣可以節(jié)省較多的時間。</p><
81、p> 2、在理工科的專業(yè)應用背景下,用matlab 進行相關計算與仿真編程的優(yōu)勢非常突出。特定的問題處理算法,我們通常都以M文件的文本形式給定最終的解決方案,自己設計的程序是在MATLAB環(huán)境下,用MATLAB語言編寫的,這對于有安裝MATLAB軟件的計算機上運行并不存在什么問題,關鍵是一般的計算機很少有去安裝MATLAB軟件的,那么要在這些機子上運行該程序要怎么辦呢,難道要先安裝MATLAB軟件,這顯然太麻煩了,對于一個通用的
82、,比較成熟的解決方案,我們當然期望它能應用到更多的場合,而.exe (可執(zhí)行)文件可運行于所有的通用WINDOWS操作系統(tǒng),為此,將M文件轉換成.exe文件倒是個不錯的想法。</p><p> 通過查找資料,了解到在生成可執(zhí)行性文件之前,需要進行一系列編譯環(huán)境方面的配置:</p><p> 要將用Matlab語言編寫的函數(shù)文件編譯成可獨立執(zhí)行的*.exe文件(即可脫離Matalab環(huán)境
83、的執(zhí)行程序),首先要安裝和配置好Matlab Compiler,一般來說,在安裝Matlab時就已經(jīng)安裝了相應版本的Matlab Compiler。只是不同版本的Matlab,其編譯器的使用方法有一定的差異,這一點要引起一定的注意。</p><p> 在確定安裝好Matlab Compiler后,還需要對Compiler進行適當?shù)呐渲茫椒ㄊ窃贛atlab命令窗口輸入:</p><p>
84、 Mbuild –setup</p><p> 然后根據(jù)提示執(zhí)行相應的操作,使用者可根據(jù)自己計算機中現(xiàn)有編譯器的情況選擇合適的編譯器,如VC++ 6.0、VC++7.0、Bland C的編譯器等,目前Matlab好象還不支持VC++8.0(我計算機安裝的就是VC++2005,Matlab就無法識別)。當然,如果你的計算機里根本就沒有安裝其他任何語言的編譯器,也可選擇Matlab自帶的Lcc編譯器,其實這個編譯
85、器對大多數(shù)用戶已經(jīng)夠用了(我就是選擇的Matlab自帶的Lcc編譯器)。</p><p> 配置好編譯器后,自然就是對自己編寫的M文件進行編譯了。</p><p> 將M文件編譯為獨立可執(zhí)行文件的語法是:</p><p> >>mcc –m fun1.m fun2.m…..</p><p> 其中fun1就是最后的可執(zhí)行文
86、件的名稱。</p><p> 3、通過本次課程設計,使自己對MATLAB GUI設計流程有了比較深刻的體會,同時也了解了一般軟件設計的過程。在設計過程中碰到了很多的問題,通過這些問題,使自己分析問題,解決問題的能力得到了較大的提高。</p><p><b> 參考文獻</b></p><p> 鄭阿奇,曹戈,趙陽.MATLAB實用教程[M
87、].北京:電子工業(yè)出版社</p><p> 程衛(wèi)國,馮峰,姚東,徐聽.MATLAB5.3應用指南[M].北京:人民郵電出版社</p><p> 陳楊.MATLAB 6.X圖像編程與圖像處理[M].西安:西安電子科技大學出版社</p><p><b> 附錄</b></p><p> function vararg
88、out = two(varargin)</p><p> % Begin initialization code - DO NOT EDIT</p><p> gui_Singleton = 1;</p><p> gui_State = struct('gui_Name', mfilename, ...</p>&l
89、t;p> 'gui_Singleton', gui_Singleton, ...</p><p> 'gui_OpeningFcn', @two_OpeningFcn, ...</p><p> 'gui_OutputFcn', @two_OutputFcn, ...</p><p> 'gu
90、i_LayoutFcn', [] , ...</p><p> 'gui_Callback', []);</p><p> if nargin && ischar(varargin{1})</p><p> gui_State.gui_Callback = str2func(varargin{1});</p&
91、gt;<p><b> end</b></p><p> if nargout</p><p> [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});</p><p><b> else</b></p><p&g
92、t; gui_mainfcn(gui_State, varargin{:});</p><p><b> end</b></p><p> % End initialization code - DO NOT EDIT</p><p> % --- Executes just before erzhi is made visible.&
93、lt;/p><p> function two_OpeningFcn(hObject, eventdata, handles, varargin)</p><p> % This function has no output args, see OutputFcn.</p><p> ----------------------------------------
94、-----------------</p><p> %接下來是菜單的程序</p><p> ---------------------------------------------------------</p><p> function file_Callback(hObject, eventdata, handles)</p><
95、p> --------------------------------------------------------</p><p><b> %文件打開程序</b></p><p> function open_Callback(hObject, eventdata, handles)</p><p> [name,path]
96、=uigetfile({'*.bmp'},'載入圖像');</p><p> if isequal(name,0)|isequal(path,0)</p><p> errordlg('沒有選中文件','出錯');</p><p><b> return;</b></p
97、><p><b> else</b></p><p> x=imread([path,name]);</p><p> axes(handles.axes1);</p><p> imshow(x);</p><p> handles.img=x;</p><p>
98、 handles.noise_img=x;</p><p> guidata(hObject,handles)</p><p><b> end</b></p><p> ---------------------------------------------------</p><p> function s
99、ave_Callback(hObject, eventdata, handles)</p><p><b> %文件保存</b></p><p> [filename,pathname] = uiputfile('*.bmp','圖片保存為');</p><p> if isequal([filename,
100、pathname],[0,0])</p><p> errordlg('沒有保存','出錯');</p><p><b> return;</b></p><p><b> else</b></p><p> file=strcat(pathname,file
101、name);</p><p> (handles.axes2);</p><p> i=getimage(gca);</p><p> imwrite(i,file);</p><p><b> end</b></p><p> -----------------------------
102、------------------------</p><p> function exit_Callback(hObject, eventdata, handles)</p><p><b> clc;</b></p><p> close all;</p><p> close(gcf);</p>
103、;<p> ---------------------------------------------------------</p><p><b> %編輯菜單的程序</b></p><p> ------------------------------------------------------</p><p>
104、 function edit_Callback(hObject, eventdata, handles)</p><p> -------------------------------------------------</p><p> function huidu_Callback(hObject, eventdata, handles)</p><p>
105、<b> %灰度處理</b></p><p> axes(handles.axes2);</p><p> if isrgb(handles.img) </p><p> y=rgb2gray(handles.img); %RGB</p><p> imshow(y);</p>
106、<p><b> else</b></p><p> msgbox('這已經(jīng)是灰度圖像','轉換失敗');</p><p><b> end </b></p><p> --------------------------------------------------
107、----</p><p> function liangdu_Callback(hObject, eventdata, handles)</p><p><b> %亮度處理</b></p><p> prompt={'輸入?yún)?shù)1','輸入?yún)?shù)2','輸入gamma'};</p>
108、<p> defans={'[0 0.7]','[0 1]','1'};</p><p> p=inputdlg(prompt,'輸入?yún)?shù)',1,defans);</p><p> p1=str2num(p{1});</p><p> p2=str2num(p{2});</p
109、><p> p3=str2num(p{3});</p><p><b> gamma=p3;</b></p><p> x=(handles.img);</p><p> y=imadjust(x,p1,p2,gamma);</p><p> axes(handles.axes2);<
110、/p><p> imshow(y);</p><p> ------------------------------------------------------</p><p> function jietu_Callback(hObject, eventdata, handles)</p><p><b> %截圖<
111、/b></p><p> set(handles.axes2,'HandleVisibility','ON');</p><p> axes(handles.axes2);</p><p> y=imcrop(handles.img);</p><p> imshow(y); </p>
112、<p> handles.Timage=y;</p><p> ------------------------------------------------------</p><p> function fangda_Callback(hObject, eventdata, handles)</p><p> --------------
113、----------------------------------------</p><p> function lingjz_Callback(hObject, eventdata, handles)</p><p><b> %鄰近插值放大</b></p><p> axes(handles.axes2);</p>
114、<p> prompt={'輸入放大倍數(shù):'};</p><p> defans={'2'};</p><p> p=inputdlg(prompt,'輸入放大倍數(shù)',1,defans);</p><p> p1=str2num(p{1});</p><p> y=imres
115、ize(handles.img,p1,'nearest'); %最近鄰插值法放大</p><p> imshow(y);</p><p> ------------------------------------------------------</p><p> function shuangxianfa_Callback(h
116、Object, eventdata, handles)</p><p><b> %雙線放大</b></p><p> axes(handles.axes2);</p><p> prompt={'輸入放大倍數(shù):'};</p><p> defans={'2'};</p>
117、;<p> p=inputdlg(prompt,'輸入放大倍數(shù)',1,defans);</p><p> p1=str2num(p{1});</p><p> y=imresize(handles.img,p1,'bilinear'); %最近鄰插值法放大</p><p> imshow(y
118、);</p><p> ------------------------------------------------</p><p> function shuangsanci_Callback(hObject, eventdata, handles)</p><p><b> %雙三次放大</b></p><p&
119、gt; axes(handles.axes2);</p><p> prompt={'輸入放大倍數(shù):'};</p><p> defans={'2'};</p><p> p=inputdlg(prompt,'輸入放大倍數(shù)',1,defans);</p><p> p1=str2num
120、(p{1});</p><p> y=imresize(handles.img,p1,'bicubic'); </p><p> imshow(y);</p><p> -------------------------------------------------------</p><p>
121、 function suoxiao_Callback(hObject, eventdata, handles)</p><p><b> %鄰近插值縮小</b></p><p> axes(handles.axes2);</p><p> prompt={'輸入放大倍數(shù):'};</p><p>
122、defans={'0.2'};</p><p> p=inputdlg(prompt,'輸入放大倍數(shù)',1,defans);</p><p> p1=str2num(p{1});</p><p> y=imresize(handles.img,p1,'nearest'); %最近鄰插值法縮小<
123、;/p><p> imshow(y);</p><p> ------------------------------------------------------</p><p> function shuangxian_Callback(hObject, eventdata, handles)</p><p><b> %
124、雙線性縮小</b></p><p> axes(handles.axes2);</p><p> prompt={'輸入放大倍數(shù):'};</p><p> defans={'0.2'};</p><p> p=inputdlg(prompt,'輸入放大倍數(shù)',1,defans
125、);</p><p> p1=str2num(p{1});</p><p> y=imresize(handles.img,p1,'bilinear'); %最近鄰插值法縮小</p><p> imshow(y); --------------------------------------------------------
126、</p><p> function shuangsancisuox_Callback(hObject, eventdata, handles)</p><p><b> %雙三次縮小</b></p><p> axes(handles.axes2);</p><p> prompt={'輸入放大倍數(shù):&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于matlab的圖像處理的課程設計
- 圖像處理課程設計--基于matlab的數(shù)字圖像處理
- matlab課程設計(基于matlab的圖像處理的基本運算)
- matlab課程設計--圖像處理
- matlab課程設計--圖像處理
- 數(shù)字圖像處理課程設計--基于matlab的數(shù)字圖像處理
- matlab課程設計圖像處理
- matlab課程設計--應用圖像處理
- 數(shù)字圖像處理課程設計--基于matlab的數(shù)字圖像處理
- mtalab課程設計 matlab圖像處理
- matlab課程設計--gui圖像處理
- matlab圖像處理課程設計報告
- 基于matlab的圖像處理的課程設計(車牌識別系統(tǒng))
- 數(shù)字信號處理課程設計--基于matlab的數(shù)字圖像處理
- matlab軟件課程設計-- 應用圖像處理
- matlab課程設計---基于matlab的語音信號處理
- 數(shù)字圖像處理-課程設計報告-matlab
- matlab課程設計---基于matlab圖像增強的比較及其理論分析
- 課程設計報告---基于matlab的圖像放縮技術
- 基于matlab的數(shù)字信號處理課程設計
評論
0/150
提交評論