版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于圖像識別處理的橋梁底面裂縫檢測方法的研究.pdf
- 圖像識別本科畢業(yè)設(shè)計
- 橋梁裂縫檢測中圖像識別處理與測量技術(shù)的研究.pdf
- 智能型紙幣清分機(jī)圖像識別處理方法研究.pdf
- 模糊圖像識別建模與實現(xiàn)【畢業(yè)設(shè)計】
- 休克的識別處理
- 基于足球機(jī)器人的圖像處理與圖像識別.pdf
- 基于圖像識別的車輛圖像處理技術(shù)研究.pdf
- 基于圖像識別的車型識別系統(tǒng)畢業(yè)論文
- 畢業(yè)設(shè)計--基于數(shù)字圖像處理的車牌定位與識別
- 休克的識別處理課件
- 基于NiosⅡ的圖像識別系統(tǒng)設(shè)計.pdf
- 基于圖像識別的濾波器的設(shè)計
- 模糊圖像識別建模與實現(xiàn)【畢業(yè)設(shè)計+開題報告+文獻(xiàn)綜述】
- 基于FPGA的細(xì)胞圖像識別預(yù)處理的硬件研究.pdf
- 文檔圖像識別預(yù)處理研究.pdf
- 圖像處理和圖像識別中常用的opencv函數(shù)
- 視覺文檔圖像識別預(yù)處理.pdf
- 基于稀疏表示的圖像識別.pdf
- 基于Hopfield網(wǎng)絡(luò)的圖像識別.pdf
評論
0/150
提交評論