基于linux的圖像識別處理畢業(yè)設(shè)計_第1頁
已閱讀1頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  畢業(yè)設(shè)計</b></p><p>  題 目 基于linux的圖像識別處理設(shè) </p><p>  學(xué) 院 </p><p>  年級專業(yè) 計控1005班 </p><p>  學(xué)生姓名

2、 </p><p>  學(xué) 號 </p><p>  指導(dǎo)老師 </p><p>  完成日期 年 月</p><p><b>  目 錄</b></p>

3、<p><b>  摘 要2</b></p><p><b>  第1章 引言1</b></p><p>  1.1 課程設(shè)計的意義1</p><p>  1.2 課程設(shè)計的目的1</p><p>  第2章 系統(tǒng)設(shè)計原理2</p><p>  2.1圖像

4、處理技術(shù)原理和成像原理2</p><p>  2.2 BMP文件格式簡介2</p><p>  2.3 圖像顯示原理3</p><p>  第3章 開發(fā)環(huán)境簡介及搭建5</p><p>  3.1 硬件平臺5</p><p>  3.2 系統(tǒng)軟件平臺構(gòu)建5</p><p>  3.3

5、 LCD顯示模塊5</p><p>  第4章 系統(tǒng)設(shè)計的與具體實現(xiàn)7</p><p>  4.1 BMP文件的讀入7</p><p>  4.2 圖像增強(qiáng)算法設(shè)計7</p><p>  4.3 圖像分割算法設(shè)計8</p><p>  4.4 圖像平滑8</p><p>  4.5

6、圖像縮放(平移以及轉(zhuǎn)置)10</p><p>  第5章 程序主要源代碼分析12</p><p>  5.1 圖像數(shù)據(jù)存儲的主程序如下:12</p><p>  5.3 圖像平移主要代碼15</p><p>  5.4 圖像縮放主要代碼18</p><p>  5.5 轉(zhuǎn)置圖像主要代碼21</p>

7、;<p>  第6章 運(yùn)行測試結(jié)果23</p><p>  6.1圖像平移效果23</p><p>  6.2圖像轉(zhuǎn)置效果24</p><p>  6.3圖像的縮放效果24</p><p><b>  第7章 總結(jié)25</b></p><p><b>  參考文獻(xiàn)

8、26</b></p><p>  基于ARM嵌入式圖像處理系統(tǒng)設(shè)計與實現(xiàn)</p><p>  學(xué)生姓名:董亞美 指導(dǎo)老師:楊文柏</p><p>  摘 要 針對現(xiàn)在的過程檢測的實時需求,設(shè)計出一種成本低,功能始終的圖像處理采集系統(tǒng)。該系統(tǒng)以ARM7(S3C44BOX)為核心并配上外圍電路實現(xiàn)圖像處理功能,在加上多種通訊接口設(shè)

9、計的圖像傳輸通道,然后加入SD卡接口用于提取圖像數(shù)據(jù)。最后基于uC/OS-Ⅱ嵌入式操作系統(tǒng)設(shè)計了一種圖像處理方法,在系統(tǒng)中實現(xiàn)了圖像增強(qiáng)、圖像分割和目標(biāo)定個位。實驗表明,該系統(tǒng)能夠很好地解決在線處理功能的實時問題,圖像處理的準(zhǔn)確率也滿足了過程檢測系統(tǒng)的要求,而且實現(xiàn)簡單,成本比較低,特別適合對于功耗、體積要求較嚴(yán)格的過程檢測系統(tǒng)。</p><p>  關(guān)鍵詞 ARM;圖像處理系統(tǒng);圖像增強(qiáng);目標(biāo)定位</p

10、><p><b>  1 引言</b></p><p>  1.1 畢業(yè)設(shè)計的意義</p><p>  圖像處理技術(shù)在工業(yè)自動化、儀表檢測安全、以及安全、消費(fèi)電子、醫(yī)學(xué)中被越來越廣泛的應(yīng)用。在現(xiàn)代戰(zhàn)爭中,利用圖像進(jìn)行精確制導(dǎo)、火控、無人飛機(jī)的電視導(dǎo)航等,在國防中也受到了高度的重視。圖像處理算法中常有大量的運(yùn)算,特別是在實時圖像處理方面,因此通常采用

11、DSP[1]或FPGA[3]來實現(xiàn)。但隨著微處理器技術(shù)的突飛猛進(jìn),現(xiàn)代MPU[1]也可以完成高速的數(shù)字圖像處理。</p><p>  作為嵌入式圖像處理技術(shù),其主要技術(shù)包括兩個方面,一個是圖像處理技術(shù),另一個則是嵌入式系統(tǒng)[4]應(yīng)用技術(shù)。本文主要研究圖像處理技術(shù)在嵌入式系統(tǒng)中的應(yīng)用。</p><p>  1.2 畢業(yè)設(shè)計的目的</p><p>  本課程設(shè)計的目的旨

12、在研究一種能夠進(jìn)行高速圖像處理[5]的嵌入式系統(tǒng)架構(gòu)的設(shè)計與實現(xiàn)方法。針對嵌入式系統(tǒng)本身的特點(diǎn),設(shè)計出具有較強(qiáng)通用性的嵌入式圖像處理平臺。</p><p>  利用嵌入式系統(tǒng)進(jìn)行圖像處理是對傳統(tǒng)的圖像處理硬件實現(xiàn)方法的挑戰(zhàn).它的完成將為圖像處理的開辟新的實現(xiàn)途徑,并且為嵌入式系統(tǒng)的應(yīng)用再次打開一片新的領(lǐng)域,同時,由于圖像處理的應(yīng)用十分廣泛,其本身也有廣泛的應(yīng)用前景。</p><p>  圖

13、像數(shù)據(jù)是一種重要的信息資源,隨著以計算機(jī)和計算機(jī)技術(shù)為核心的信息科學(xué)的發(fā)展,圖像處理在通訊、管理、醫(yī)學(xué)、地震、氣象、航空航天以及教育等領(lǐng)域,發(fā)揮著愈來愈重要的作用。但傳統(tǒng)的圖像處理技術(shù)主要依賴于大批量的電子計算設(shè)備,它們帶來巨大的保養(yǎng)、增加行業(yè)成本。嵌入式平臺擁有小巧、價格低廉、功耗小及維護(hù)成本低等優(yōu)點(diǎn)。因此基于嵌入式平臺構(gòu)建圖像處理系統(tǒng)可以降低其生產(chǎn)維護(hù)成本,提高其可靠性和可控件,具有較高的市場價值。</p><p

14、>  本文主要針對采集到的圖像(bmp格式)實現(xiàn)平移、轉(zhuǎn)置、縮放、平滑等處理。</p><p><b>  2 系統(tǒng)設(shè)計原理</b></p><p>  2.1圖像處理技術(shù)原理和成像原理</p><p>  圖像處理技術(shù)又稱“機(jī)器視覺”[5],乃是將被測對象的圖像作為信息的載體,從中提取有用的信息來達(dá)到測量的目的,具有非接觸、高速、獲得信

15、息豐富等優(yōu)點(diǎn)。系統(tǒng)一般通過攝像頭采集對象的圖像信息,然后通過處理系統(tǒng)對采集到的圖像進(jìn)行數(shù)字化的處理和分析,根據(jù)檢測要求可得到對象的特征信息,隨后進(jìn)一步對此進(jìn)行判斷并輸出結(jié)果。如圖2.1 所示,連桿的表面缺陷通過一個方形LED漫反射光源均勻照亮待檢測的破口區(qū)域,光線照射到對象表面后,通過光學(xué)鏡頭成像在攝像頭內(nèi)的光電耦合CCD 元件[3]上并轉(zhuǎn)化成相應(yīng)的數(shù)字圖像信號,CCD 元件可理解為一個由感光像素組成的點(diǎn)陣,每一個像素都一一對應(yīng)了被測對

16、象的二維圖像特征。數(shù)字圖像信號經(jīng)過圖像處理系統(tǒng)對圖像特征信息的提取和計算得到所需的測量值,隨后通過RS232 通訊接口把數(shù)據(jù)傳輸給PLC 進(jìn)行邏輯判斷,判斷的結(jié)果直接通過設(shè)備前面板上的指示燈輸出。</p><p>  CCD 透鏡 LED</p><p>  光源 對象</p><p> 

17、 CCD 攝像機(jī)</p><p>  圖2.1 攝像頭采集對象的圖像信息</p><p>  2.2 BMP文件格式簡介</p><p>  一個BMP文件包括以下四部分:文件頭,信息頭,調(diào)色板數(shù)據(jù)和圖像數(shù)據(jù)。文件頭長度為14個字節(jié)。分別為:bffype:指定文件結(jié)構(gòu),必須是Ox424D,即字符串“BM "; bfSize:指定文件大小,包括這14

18、個字節(jié);bfReservedl,bfReserved2:分別為2個字節(jié),為保留字,不用考慮:bfOffBits:從文件頭到實際的圖像數(shù)據(jù)的偏移字節(jié)數(shù)。信息 頭 長 度為40個字節(jié),分別為:biSize:指定這個結(jié)構(gòu)的長度,為40,單位字節(jié):biWidth, biHeight:指定圖像的寬度和高度,單位為像素;biPlanes:必須為1; biBitCount:指定表示顏色時要用到的位數(shù);biCompression:指定是否壓縮:biSi

19、zelmage:指定實際圖像數(shù)據(jù)占用的字節(jié)數(shù),注意,計算時圖像寬度取大于等于biWidth的最小的4的整數(shù)倍數(shù);biXPelsPerMeter, biYPelsPerMeter:指定目標(biāo)設(shè)備的水平和垂直分辨率;biClrUsed:指定本圖像實際用到的顏色數(shù),如果該值為零,則用到的顏色數(shù)為2的biBitCount次方:biCIrImportant:指定</p><p>  第三部分為調(diào)色板,當(dāng)然,這是對那些需要調(diào)色

20、板的文件而言的。在這里,所采集的圖像數(shù)據(jù)是真彩色[6]〔24位)的,故不需要調(diào)色板。調(diào)色 板 實 際上是一個數(shù)組,共有biClrUsed個元素。數(shù)組中每個元素占用4個字節(jié),依次是一字節(jié)的藍(lán)色分量,一字節(jié)的綠色分量,一字節(jié)的紅色分量,以及一字節(jié)的保留值。</p><p>  第四部分就是實際的圖像數(shù)據(jù)了。對于用到調(diào)色板的文件,圖像數(shù)據(jù)是該像素值在調(diào)色板中的索引值。這里需要注意的是:每一行的字節(jié)數(shù)必須是4的整倍數(shù),如

21、果不是,則需要補(bǔ)齊,這在biSizelmage中有介紹。</p><p>  一般來說 ,BMP文件的數(shù)據(jù)是從下到上,從左到右。也就是說,從文件中最先讀到的是圖像最下面一行的左邊第一個像素,然后是左邊第二個像素一接下來是倒數(shù)第二行左邊第一個像素?,以此類推,最后得到的是最上面一行的最右一個像素,這與采集出的圖像數(shù)據(jù)順序是不同的。每像素的順序為BGR[6].</p><p>  2.3 圖像

22、顯示原理</p><p>  本課程設(shè)計設(shè)計采用的是一個240X320分辨率的16位液晶屏幕,可以通過操作S3C2410內(nèi)部的相關(guān)寄存器來直接控制顯示,由于采用了ARM—Linux作為操作系統(tǒng),可以直接操作“nux下的Framebuffer設(shè)備來完成圖像的顯示,幀緩沖(Framebuffer)是Linux為顯示設(shè)備提供的一個接口,把顯存抽象后的一種設(shè)備,他允許上層應(yīng)用程序在圖形模式下直接對顯示緩沖區(qū)進(jìn)行讀寫操作。

23、這種操作是抽象的、統(tǒng)一的。用戶不必關(guān)心物理顯存的位置、換頁機(jī)制等等具體細(xì)節(jié)。這些都是由Framebuffer設(shè)備驅(qū)動來完成的。在應(yīng)用程序中首先要打開Framebuffer設(shè)備,在Linux系統(tǒng)中Framebuffer設(shè)備一般映射為/dev/fb,可以有多個設(shè)備。然后調(diào)用ioctl提供的借口獲取設(shè)備信息,主要是獲得當(dāng)Framebuffer設(shè)備的分辨率、色深、每一行數(shù)據(jù)占的字節(jié)數(shù)。關(guān)鍵的一步是將屏幕緩沖區(qū)映射到用戶空間,F(xiàn)ramebuffe

24、r設(shè)備可以看成是顯存的映像,但是Linux所有的設(shè)備驅(qū)動均在內(nèi)核態(tài)工作,所以無法在當(dāng)前進(jìn)程空間中直接訪問,通過映射機(jī)制可以直接把顯存的起始地址映射到當(dāng)前進(jìn)程的地址空間,從而可</p><p>  Pfd=mmap(0,F(xiàn)BDraw_finfo,smem_len,PROT_READ|PROT_WRFTE,MAP_SHARED,df,0);//以read、write和share方式映射屏幕上左邊為(x,y)的點(diǎn)在顯存

25、中的位置是:</p><p>  Pfd+x*(fb_vinfo.bits_pixel)>>3)+y*fb_finfo.line_length,對這個位置賦相應(yīng)的顏色值就可以再屏幕上顯示出來。需要注意的是當(dāng)色深(fb_vinfo.bits_per_pixel)不同時,顏色值的格式也不一樣。</p><p>  把經(jīng)過圖像處理后的圖像數(shù)據(jù)或者采集到的原始圖像數(shù)據(jù)轉(zhuǎn)化成Frameb

26、uffer設(shè)備的顏色數(shù)據(jù)格式(RGB565、RGB888等)后,將數(shù)據(jù)復(fù)制到從地址pfb開始的內(nèi)存中,就可以事先圖像的顯示。</p><p>  3 開發(fā)環(huán)境簡介及搭建</p><p><b>  3.1 硬件平臺</b></p><p>  數(shù)字圖像處理系統(tǒng)是執(zhí)行處理圖像、分析理解圖像信息任務(wù)的計算機(jī)系統(tǒng).盡管圖像處理技術(shù)應(yīng)用廣泛,圖像處理系

27、統(tǒng)種類很多,但他們的基本組成是相近的口它們主要含有:圖像輸入設(shè)備、執(zhí)行處理分析與控制的計算機(jī)圖像處理機(jī)、輸出設(shè)備、存儲系統(tǒng)中的圖像數(shù)據(jù)庫、圖像處理程序庫與模型庫。</p><p>  其中,負(fù)責(zé)執(zhí)行圖像處理與分析的圖像處理機(jī)是整個系統(tǒng)的核心部分,它關(guān)系著圖像的處理效果,及系統(tǒng)的整體性能。本系統(tǒng)選用的是韓國三星電子公司推出的一款基于ARM920T內(nèi)核的S3C2410嵌入式微處理器。</p><p

28、>  S3C2410把外部復(fù)位信號作為一個中斷處理,在系統(tǒng)復(fù)位時,程序指針(PC)被設(shè)置為0,程序跳轉(zhuǎn)到0x00000000開始運(yùn)行。此空間對應(yīng)BankO,系統(tǒng)的2MB的NORFIash和處理器的Bank0相連接。在NORFlash中存儲的是BootLoader,它負(fù)責(zé)配置處理器的結(jié)構(gòu)、工作模式以及自動檢測系統(tǒng)的各個硬件是否工作正常。系統(tǒng)經(jīng)過初始化和自檢后,BootLoader負(fù)責(zé)把16MBNANDFlash的zlmage(即軟件

29、系統(tǒng)的鏡像文件)復(fù)制到0xc0008000地址(此地址是系統(tǒng)64MB SDRAM的首地址)。然后,引導(dǎo)程序把PC指向0xc0008000地址,系統(tǒng)開始運(yùn)行。</p><p>  3.2 系統(tǒng)軟件平臺構(gòu)建</p><p>  結(jié)合S3C2410處理器的特點(diǎn).基于該芯片構(gòu)建嵌入式圖像處理系統(tǒng),設(shè)計者必須考慮其通用性、響應(yīng)速度及對于硬件的可操控性。正是基于這樣的考慮,分三層構(gòu)建嵌入式圖像處理系統(tǒng)

30、的軟件體系:ARM Linux的建立;圖形用戶界面(MiniGui)的移植;圖像處理軟件的設(shè)計編碼。其中ARM Linux的建立是構(gòu)建嵌入式Linux系統(tǒng)的通用步驟. </p><p>  3.3 LCD顯示模塊</p><p>  從S3C24 10的LCD控制器出來的信號線包括24根數(shù)據(jù)線和若干根控制線。這些信號線是經(jīng)過74HC245隔離后接到LCD模塊的,對于256色LCD只需要其中

31、低8位數(shù)據(jù)線即可(如圖所示)。LCD模塊除了需要控制信號和數(shù)據(jù)信號外,還需要一個22V左右的工作電壓和上千伏的背光電壓。前者M(jìn)AX629升壓后得到,后者由一個逆變器模塊提供。</p><p>  圖3.3 S3C24 10</p><p>  4 系統(tǒng)設(shè)計的與具體實現(xiàn)</p><p>  基于上文的闡述,本軟件系統(tǒng)的具體實現(xiàn)丁作主要包括:圖像文件的讀入、圖像處理的具

32、體實現(xiàn)等。下文將具體介紹實現(xiàn)工作。</p><p>  4.1 BMP文件的讀入</p><p>  在嵌入式平臺上,并沒有現(xiàn)成的BMP文件的庫函數(shù)可以使用。因此,如何把一個BMP文件讀人到內(nèi)存中進(jìn)行圖像處理算法移植的根本前提。本系統(tǒng)中,主要處理的圖像有兩大塊:真彩圖和256色的圖像(包括256級厭度圖),因此對應(yīng)設(shè)計了兩個BMP文件的讀入函數(shù),并將這兩個函數(shù)放在Graphic.h和Gra

33、phic.c中,以備后續(xù)的開發(fā)使用。兩個函數(shù)為:</p><p>  GetTruePixel(char bmpnameIl,U32 color[24011320J,int*mapwidth.int*mapheight);</p><p>  Get256Pixel(char bmpname[]。U8 cdorbutl240113201,U32 pale[256].int 4mapwidt

34、h,int*mapheight)。</p><p>  函數(shù)l用于將一個名稱為bmpnameH的真彩圖像數(shù)據(jù)讀入color[][]矩陣,同時獲得圖像的寬和高;函數(shù)2用于將一個名稱為bmpname[]的256色圖像數(shù)據(jù)讀人colorbuf[]矩陣,同時,對應(yīng)的調(diào)色板數(shù)據(jù)讀入pale[]矩陣中并獲得圖像的寬和高。</p><p>  4.2 圖像增強(qiáng)算法設(shè)計</p><p&

35、gt;  在圖像處理中,當(dāng)光學(xué)系統(tǒng)成像時出現(xiàn)背景與目標(biāo)灰度范圍相對比較窄,即低對比度的情況,一般會采用對圖像進(jìn)行灰度的拉伸變換[5],從而加大特征目標(biāo)與背景的灰度差,實現(xiàn)圖像增強(qiáng),以利于提取出特征目標(biāo)來.灰度變換可分為線性灰度變換、分段線性變換、非線性變換.本研究采用線性灰度變換,該方法用于克服當(dāng)圖像由于成像時曝光不足或過度所產(chǎn)生的對比度不足的弊?。僭O(shè)原圖像八茗,y)的灰度范圍為[a,b],希望變換后圖像g(x,y)的灰度范圍擴(kuò)展到[

36、c,d],其數(shù)學(xué)表達(dá)式為:</p><p>  g(x,y)=c (0≤f(x,y≤)a)</p><p>  g(x,y)=(d-c)/(b-a)+c (a≤f(x,y) ≤b)</p><p>  g(x,y)=d (b≤f(x,y) ≤Mf)</p><p>  式中:Mf表示(x,y)的最大值

37、.</p><p>  4.3 圖像分割算法設(shè)計</p><p>  經(jīng)過圖像增強(qiáng)后,要將一幅圖像分解為若干互不交疊的、有意義的、具有相同性質(zhì)的區(qū)域,并從中提取出所感興趣的目標(biāo),即圖像分割.圖像分割有邊緣檢測和閾值分割,這里采用閾值分割方法.閾值分割是基于灰度閾值的分割方法,它通過設(shè)置閾值,把像素點(diǎn)按灰度級分若干類,從而實現(xiàn)圖像分割.把一幅灰度圖像轉(zhuǎn)換成二值圖像是閾值分割的最簡單形式,設(shè)原

38、始圖像為f(x,y),首先就是按一定準(zhǔn)則在f(x,y)中找出一個灰度值t作為閾值,將圖像分割為兩部分,即把大于等于該閾值的像素點(diǎn)的值置成1,小于閾值的像素點(diǎn)置為0.閾值運(yùn)算后的圖像為二值圖像g(x,Y).</p><p>  g(x,y)=1 (f(x,y) ≤t)</p><p>  g(x,y)=0 (f(x,y)>t)</p>&l

39、t;p>  上式中全局閾值t的選擇直接影響到分割效果.通??梢酝ㄟ^分析灰度直方圖來確定它的值,最常見的方法是利用灰度直方圖來確定它的值,利用灰度直方圖求雙峰,選擇兩峰之間谷底處的灰度值作為閾值.</p><p><b>  4.4 圖像平滑</b></p><p>  圖像在生成和傳輸過程中常受到各種嗓聲的干擾和影響,使圖像質(zhì)量下降。為了抑制噪聲改善圖像質(zhì)量,必

40、須對圖像進(jìn)行平滑處理。通常,將數(shù)字圖像的平滑技術(shù)[4]劃分為兩類。一類是全局處理,即對噪聲圖像的整體或大的塊進(jìn)行校正得到平滑圖像。但這類方法需要知道信號和噪聲的統(tǒng)計模型,且運(yùn)算量較大。另一類平滑技術(shù)是對噪聲圖像使用局部算子。當(dāng)對某一像素進(jìn)行平滑處理時,僅對它的局部小鄰域的一些像素加以運(yùn)算,其優(yōu)點(diǎn)是計算效率高,而且可以多個像素并行處理,因此可以實現(xiàn)實時或者準(zhǔn)實時處理。</p><p>  (1)平滑線性濾波器(均值

41、濾波)</p><p>  一般來說,假設(shè)MXN的圖像(x,y)為給定的含有噪聲的圖像,用m*n大</p><p>  小的濾波器掩模進(jìn)行線性濾波結(jié)果為g(x,y),在數(shù)學(xué)上可以表現(xiàn)為:</p><p>  其中,a=(m-1)/12, b=(n-1)/12, w(s,t)為濾波器系數(shù)。為了得到一副完整的經(jīng)過濾波處理的圖像,必須對x=0,1,2,….M-1和y =0

42、,工,2,...,N-1依次應(yīng)用公式。這樣,就保證了對圖像中的所有像素進(jìn)行了處理。一般可選取以下幾種模板:</p><p>  模版1 模版2 模版3</p><p>  比較常用 的是模板3,它又被稱為高斯(Gauss)模板,它為了突出模板中心像素本身的重要性,對所有的模板系數(shù),不是一視同仁,而是引入了加權(quán)系

43、數(shù),可以看出,離原點(diǎn)距離越近的點(diǎn),加權(quán)系數(shù)越大??臻g均值處理的一個結(jié)果是,較大物體變得像“斑點(diǎn)”而易于檢測,但那些較小物體的強(qiáng)度與背景混合在了一起。為此,在濾波后可增加閥值處理,即將濾波后的圖像與選定的閥值相比較,根據(jù)比較結(jié)果決定最后的灰度值。該方法對抑</p><p>  制椒鹽噪聲比較有效,對保護(hù)僅有微小灰度差的細(xì)節(jié)和紋理也有效。</p><p>  (2)平滑非線性濾波器(統(tǒng)計排序濾

44、波器)</p><p>  統(tǒng)計排序 濾波器是一種非線性的空間濾波器,它的響應(yīng)基于圖像濾波器包圍的圖像區(qū)域中像素的排序,然后由統(tǒng)計排序結(jié)果決定的值代替中心像素的值。統(tǒng)計排序濾波器中最常見的例子就是中值濾波器,正如其名,它是將像素鄰域內(nèi)灰度的中值代替該像素的值。中值濾波器的主要功能是使擁有不同灰度的點(diǎn)看起來更接近于它的臨近值。</p><p>  中值濾波器使用非常普遍,這是因為對于一定類型

45、的隨機(jī)噪聲,它提供了一種優(yōu)秀的去噪能力,比小尺寸的線性平滑濾波器的模糊程度明顯要低。中值濾波器對處理脈沖噪聲(椒鹽噪聲)非常有效,因為這種噪聲是以黑白點(diǎn)疊加在圖像上的。</p><p>  盡管在圖像處理中,中值濾波器是用得最廣泛的統(tǒng)計濾波器,但這并不是說它是唯一的。所謂中值就是一系列像素值的第50%個值,當(dāng)我們?nèi)?00%個值,此時就是最大濾波器,相反,當(dāng)取0%的值時就變成了最小濾波器。</p>&

46、lt;p>  4.5 圖像縮放(平移以及轉(zhuǎn)置)</p><p>  一般采用插值法,有如下幾種插值算法:</p><p>  最鄰近插值(近鄰取樣法):</p><p>  最臨近插值的的思想很簡單。對于通過反向變換得到的的一個浮點(diǎn)坐標(biāo),對其進(jìn)行簡單的取整,得到一個整數(shù)型坐標(biāo),這個整數(shù)型坐標(biāo)對應(yīng)的像素值就是目的像素的像素值,也就是說,取浮點(diǎn)坐標(biāo)最鄰近的左上角點(diǎn)

47、(對于DIB是右上角,因為它的掃描行是逆序存儲的)對應(yīng)的像素值??梢?,最鄰近插值簡單且直觀,但得到的圖像質(zhì)量不高。</p><p><b>  雙線性內(nèi)插值:</b></p><p>  對于一個目的像素,設(shè)置坐標(biāo)通過反向變換得到的浮點(diǎn)坐標(biāo)為(i+u,j+v),其中i、j均為非負(fù)整數(shù),u、v為[0,1)區(qū)間的浮點(diǎn)數(shù),則這個像素得值 f(i+u,j+v) 可由原圖像中坐

48、標(biāo)為 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所對應(yīng)的周圍四個像素的值決定,即:</p><p>  f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)</p><p>  其中f(i,j)表示源圖像(i,j)處的的像素值,以此類推</p><

49、p>  這就是雙線性內(nèi)插值法。雙線性內(nèi)插值法計算量大,但縮放后圖像質(zhì)量高,不會出現(xiàn)像素值不連續(xù)的的情況。由于雙線性插值具有低通濾波器的性質(zhì),使高頻分量受損,所以可能會使圖像輪廓在一定程度上變得模糊。</p><p>  三次卷積法能夠克服以上兩種算法的不足,計算精度高,但計算量大,他考慮一個浮點(diǎn)坐標(biāo)(i+u,j+v)周圍的16個鄰點(diǎn),目的像素值f(i+u,j+v)可由如下插值公式得到:</p>

50、<p>  f(i+u,j+v) = [A] * [B] * [C]</p><p>  [A]=[ S(u + 1) S(u + 0) S(u - 1) S(u - 2) ]</p><p>  ┏ f(i-1, j-1) f(i-1, j+0) f(i-1, j+1) f(i-1, j+2) ┓[B]=┃ f(i+0, j-1) f(i+0, j+0) f(i+0, j+

51、1) f(i+0, j+2) ┃</p><p>  ┃ f(i+1, j-1) f(i+1, j+0) f(i+1, j+1) f(i+1, j+2) ┃</p><p>  ┗ f(i+2, j-1) f(i+2, j+0) f(i+2, j+1) f(i+2, j+2) ┛</p><p>  ┏ S(v + 1) ┓[C]=┃ S(v + 0) ┃<

52、/p><p>  ┃ S(v - 1) ┃</p><p>  ┗ S(v - 2) ┛</p><p>  ┏ 1-2*Abs(x)^2+Abs(x)^3 , 0<=Abs(x)<1S(x)={ 4-8*Abs(x)+5*Abs(x)^2-Abs(x)^3 , 1<=Abs(x)<2 ┗ 0 ,

53、 Abs(x)>=2S(x)是對 Sin(x*Pi)/x 的逼近(Pi是圓周率——π)最鄰近插值(近鄰取樣法)、雙線性內(nèi)插值、三次卷積法 等插值算法對于旋轉(zhuǎn)變換、錯切變換、一般線性變換 和 非線性變換 都適用。</p><p>  5 程序主要源代碼分析</p><p>  5.1 圖像數(shù)據(jù)存儲的主程序如下:</p><p

54、>  FILE*file=fopen("O.bmp","wb");</p><p>  writebmpfileheader(file);/*寫文件頭函數(shù)*/</p><p>  writebmpinfoheader(file);/* 寫信息頭函數(shù)*/</p><p>  writeimagedata(file);/*

55、寫圖像數(shù)據(jù)函數(shù)*/</p><p>  fclose(fi le);</p><p>  寫文件頭和寫信息頭函數(shù)比較簡單,這里bfSize為230454;b iWidth,biHeight為320,240;bi Sizelmage為230400;biXPelsPerMeter,bi YPelsPerMeter,biClrUsed,biCIrImportant均為Oa</p>

56、<p>  以下給出 writeimagedata(file)II 數(shù)的原型:</p><p>  voidwriteimagedata(FILE* file)</p><p><b>  {</b></p><p>  Int datapointer;</p><p>  Int mydata ;</p

57、><p>  for (int i= 0; i< = 239; i++)/*共240行*/</p><p>  datapointer -data+(239-i )*3 20 ;</p><p>  /*data為采集映射時圖像數(shù)據(jù)首地址,計算每一要寫入的行在內(nèi)存中的首地址*/</p><p>  for(int j= 0;j < =

58、 31 9;j + + )/* 共 320列*/</p><p><b>  {</b></p><p>  mydata=*( datapointer+j);</p><p>  fwrite(&mydata,1, 1, fil e); /*寫入一行數(shù)據(jù)*/</p><p><b>  }</b

59、></p><p><b>  }</b></p><p><b>  }</b></p><p>  5.2 圖像平滑模塊</p><p>  Typedef struct</p><p>  {unsigned short bfType;</p>&l

60、t;p>  Unsigned bfSize;</p><p>  Unsigned short bfReserved 1;</p><p>  Unsigned short bfReserved 2;</p><p>  Unsigned bfOffBits;</p><p>  }BMPHEADER;</p><p

61、>  BMPHEADER header;</p><p>  Typedef struct</p><p>  {unsigned biSize;</p><p>  unsigned biWidth;</p><p>  unsigned biHeight;</p><p>  unsigned s

62、hort biplanes;</p><p>  unsigned short biBitCount;</p><p>  unsigned biCompression;</p><p>  unsigned biSizelmage;</p><p>  unsigned biXpelsPerMeter;</p>

63、<p>  unsigned biYpelsPerMeter;</p><p>  unsigned biClrUsed;</p><p>  unsigned biClrUsed;</p><p>  unsigned biClrImportant; </p><p>  }BMPINFOHEADER;<

64、/p><p>  BMPINFOHEADER infobeader;</p><p>  在進(jìn)行處理之前,先讀取文件信息,假設(shè)我們將采集到的數(shù)據(jù)存放成0.bmp文件;</p><p><b>  FILE*fp;</b></p><p>  Fp=fopen(“0.bmp”,“rb”);</p><p&g

65、t;  fread(&(header.bfType),2,1,fp);</p><p>  fread(&(header.bfSize),4,1,fp);</p><p>  fread(&(header.bfReserved),2,1,fp);</p><p>  fread(&(header.bfOffBits),4,1,fp);

66、</p><p>  fread(&(header.bfzeof(BMPINFOHEADER),1,fp);</p><p>  接下來,將圖像數(shù)據(jù)存入我們的內(nèi)存中,并將圖像數(shù)據(jù)灰度化:</p><p>  Unsigned char*prodata;</p><p>  Unsigned char*middledata;</p

67、><p>  Int size=infoheader.bitSizeImage;</p><p>  Prodata=malloc(size);</p><p>  Fread(prodata,1,size,fp);</p><p>  Fclose(fp);</p><p>  For(z=0,z<infohead

68、er.biSizeImage;z++)</p><p>  {middledata[z]=(unsigned char)(*prodata+z+2)*3 +(unsigned char )(*(prodata+z+1)*0.6 + (unsigned char)(*prodata +z)*0.1);</p><p><b>  Z++;</b></p>

69、<p>  Middledata[z]=middledata[z-1];</p><p><b>  Z++;</b></p><p>  Middledata[z]=middledata[z-1];</p><p><b>  } </b></p><p>  Memcpy(proda

70、ta,middledata,infoheader.biSizeImge);</p><p>  以下是高斯平滑的主程序:</p><p>  Double Template[9];/*運(yùn)算模版*/</p><p>  Double Coef=(double)(1.0/16.0);/*模版均值*/</p><p>  /*模版?zhèn)€稀疏聲明*/&l

71、t;/p><p>  Template[0]=1.0;Template[1]=2.0;</p><p>  Template[2]=1.0; Template[3]=2.0;</p><p>  Template[4]=4.0; Template[5]=2.0;</p><p>  Template[6]=1.0; Template[7]=

72、2.0;</p><p>  Template[8]=1.0;</p><p>  For(x=1;x<XSaveDim-1;x++)</p><p>  {for(y=1;y<YSaveDim-1;y++)</p><p>  {/*XsaveDim,YsaveDim為圖像存儲尺寸,x,y從1開始并且以XsaveDim-1,Ys

73、aveDim-1結(jié)束,是為了去除邊界*/</p><p>  for(j=1;j<3;j++)</p><p>  {for(k=0;k<3;k++)</p><p>  {/*j,k為模版內(nèi)部循環(huán)變量*/</p><p>  Result+=(*(prodata+GetPixelOffset(x=j-1,y+k-1)))*Tem

74、plate[3*j+k];</p><p><b>  }</b></p><p>  }/*GetPixelOffset為我們自己定義的函數(shù),返回對應(yīng)x,y坐標(biāo)的像素在數(shù)據(jù)空間中的存儲位置,返回值為(XSaveDim*y+x)*(infoheader.biBitCount/8)*/</p><p>  Result*=Coed;</p&

75、gt;<p>  If(Result>255)</p><p>  {Result=255;}</p><p>  Z=GetPixelOffset(x,y);</p><p>  Middledata[z]=(unsigned char)(Result+0.5);</p><p><b>  Z++;</

76、b></p><p>  Middledata[z]=middledata[z-1];</p><p><b>  Z++;</b></p><p>  Middledata[z]=middledata[z-2];</p><p><b>  }</b></p><p>

77、;<b>  }</b></p><p>  5.3 圖像平移主要代碼</p><p>  int Main(int argc, char **argv)</p><p>  {ARMTargetInit(); </p><p>  OSInit(); </p><p>  uHALr

78、_ResetMMU();</p><p>  LCD_Init(); </p><p>  LCD_printf("LCD initialization is OK\n");</p><p>  LCD_printf("320 x 240 Text Mode\n");</p><p&

79、gt;  initOSGUI();</p><p>  LoadFont();</p><p>  LoadConfigSys();</p><p>  LCD_printf("Create task on uCOS-II...\n");</p><p>  OSTaskCreate(Main_Task, (void *

80、)0, (OS_STK *)&Main_Stack[STACKSIZE*8-1], Main_Task_Prio);</p><p><b>  shuoF();</b></p><p>  OSTaskCreate(Main_Task2, (void *)0, (OS_STK *)&Main_Stack2[STACKSIZE*8-1], M

81、ain_Task_Prio);// 創(chuàng)建系統(tǒng)任務(wù)</p><p>  OSAddTask_Init();</p><p>  LCD_printf("Starting uCOS-II...\n");</p><p>  LCD_printf("Entering graph mode...\n");</p><

82、;p>  LCD_ChangeMode(DspGraMode);</p><p>  InitRtc();</p><p>  Nand_Rw_Sem=OSSemCreate(1); </p><p>  OSStart();</p><p><b>  return 0;</b></p><

83、;p><b>  }</b></p><p>  void Main_Task(void *Id) </p><p>  { int x=0,y=0;</p><p>  char xz[]="x:";</p><p>  char yz[]="y

84、:"; </p><p>  U16 x1[100],y1[100],textcontext1[20],*text1context,*text2context,textinit1[20];//</p><p>  char textcontext[]="";</p><p>  char textinit[]="0

85、";</p><p>  char bmpname[12]={'1','2','7','_','1','3',' ',' ','B','M','P',0};</p><p>  strChar2Unicod

86、e(x1,xz);</p><p>  strChar2Unicode(y1,yz);</p><p>  strChar2Unicode(textcontext1,textcontext);</p><p>  strChar2Unicode(textinit1,textinit);</p><p>  pposition1=&po

87、sition1;</p><p>  poutrect=&outrect;</p><p>  poutrect1=&outrect1;</p><p>  outrect.left=240;</p><p>  outrect.top=20;</p><p>  outrect.right=300;&

88、lt;/p><p>  outrect.bottom=40;</p><p>  outrect1.left=240;</p><p>  outrect1.top=50;</p><p>  outrect1.right=300;</p><p>  outrect1.bottom=70;</p><

89、p>  outrect2.left=0;</p><p>  outrect2.top=0;</p><p>  outrect2.right=200;</p><p>  outrect2.bottom=240;</p><p>  text1=CreateTextCtrl(100,poutrect,1,3,NULL,NULL);&l

90、t;/p><p>  text2=CreateTextCtrl(101,poutrect1,1,3,NULL,NULL);</p><p>  SetTextCtrlText(text1,textinit1,TRUE);</p><p>  SetTextCtrlText(text2,textinit1,TRUE);</p><p>  LCD_

91、ChangeMode(DspGraMode);</p><p>  pdc=CreateDC();</p><p>  ClearScreen();</p><p>  TextOut(pdc,220,30,x1,TRUE,1);</p><p>  TextOut(pdc,220,60,y1,TRUE,1);</p><

92、p>  DrawTextCtrl(text1);</p><p>  DrawTextCtrl(text2);</p><p>  DrawRectFrame(pdc,0,0,200,240);</p><p><b>  while(1)</b></p><p>  { ClearScreen();

93、</p><p>  ShowBmp(pdc,bmpname,50,pos);</p><p>  itoa(50,strx);</p><p>  itoa(pos,stry); </p><p><b>  pos+=10;</b></p><p>  if(pos>=150)<

94、/p><p>  {pos=0; } </p><p>  for(t=0;t<5;t++)</p><p>  {textinit1[t]=strx[t];} </p><p>  SetTextCtrlText(text1,textinit1,TRUE);</p><p>  

95、for(t=0;t<5;t++)</p><p>  {textinit1[t]=stry[t];} </p><p>  SetTextCtrlText(text2,textinit1,TRUE);</p><p>  DrawTextCtrl(text1);</p><p>  DrawTextCtrl(text2);</p&

96、gt;<p>  OSTimeDly(500); }</p><p>  DestoryDC(pdc);}</p><p>  5.4 圖像縮放主要代碼</p><p>  void Main_Task(void *Id) //Main_Test_Task</p><p>  {char bmpname[

97、12]={'1','2','7','_','3','2',' ',' ','B','M','P',0};</p><p>  int i=0,status=0,j=0;</p><p><b>  PDC

98、pdc;</b></p><p>  char n2[]="ecjtu";</p><p>  U16 namme[200];</p><p>  U16 ch0={'1'};</p><p>  char str2[]={'1','2','7',

99、'_','3','2',' ',' ','B','M','P',0};</p><p>  U16 str1[]={'1','2','7','_','3','2',' ',&#

100、39; ','B','M','P',0};</p><p>  U16 str3[17];</p><p>  strChar2Unicode(namme,n2);</p><p>  //POSMSG pMsg;//消息定義</p><p>  LCD_ChangeMode(DspGr

101、aMode);//轉(zhuǎn)換LCD顯示模式為文本顯示模式</p><p>  //LCD_Cls();//文本模式下清屏命令</p><p>  //ClearScreen();</p><p>  pdc=CreateDC();</p><p>  ClearScreen();</p><p><b>  for

102、(;;)</b></p><p>  { int i,j,k,nbyte;</p><p>  U32 cx,cy,wold,hold,wnew,hnew,x0,y0,x1,y1,oldx,oldy;</p><p>  U32 color;</p><p>  U32 colorbuf[320][240];</p>

103、<p>  FILE* pfile;</p><p>  U8 *pbmp,*bmpstart;</p><p>  static U8 bmp[4096];</p><p>  float zoomRatio=2,num1;</p><p>  INT8U err;</p><p>  BITMAPF

104、ILEHEADER bmpfileheader;</p><p>  BITMAPINFOHEADER bmpinfoheader;</p><p>  if((pfile=OpenOSFile(bmpname, FILEMODE_READ))==NULL)</p><p><b>  return;</b></p><p&

105、gt;  ReadOSFile(pfile, (U8*)bmp, 2);</p><p>  //if((bmp[0]&0xffff)!='MB' )//不是bmp文件</p><p>  if(bmp[0]!='B' ||bmp[1] !='M')</p><p><b>  return;&l

106、t;/b></p><p>  num1=(float)(1.0/zoomRatio);</p><p>  ReadOSFile(pfile, (U8*)&bmpfileheader, sizeof(BITMAPFILEHEADER));</p><p>  ReadOSFile(pfile, (U8*)&bmpinfoheader, siz

107、eof(BITMAPINFOHEADER));</p><p>  wold=bmpinfoheader.biWidth;</p><p>  hold=bmpinfoheader.biHeight;</p><p>  nbyte=bmpinfoheader.biBitCount/8;//第x行,第y列 </p><p>&l

108、t;b>  x0=0;</b></p><p>  y0=hold-1;</p><p>  //縮放的關(guān)鍵問題是:在對一副圖片進(jìn)行縮放時,可能用到上一次讀入的行象素值,然而,readosfile()函數(shù)</p><p>  //每讀一次就向前推進(jìn),故必須標(biāo)記讀入時機(jī)《使用oldx oldy》</p><p><b&g

109、t;  oldx=x0;</b></p><p><b>  oldy=y0;</b></p><p><b>  num1=1;</b></p><p>  bmpstart=bmp;</p><p><b>  pbmp=bmp;</b></p>

110、<p>  for(i=hold-1;i>=0;i--)</p><p>  {pbmp=bmp;</p><p>  if(!ReadOSFile(pfile, bmp,wold*nbyte+((wold*nbyte)%2)))</p><p><b>  break;</b></p><p>  fo

111、r(j=0;j<wold;j++)</p><p>  { color=*pbmp;</p><p>  for(k=0;k<nbyte-1;k++)</p><p>  {color<<=8;</p><p><b>  pbmp++;</b></p><p>  c

112、olor|=*pbmp; }</p><p><b>  pbmp++;</b></p><p>  colorbuf[i][j]=color;}}</p><p>  num1=(float)(1.0/zoomRatio);</p><p>  wnew = (U32)(wold*zoomRatio+0.5);<

113、/p><p>  hnew = (U32)(hold*zoomRatio+0.5);</p><p>  for(y1=0;y1<hnew;y1++)</p><p>  for(x1=0;x1<wnew;x1++)</p><p>  {x0= (U32)(x1*num1);</p><p>  y0= (U

114、32)(y1*num1);</p><p>  SetPixel(pdc,y1,x1,colorbuf[x0][y0]);}</p><p>  /////////////////////////////////////////</p><p>  CloseOSFile(pfile);</p><p>  OSTimeDly(200);//

115、主任務(wù)掛起200毫秒}}</p><p>  5.5 轉(zhuǎn)置圖像主要代碼</p><p>  void Main_Task(void *Id) //Main_Test_Task</p><p>  {char bmpname[12]={'1','2','7','_','3&

116、#39;,'2',' ',' ','B','M','P',0};</p><p>  int i=0,status=0,j=0;</p><p><b>  PDC pdc;</b></p><p>  char n2[]="ecjtu&q

117、uot;;</p><p>  U16 namme[200];</p><p>  U16 ch0={'1'};</p><p>  char str2[]={'1','2','7','_','3','2',' ',' ',

118、'B','M','P',0};</p><p>  U16 str1[]={'1','2','7','_','3','2',' ',' ','B','M','P',0};</p>

119、<p>  U16 str3[17];</p><p>  strChar2Unicode(namme,n2);</p><p>  LCD_ChangeMode(DspGraMode);//轉(zhuǎn)換LCD顯示模式為文本顯示模式</p><p>  pdc=CreateDC();</p><p>  ClearScreen();<

120、;/p><p><b>  for(;;)</b></p><p>  {int i,j,k,nbyte;</p><p>  U32 cx,cy;</p><p>  U32 color;</p><p>  FILE* pfile;</p><p><b>  U

121、8 *pbmp;</b></p><p>  static U8 bmp[4096];</p><p>  INT8U err;</p><p>  BITMAPFILEHEADER bmpfileheader;</p><p>  BITMAPINFOHEADER bmpinfoheader;</p><p&

122、gt;  if((pfile=OpenOSFile(bmpname, FILEMODE_READ))==NULL)</p><p><b>  return;</b></p><p>  ReadOSFile(pfile, (U8*)bmp, 2);</p><p>  if(bmp[0]!='B' ||bmp[1] !=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論