基于matlab的圖像處理的課程設(shè)計(jì)_第1頁
已閱讀1頁,還剩47頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  基于MATLAB的圖像處理的課程設(shè)計(jì)</p><p><b>  目錄</b></p><p>  課程設(shè)計(jì)目的…………………..………………….…………3</p><p>  課程設(shè)計(jì)要求………………….………………………….….3</p><p>  課程設(shè)計(jì)的內(nèi)容………………..…………………

2、…….……3</p><p>  題目分析…………………………………………….………..3</p><p>  總體設(shè)計(jì)……………….…………………………….……….4</p><p>  具體設(shè)計(jì)……………………………………………..…….…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、旋轉(zhuǎn)…………………………………..…………………………9</p><p>  6.3.1、上下翻轉(zhuǎn)…………………….…………….………………9</p><p>  6.3.2、左右翻轉(zhuǎn)………………….…………….…………………9</p><p>  6.3.3任意角度翻轉(zhuǎn)…………………………….…………………9<

6、/p><p>  6.4、噪聲………………………………..…………..………………10</p><p>  6.5、濾波……………………………………..………..……………10</p><p>  6.6、直方圖統(tǒng)計(jì)……………………………………………………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、顏色模型轉(zhuǎn)換……………………………..… ..……………14</p><p>  6.10、操作界面設(shè)計(jì)……………

9、………………………..…………15</p><p>  程序調(diào)試及結(jié)果分析………………….……………………15</p><p>  心得體會(huì)…………………………….………………………16</p><p>  參考文獻(xiàn)…………………………….………………………17</p><p>  附錄………………………….………………………………18<

10、;/p><p>  基于MATLAB的圖像處理的課程設(shè)計(jì)</p><p><b>  摘要: </b></p><p>  數(shù)字圖像處理技術(shù)是20世紀(jì)60年代發(fā)展起來的一門新興學(xué)科,隨著圖像處理理論和方法的進(jìn)一步完善,使得數(shù)字圖像處理技術(shù)在各個(gè)領(lǐng)域得到了廣泛應(yīng)用,并顯示出廣闊的應(yīng)用前景。MATLAB既是一種直觀、高效的計(jì)算機(jī)語言,同時(shí)又是一個(gè)科學(xué)計(jì)

11、算平臺(tái)。它為數(shù)據(jù)分析和數(shù)據(jù)可視化、算法和應(yīng)用程序開發(fā)提供了最核心的數(shù)學(xué)和高級(jí)圖形工具。根據(jù)它提供的500多個(gè)數(shù)學(xué)和工程函數(shù),工程技術(shù)人員和科學(xué)工作者可以在它的集成環(huán)境中交互或編程以完成各自的計(jì)算。MATLAB中集成了功能強(qiáng)大的圖像處理工具箱。由于MATLAB語言的語法特征與C語言極為相似,而且更加簡(jiǎn)單,更加符合科技人員對(duì)數(shù)學(xué)表達(dá)式的書寫格式,而且這種語言可移植性好、可擴(kuò)展性強(qiáng),再加上其中有豐富的圖像處理函數(shù),所以MATLAB在圖像處理

12、的應(yīng)用中具有很大的優(yōu)勢(shì)。</p><p>  關(guān)鍵詞:MATLAB,數(shù)字圖像處理</p><p><b>  課程設(shè)計(jì)目的</b></p><p>  綜合運(yùn)用MATLAB工具箱實(shí)現(xiàn)圖像處理的GUI程序設(shè)計(jì)。</p><p><b>  課程設(shè)計(jì)要求</b></p><p>

13、  1)熟悉和掌握MATLAB 程序設(shè)計(jì)方法</p><p>  2)掌握MATLAB GUI 程序設(shè)計(jì)</p><p>  3)學(xué)習(xí)和熟悉MATLAB圖像處理工具箱</p><p>  4)學(xué)會(huì)運(yùn)用MATLAB工具箱對(duì)圖像進(jìn)行處理和分析</p><p><b>  課程設(shè)計(jì)的內(nèi)容</b></p><

14、p>  學(xué)習(xí)MATLAB GUI程序設(shè)計(jì),利用MATLAB圖像處理工具箱,設(shè)計(jì)和實(shí)現(xiàn)自己的Photoshop 。要求:按照軟件工程方法,根據(jù)需求進(jìn)行程序的功能分析和界面設(shè)計(jì),給出設(shè)計(jì)詳細(xì)說明。然后按照自己擬定的功能要求進(jìn)行程序設(shè)計(jì)和調(diào)試。 </p><p>  以下幾點(diǎn)是程序必須實(shí)現(xiàn)的功能。</p><p>  1)圖像的讀取和保存。</p><p>  2)

15、設(shè)計(jì)圖形用戶界面,讓用戶能夠?qū)D像進(jìn)行任意的亮度和對(duì)比度變化調(diào)整,顯示和對(duì)比變換前后的圖像。</p><p>  3)設(shè)計(jì)圖形用戶界面,讓用戶能夠用鼠標(biāo)選取圖像感興趣區(qū)域,顯示和保存該選擇區(qū)域。</p><p>  4)編寫程序通過最近鄰插值和雙線性插值等算法將用戶所選取的圖像區(qū)域進(jìn)行放大和縮小整數(shù)倍的操作,并保存,比較幾種插值的效果。</p><p>  5)圖像

16、直方圖統(tǒng)計(jì)和直方圖均衡,要求顯示直方圖統(tǒng)計(jì),比較直方圖均衡后的效果。</p><p>  6)能對(duì)圖像加入各種噪聲,并通過幾種濾波算法實(shí)現(xiàn)去噪并顯示結(jié)果。比較去噪效果。</p><p><b>  題目分析</b></p><p>  信息化社會(huì)中,計(jì)算機(jī)在各種信息處理中發(fā)揮著重要的作用。我們可以借助計(jì)算機(jī),對(duì)數(shù)字圖像進(jìn)行處理,以達(dá)到不同的效果

17、。根據(jù)題目的要求,除了實(shí)現(xiàn)要求的功能外,還有很多的功能需要用到。</p><p>  (1)、將一個(gè)RGB圖像轉(zhuǎn)換為灰度圖像。</p><p> ?。?)、可以對(duì)圖像做各種變換,如旋轉(zhuǎn)等。</p><p> ?。?)、有時(shí)并不需要圖像顯示其細(xì)節(jié)部分,只要其輪廓,這時(shí)候不要很高的灰度級(jí)??梢园褕D像轉(zhuǎn)換為二值圖像,進(jìn)行圖像腐蝕,或是創(chuàng)建索引圖像等。</p>

18、<p>  (4)、分析一個(gè)圖像的頻譜特征,利用傅里葉變換,將圖像從空間域變換到頻域,然后進(jìn)行各種處理,經(jīng)過高通濾波器或是低通濾波器。</p><p> ?。?)、為了科學(xué)地定量描述和使用顏色,人們提出了各種顏色模型,按用途可分為三類:計(jì)算顏色模型,視覺顏色模型和工業(yè)顏色模型。有時(shí)為了不同的需要,要對(duì)顏色模型進(jìn)行轉(zhuǎn)換。</p><p><b>  總體設(shè)計(jì)</b

19、></p><p>  由于要實(shí)現(xiàn)的功能并不是很多,所以在排版的過程中,把各個(gè)功能都安排在目錄欄上,整體安排如下圖所示:</p><p>  同時(shí)在調(diào)節(jié)亮度時(shí),雖然可以同對(duì)話框的形式輸入調(diào)節(jié)的比例系數(shù),但是這樣效果不好了,不容易調(diào)節(jié),因此這里考慮用滾動(dòng)條來調(diào)節(jié)。因此,總體的設(shè)計(jì)界面如下圖所示:</p><p><b>  具體設(shè)計(jì)</b>

20、</p><p><b>  文件</b></p><p><b>  6.1.1、打開</b></p><p>  為了讓使用者更方便的使用,所以在設(shè)計(jì)的時(shí)候,通過對(duì)話框的形式來選擇文件,選擇uigetfile函數(shù)來實(shí)現(xiàn),uigetfile函數(shù)顯示一個(gè)打開文件對(duì)話框,該對(duì)話框自動(dòng)列出當(dāng)前路徑下的目錄和文件,由于這個(gè)GUI

21、程序的操作對(duì)象是圖像文件,所以設(shè)置這里的缺省后綴名為“.bmp”。</p><p>  Uigetfile函數(shù)的調(diào)用格式為[name,path]=yigetfile(…), 在按下對(duì)話框中的執(zhí)行按鈕“打開”后,返回選擇的文件名和路徑,分別保存到“name”和“path”中。如果按下取消按鈕或是發(fā)生錯(cuò)誤,則返回值是0。 根據(jù)返回值的情況,如果是0,則彈出提示錯(cuò)誤的對(duì)話框,否則,通過imread函數(shù)讀出圖像數(shù)據(jù),把圖

22、像數(shù)據(jù)賦值給全局變量handles.img。</p><p><b>  6.1.2、保存</b></p><p>  同樣也通過對(duì)話框的形式來保存圖像數(shù)據(jù),通過uigetfile函數(shù)選擇文件名和路徑,用getimage(gca)取出坐標(biāo)2變換后的圖像數(shù)據(jù)保存到變量i,最后用imwrite函數(shù),把數(shù)據(jù)i存到指定的文件。</p><p><

23、b>  6.1.3、退出</b></p><p>  退出比較簡(jiǎn)單,程序如下所示:</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ù)是一個(gè)三維數(shù)組,為了顯示灰度圖像,把三維圖像降為二維,可以只取其中的二維數(shù)據(jù),實(shí)現(xiàn)方法程序?yàn)椋?lt;/p><p>  y=(handles.img(:,:,1)); %當(dāng)然也可以選擇(:,:,2) 或(:,:,3)&l

25、t;/p><p>  imshow(y);</p><p>  但是這樣的話,根據(jù)程序所選的不同,圖像數(shù)據(jù)也不同,顯示也就不一樣。</p><p>  另一種方法就是,運(yùn)用rgb2gray函數(shù)實(shí)現(xiàn)彩色圖像到灰度圖像的轉(zhuǎn)換。程序?yàn)椋?lt;/p><p>  y=rgb2gray(handles.img); </p><p&

26、gt;  imshow(y);</p><p>  這個(gè)程序只能用于RGB圖像轉(zhuǎn)換灰度圖像,當(dāng)原始圖像本來就是灰度圖像時(shí),運(yùn)行該程序時(shí)就會(huì)出錯(cuò),但是使用者在使用時(shí)有時(shí)并不知道這些,為了使該程序更加完善,應(yīng)該在使用者原先圖像時(shí)灰度圖像時(shí)使用該功能時(shí),應(yīng)該要顯示提示類信息。所以在開始時(shí)應(yīng)該要有一個(gè)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)是灰度圖像','轉(zhuǎn)換失敗');&l

28、t;/p><p><b>  end</b></p><p>  如果原圖是RGB,執(zhí)行該操作的結(jié)果如下圖:</p><p>  如果原圖本身已經(jīng)是灰度圖像了,執(zhí)行該操作彈出如 右圖所示的提示對(duì)話框</p><p><b>  6.2.2、亮度</b></p><p>

29、  用imadjust函數(shù),其調(diào)用格式如下:</p><p>  g=imadust(f,[low_in high_in],[low_out high_out]),gamma)</p><p>  gamma 表示映射性質(zhì),默認(rèn)值是1 表示線性映射。</p><p>  由于該函數(shù)有五個(gè)參數(shù)需要輸入,為了方便用戶改變,所以這里設(shè)計(jì)一個(gè)輸入對(duì)話框,用戶通過對(duì)話框把五

30、個(gè)參數(shù)賦值給[low_in high_in],[low_out high_out],gamma這五個(gè)參數(shù),如下一組命令建立了如圖所示的輸入對(duì)話框:</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>  但是,這種方法并不能很好的讓用戶能夠?qū)D像進(jìn)行任意的亮度和對(duì)比度變化調(diào)整,有時(shí)并不事先知道參數(shù)的值要多少,也不關(guān)心,而是任意調(diào)節(jié)的,直到滿意為止。所以應(yīng)該用滑動(dòng)條來調(diào)節(jié)圖像的亮度和對(duì)比度,這樣更適合用戶的使用習(xí)慣。</p>

32、<p>  由于imadjust函數(shù)有五個(gè)參數(shù),所以原則上需要設(shè)計(jì)五個(gè)滑動(dòng)條來調(diào)節(jié)對(duì)比度,這對(duì)用戶來說顯然比較麻煩,因此在設(shè)計(jì)的時(shí)候固定其中的三個(gè)參數(shù),通過調(diào)節(jié)兩個(gè)參數(shù)的值來改變亮度和對(duì)比度。</p><p>  [0 handles.beta],[0 1],handles.gm,這里的變量handles.beta和handles.gm就通過滑動(dòng)條得到,滑動(dòng)條設(shè)計(jì)如下圖:</p><

33、;p>  亮度調(diào)整的tag名為ld,取值范圍0~1,gamma值的tag名為gamma,取值范圍為0~5。獲取滑動(dòng)條參數(shù)的程序如下:</p><p>  handles.beta=get(handles.ld,'value');</p><p>  handles.gm=get(handles.gamma,'value');</p>&l

34、t;p>  執(zhí)行該操作,調(diào)節(jié)滑動(dòng)條到上圖所示位置,結(jié)果如下圖:</p><p><b>  6.2.3、截圖</b></p><p>  在MATLAB中,用函數(shù)imcrop實(shí)現(xiàn)對(duì)圖像的剪切操作。該操作剪切的是圖像中的一個(gè)矩形子圖,用戶可以通過參數(shù)指定這個(gè)矩形四個(gè)頂點(diǎn)的坐標(biāo),也可以交互地用鼠標(biāo)選取這個(gè)矩形。</p><p>  Imcro

35、p函數(shù)的調(diào)用格式如下:</p><p>  y=imcrop(handles.img);</p><p>  不管handles.img是三維的還是二維數(shù)據(jù),該函數(shù)都能進(jìn)行操作。下圖就是對(duì)三維圖像的截圖:</p><p><b>  6.2.4、縮放</b></p><p>  在MATLAB中,用函數(shù)imresize來

36、實(shí)現(xiàn)對(duì)圖像的放大或縮小。插值方法可選用三種方法,最近鄰插值,雙線性插值,雙三次插值。</p><p>  該函數(shù)的調(diào)用格式如下:</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時(shí)實(shí)際上是縮小);</p><p>  下圖就是采用鄰近插值法的放大和縮小圖像,參數(shù)值保持默認(rèn)設(shè)置:</p><p>  雖然處理后看不出放大的效果

38、,這是由于坐標(biāo)軸限制的原因,如果把處理后的圖片保存起來,再把處理后的文件打開,就可以看到比較明顯的放大效果。</p><p><b>  縮小后的結(jié)果如下:</b></p><p><b>  旋轉(zhuǎn)</b></p><p>  6.3.1、上下翻轉(zhuǎn)</p><p>  函數(shù)flipud是實(shí)現(xiàn)一個(gè)二維

39、矩陣的上下翻轉(zhuǎn),如</p><p>  a=[1 2;3 4],經(jīng)過該函數(shù)處理后,原矩陣變?yōu)閇3 4;1 2];所以利用該函數(shù)也可以對(duì)圖像進(jìn)行上下翻轉(zhuǎn)處理,但由于該函數(shù)針對(duì)二維數(shù)據(jù)的處理,所以在寫程序時(shí),要對(duì)RGB圖像和灰度圖像分開處理,這就要用到isrgb函數(shù)來判斷,如果是灰度圖像,則可以直接用這個(gè)函數(shù)進(jìn)行處理,否則就要對(duì)RGB圖像進(jìn)行降維處理, for k=

40、1:3 </p><p>  y(:,:,k)=flipud(x(:,:,k));</p><p><b>  end</b></p><p><b>  處理結(jié)果如圖:</b></p><p>  6.3.2、左右翻轉(zhuǎn)</p><p>  對(duì)圖像的左右翻轉(zhuǎn)也可以用flipl

41、r函數(shù)來處理,同樣的,也要對(duì)灰度和彩色圖像分開處理,處理結(jié)果如圖:</p><p>  6.3.3任意角度翻轉(zhuǎn)</p><p>  用函數(shù)imrotate來實(shí)現(xiàn)對(duì)圖像的插值旋轉(zhuǎn)。</p><p>  該函數(shù)的調(diào)用格式如下:</p><p>  B=imrotate(A,angle,method,’crop’)</p><p

42、>  其中,參數(shù)method用于指定插值的方法,可選的值可以有三種,分別為鄰近插值,雙線性插值,雙三次插值,缺省時(shí)為鄰近插值,參數(shù)angle代表旋轉(zhuǎn)的角度。</p><p>  一般來說,旋轉(zhuǎn)后的圖像會(huì)比原圖大,用戶可以指定“crop”參數(shù)對(duì)旋轉(zhuǎn)后的圖像進(jìn)行剪切(取圖像的中間部分),使返回的圖像與原圖大小相同。執(zhí)行結(jié)果為:</p><p><b>  噪聲</b>

43、;</p><p>  經(jīng)常用到的噪聲有三種,高斯噪聲,椒鹽噪聲,乘性噪聲,可以通過以下三個(gè)函數(shù)來實(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ù)也通過輸入對(duì)話框的形式得到,原圖加入高斯噪聲后結(jié)果如下所示:</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]);%自適應(yīng)濾波</p><p>  k=filter2(fspecial('average',3),handles.noise_img)/255;%平滑濾波</p>

46、;<p>  同樣的,這些函數(shù)也是針對(duì)二維數(shù)據(jù),所以要先判斷是彩色圖像還是灰度圖像,然后分別進(jìn)行處理,下面是對(duì)彩色圖像的自適應(yīng)濾波處理:</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í)行結(jié)果如圖:</b></p><p>  對(duì)其他方法的濾波程序也類似,由于把各個(gè)濾波方法放在一個(gè)選擇框里,所以程序要用以下的選擇語句:</p><p>  switch str</p><p>  cas

49、e '中值濾波'</p><p>  case '自適應(yīng)濾波' </p><p>  case '平滑濾波'</p><p><b>  end</b></p><p><b>  直方圖統(tǒng)計(jì)</b></p><p>  用i

50、mhist函數(shù)對(duì)圖像數(shù)據(jù)進(jìn)行直方圖統(tǒng)計(jì),</p><p>  x=imhist(handles.img(:,:,1));</p><p>  bar(horz,x);</p><p>  其中,x矩陣的數(shù)據(jù)是0~255灰度值的統(tǒng)計(jì)個(gè)數(shù),如果直接對(duì)x矩陣數(shù)據(jù)進(jìn)行圖形圖顯示,由于有256個(gè)數(shù)據(jù),在坐標(biāo)系中就會(huì)很密集,為了更清楚的顯示條形圖,所以在程序設(shè)計(jì)時(shí),把x數(shù)據(jù)進(jìn)行

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)計(jì)外,還可以對(duì)圖像進(jìn)行均衡處理,所用到的函數(shù)是histeq,這兩個(gè)函數(shù)同樣只使用于二維數(shù)據(jù),所以也要對(duì)二維和三維數(shù)據(jù)分開處理。</p&

52、gt;<p>  直方圖顯示和均衡后的圖像分別如下圖所示</p><p><b>  頻譜分析</b></p><p><b>  6.7.1、頻譜圖</b></p><p>  為了得到圖像的頻譜圖,先要對(duì)數(shù)據(jù)進(jìn)行傅里葉變換,用fft2函數(shù)對(duì)二維數(shù)據(jù)進(jìn)行快速傅里葉變換,同時(shí)為了更好的觀察頻譜圖,需要把fft

53、2變換后的數(shù)據(jù)進(jìn)行平移,利用fftshift函數(shù),把快速傅里葉變換的DC 組件移到光譜中心。這樣圖像能量的低頻成分將集中到頻譜中心,圖像上的邊緣、線條細(xì)節(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ù)類型轉(zhuǎn)換</p><p>  k=fft2(f); % 傅立葉變換</p><p>  g=fftshift(k); % 轉(zhuǎn)換

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); % 計(jì)算高通濾波器傳遞函數(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ù)類型轉(zhuǎn)換,不支持圖像的無符號(hào)整型的計(jì)算</p&g

62、t;<p>  g=fft2(f); % 傅立葉變換</p><p>  g=fftshift(g); % 轉(zhuǎn)換數(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));% 計(jì)算低通濾波器傳遞函數(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);來對(duì)灰度圖像到二值圖像的轉(zhuǎn)換。轉(zhuǎn)換結(jié)果為:</p><p>  6.8.2、創(chuàng)建索引圖像</p><p> 

67、 用X = grayslice(I,n)函數(shù)來實(shí)現(xiàn),轉(zhuǎn)換后得到的圖像為:</p><p><b>  顏色模型轉(zhuǎn)換</b></p><p>  下面是RGB顏色模型到HSV模型的轉(zhuǎn)換程序:</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('這是灰度圖像,不能轉(zhuǎn)換','轉(zhuǎn)換失敗');</p&g

69、t;<p><b>  end</b></p><p><b>  轉(zhuǎn)換后的結(jié)果為:</b></p><p>  同樣的,轉(zhuǎn)化為ntsc和ycbcr模型,只要改為相應(yīng)的函數(shù)即可。函數(shù)如下:</p><p>  rgb2ntsc(x);% rgb模型轉(zhuǎn)ntsc模型</p><p>  r

70、gb2ycbcr(x);% rgb模型轉(zhuǎn)ycbcr模型</p><p><b>  操作界面設(shè)計(jì)</b></p><p>  為了使整個(gè)操作界面更加的美觀,對(duì)背景顏色和字體顏色進(jìn)行設(shè)置。</p><p><b>  程序調(diào)試及結(jié)果分析</b></p><p>  在程序設(shè)計(jì)過程中,碰到很多的問題。&

71、lt;/p><p>  一個(gè)函數(shù)只能對(duì)灰度圖像處理,不能對(duì)RGB圖像處理,那么如何才能對(duì)RGB圖像處理呢?</p><p>  這主要是對(duì)MATLAB函數(shù)的不夠清楚,用到的很多函數(shù)是針對(duì)二維數(shù)據(jù)的,而RGB圖像的數(shù)據(jù)是一個(gè)三維矩陣,所以處理要與灰度圖像不同,在開始的時(shí)候,我認(rèn)為應(yīng)該找一個(gè)能夠應(yīng)用于三維矩陣的函數(shù),結(jié)果卻沒找到,后來想到可以把三維數(shù)據(jù)進(jìn)行降維處理,同樣使用二維的函數(shù),只要是同樣處

72、理三次。比如,彩色圖像的濾波處理,直方圖均衡等。</p><p>  同一個(gè)操作對(duì)灰度圖像可以使用,當(dāng)用戶選擇的是彩色圖像時(shí),該操作就會(huì)出錯(cuò)?</p><p>  這是由于設(shè)計(jì)程序時(shí),本身程序是有針對(duì)性的,有些程序只能對(duì)灰度圖像有效,有些對(duì)彩色圖像有效,但是用戶并不清楚這些,所以在設(shè)計(jì)的過程中就要考慮全面,要分開設(shè)計(jì)。在本次課程設(shè)計(jì)中,我均對(duì)每個(gè)程序的開始時(shí),用if isrgb(x)進(jìn)行判

73、斷。</p><p>  在沒有加入噪聲的情況下,點(diǎn)擊“中值濾波”或是其它濾波,會(huì)提示錯(cuò)誤?</p><p>  這是由于在濾波程序設(shè)計(jì)的過程中,開始用到的變量是handles.noise_img,而這個(gè)變量是在加入噪聲時(shí)候才定義的,所以在沒有加入噪聲的情況下,點(diǎn)擊各個(gè)濾波就會(huì)彈出變量沒有定義的錯(cuò)誤,解決方法就是在文件打開的時(shí)候就給定義handles.noise_img=x。</p&

74、gt;<p>  本次設(shè)計(jì)存在一個(gè)比較大的問題,就是每次操作都是獨(dú)立的,比如:要對(duì)圖像加入噪聲,然后在此基礎(chǔ)上進(jìn)行亮度調(diào)整,截圖,頻譜分析等等就不行。</p><p>  我認(rèn)為應(yīng)該是整個(gè)程序設(shè)計(jì)過程中對(duì)變量的設(shè)置沒有做好,應(yīng)該每次操作后,把處理后的數(shù)據(jù)保存在一個(gè)全局變量,這樣還要對(duì)處理后的數(shù)據(jù)進(jìn)行在處理時(shí),只要把這個(gè)全局變量作為原始數(shù)據(jù)帶入就可。</p><p><b

75、>  心得體會(huì)</b></p><p>  1、在這次課程設(shè)計(jì)過程中,感觸很深,由于對(duì)MATLAB圖像處理的函數(shù)不熟悉,導(dǎo)致自己走了很多的彎路,比如在設(shè)計(jì)圖像左轉(zhuǎn)90度和右轉(zhuǎn)90度時(shí),由于開始并不知道imrotate函數(shù),只知道上下翻轉(zhuǎn)flipud和左右翻轉(zhuǎn)fliplr函數(shù),想著要怎么用這兩個(gè)函數(shù)來實(shí)現(xiàn)左轉(zhuǎn)和右轉(zhuǎn)呢,如果當(dāng)當(dāng)只用矩陣轉(zhuǎn)置的話,并不能達(dá)到要求,后來想可以結(jié)合flipud和flipl

76、r函數(shù)來實(shí)現(xiàn),下面程序是實(shí)現(xiàn)左轉(zhuǎ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>  同理,也可以通過轉(zhuǎn)置和fliplr函數(shù)實(shí)現(xiàn)右轉(zhuǎn)90度。</p><p>  但是后來發(fā)現(xiàn)其實(shí)只要用imrotate函數(shù)就可以解決問題。通過這次經(jīng)歷后,后來在設(shè)計(jì)其它程序時(shí),盡量找MATLAB自帶的現(xiàn)成函數(shù),而不是一碰到問題就自己想算法,這樣可以節(jié)省較多的時(shí)間。</p><

81、p>  2、在理工科的專業(yè)應(yīng)用背景下,用matlab 進(jìn)行相關(guān)計(jì)算與仿真編程的優(yōu)勢(shì)非常突出。特定的問題處理算法,我們通常都以M文件的文本形式給定最終的解決方案,自己設(shè)計(jì)的程序是在MATLAB環(huán)境下,用MATLAB語言編寫的,這對(duì)于有安裝MATLAB軟件的計(jì)算機(jī)上運(yùn)行并不存在什么問題,關(guān)鍵是一般的計(jì)算機(jī)很少有去安裝MATLAB軟件的,那么要在這些機(jī)子上運(yùn)行該程序要怎么辦呢,難道要先安裝MATLAB軟件,這顯然太麻煩了,對(duì)于一個(gè)通用的

82、,比較成熟的解決方案,我們當(dāng)然期望它能應(yīng)用到更多的場(chǎng)合,而.exe (可執(zhí)行)文件可運(yùn)行于所有的通用WINDOWS操作系統(tǒng),為此,將M文件轉(zhuǎn)換成.exe文件倒是個(gè)不錯(cuò)的想法。</p><p>  通過查找資料,了解到在生成可執(zhí)行性文件之前,需要進(jìn)行一系列編譯環(huán)境方面的配置:</p><p>  要將用Matlab語言編寫的函數(shù)文件編譯成可獨(dú)立執(zhí)行的*.exe文件(即可脫離Matalab環(huán)境

83、的執(zhí)行程序),首先要安裝和配置好Matlab Compiler,一般來說,在安裝Matlab時(shí)就已經(jīng)安裝了相應(yīng)版本的Matlab Compiler。只是不同版本的Matlab,其編譯器的使用方法有一定的差異,這一點(diǎn)要引起一定的注意。</p><p>  在確定安裝好Matlab Compiler后,還需要對(duì)Compiler進(jìn)行適當(dāng)?shù)呐渲?,方法是在Matlab命令窗口輸入:</p><p>

84、  Mbuild –setup</p><p>  然后根據(jù)提示執(zhí)行相應(yīng)的操作,使用者可根據(jù)自己計(jì)算機(jī)中現(xiàn)有編譯器的情況選擇合適的編譯器,如VC++ 6.0、VC++7.0、Bland C的編譯器等,目前Matlab好象還不支持VC++8.0(我計(jì)算機(jī)安裝的就是VC++2005,Matlab就無法識(shí)別)。當(dāng)然,如果你的計(jì)算機(jī)里根本就沒有安裝其他任何語言的編譯器,也可選擇Matlab自帶的Lcc編譯器,其實(shí)這個(gè)編譯

85、器對(duì)大多數(shù)用戶已經(jīng)夠用了(我就是選擇的Matlab自帶的Lcc編譯器)。</p><p>  配置好編譯器后,自然就是對(duì)自己編寫的M文件進(jìn)行編譯了。</p><p>  將M文件編譯為獨(dú)立可執(zhí)行文件的語法是:</p><p>  >>mcc –m fun1.m fun2.m…..</p><p>  其中fun1就是最后的可執(zhí)行文

86、件的名稱。</p><p>  3、通過本次課程設(shè)計(jì),使自己對(duì)MATLAB GUI設(shè)計(jì)流程有了比較深刻的體會(huì),同時(shí)也了解了一般軟件設(shè)計(jì)的過程。在設(shè)計(jì)過程中碰到了很多的問題,通過這些問題,使自己分析問題,解決問題的能力得到了較大的提高。</p><p><b>  參考文獻(xiàn)</b></p><p>  鄭阿奇,曹戈,趙陽.MATLAB實(shí)用教程[M

87、].北京:電子工業(yè)出版社</p><p>  程衛(wèi)國(guó),馮峰,姚東,徐聽.MATLAB5.3應(yīng)用指南[M].北京:人民郵電出版社</p><p>  陳楊.MATLAB 6.X圖像編程與圖像處理[M].西安:西安電子科技大學(xué)出版社</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('沒有選中文件','出錯(cuò)');</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('沒有保存','出錯(cuò)');</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)是灰度圖像','轉(zhuǎn)換失敗');</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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論