版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本科畢業(yè)設(shè)計(jì)(論文)摘要幾何變換是最常見(jiàn)的圖像處理手段,通過(guò)對(duì)變形的圖像進(jìn)行幾何校正,可以得出準(zhǔn)確的圖像。常用的幾何變換功能包括圖像的平移、圖像的鏡像變換、圖像的轉(zhuǎn)置、圖像的縮放、圖像的旋轉(zhuǎn)等等。目前數(shù)字圖像處理的應(yīng)用越來(lái)越廣泛,已經(jīng)滲透到工業(yè)、航空航天、軍事等各個(gè)領(lǐng)域,在國(guó)民經(jīng)濟(jì)中發(fā)揮越來(lái)越大的作用。作為數(shù)字圖像處理的一個(gè)重要部分,本文介紹的工作是如何用VisualC++編程工具設(shè)計(jì)一個(gè)完整的應(yīng)用程序,實(shí)現(xiàn)經(jīng)典的圖像幾何變換功能。程序大概分為兩大部分:讀寫(xiě)B(tài)MP圖像,和數(shù)字圖像的幾何變換。即首先用VisualC++創(chuàng)建一個(gè)多文檔應(yīng)用程序框架,在實(shí)現(xiàn)任意BMP圖像的讀寫(xiě),打印,以及剪貼板操作的基礎(chǔ)上,完成經(jīng)典的圖像幾何變換功能。圖像幾何變換的VisualC++編程實(shí)現(xiàn),為校內(nèi)課題的實(shí)現(xiàn)提供了一個(gè)實(shí)例。關(guān)鍵字:圖像處理;幾何變換;BMP圖像;VisualC++AbstractThegeometricaltransformationisthemostpopularimageprocessingmethod.Wecangetanexactimagefromadistortedimagethroughthegeometricalemendation.Thetransformingmethodsincommonuseincludingtranslation,mirror,rotation,ortransposeanimage.Sincethedomainofdigitalimageprocessingapplicationhasbecomingwiderandwider,itpenetratesintomanyfields.Suchasindustry,aviation,military,andhasbecomemuchmoreimportantineveryaspectsofourlife.Beinganimportantpartofdigitalimageprocessing,theworkintroducedinthisarticleisabouthowtodesignanintegratedapplicationprogramusingVisualC++toimplementtheclassicgeometricaltransformation.Theprogramcanbedividedintotwoparts:readorwriteaBMPimage,andthegeometricaltransformationforit.SoIdesignedamultipledocumentinterfacefirst,onthebasicofread,write,print,andtheclipboardoperationofanimage,thencarryoutthefunctionofgeometricaltransformationfinally.TheimplementationofgeometricaltransformationusingVisualC++isagoodexampleforcarryingoutintramuralproblems.Keywords:Imageprocessing;Geometricaltransformation;BMPimage;VisualC++目錄TOC\o"1-3"\h\z第一章緒論 11.1何謂數(shù)字圖像處理 11.1.1圖像的概念 11.1.2圖像處理 11.2圖像處理學(xué)的內(nèi)容和其他相關(guān)學(xué)科的關(guān)系 21.2.1圖像處理學(xué)的內(nèi)容 21.2.2圖像處理學(xué)與相關(guān)學(xué)科的關(guān)系 21.3數(shù)字圖像處理的特點(diǎn)及其應(yīng)用 21.3.1數(shù)字圖像處理的特點(diǎn) 21.3.2數(shù)字圖像處理的應(yīng)用 31.4VisualC++ 41.4.1VisualC++簡(jiǎn)述 41.4.2將VisualC++應(yīng)用于數(shù)字圖像的幾何變換 4第二章數(shù)字圖像處理的基本概念 52.1圖像和調(diào)色板 52.1.1圖像的顯示 52.1.2調(diào)色板 52.1.3色彩系統(tǒng) 62.1.4灰度圖 72.2GDI位圖 72.2.1從資源中裝入GDI位圖 82.2.2伸縮位圖 82.3設(shè)備無(wú)關(guān)位圖(DIB) 82.3.1BMP文件中DIB的結(jié)構(gòu) 92.3.2DIB訪問(wèn)函數(shù) 112.3.3使用DIB讀寫(xiě)B(tài)MP文件 12第三章圖像的幾何變換 143.1圖像的平移 143.1.1理論基礎(chǔ) 143.1.2VisualC++編程實(shí)現(xiàn) 153.2圖像的鏡像變換 193.2.1理論基礎(chǔ) 193.2.2VisualC++編程實(shí)現(xiàn) 203.3圖像的轉(zhuǎn)置 233.3.1理論基礎(chǔ) 233.3.2VisualC++編程實(shí)現(xiàn) 243.4圖像的縮放 263.4.1理論基礎(chǔ) 263.4.2VisualC++編程實(shí)現(xiàn) 273.5圖像的旋轉(zhuǎn) 303.5.1理論基礎(chǔ) 313.5.2VisualC++編程實(shí)現(xiàn) 313.6本程序基本類對(duì)象之間的相互訪問(wèn)關(guān)系 35第四章結(jié)論與展望 374.1結(jié)論 374.2展望 37致謝 39參考文獻(xiàn) 40第一章緒論1.1何謂數(shù)字圖像處理數(shù)字圖像處理(DigitalImageProcessing),就是利用數(shù)字計(jì)算機(jī)或則其他數(shù)字硬件,對(duì)從圖像信息轉(zhuǎn)換而得到的電信號(hào)進(jìn)行某些數(shù)學(xué)運(yùn)算,以提高圖像的實(shí)用性。例如從衛(wèi)星圖片中提取目標(biāo)物的特征參數(shù),三維立體斷層圖像的重建等。總的來(lái)說(shuō),數(shù)字圖像處理包括點(diǎn)運(yùn)算、幾何處理、圖像增強(qiáng)、圖像復(fù)原、圖像形態(tài)學(xué)處理、圖像編碼、圖像重建、模式識(shí)別等。目前數(shù)字圖像處理的應(yīng)用越來(lái)越廣泛,已經(jīng)滲透到工業(yè)、醫(yī)療保健、航空航天、軍事等各個(gè)領(lǐng)域,在國(guó)民經(jīng)濟(jì)中發(fā)揮越來(lái)越大的作用。1.1.1圖像的概念圖像是對(duì)客觀對(duì)象的一種相似性的、生動(dòng)性的描述或?qū)懻?。或者說(shuō)圖像是客觀對(duì)象的一種表示,它包含了被描述對(duì)象的有關(guān)信息。它是人們最主要的信息來(lái)源。據(jù)統(tǒng)計(jì),一個(gè)人獲取的信息大約有75%來(lái)自視覺(jué)。圖像根據(jù)其形式或產(chǎn)生方法來(lái)分類。從人眼的視覺(jué)特點(diǎn)上可將圖像分為可見(jiàn)圖像和不可見(jiàn)圖像。其中可見(jiàn)圖像的一個(gè)子集為圖片,它包括照片、用線條畫(huà)的圖和畫(huà);另一個(gè)子集為光圖像,即用透鏡、光柵和全息技術(shù)產(chǎn)生的圖像。不可見(jiàn)的圖像包括不可見(jiàn)光成像和不可見(jiàn)量,如溫度、壓力及人口密度等的分布圖。按波段多少圖像可分為但波段、多波段和超波段圖像。但波段圖像上每點(diǎn)只有一個(gè)亮度值;多波段圖像上每點(diǎn)不只一個(gè)特性。例如紅、綠、藍(lán)三波段光譜圖像或彩色圖像上的每個(gè)點(diǎn)具有紅、綠、藍(lán)三個(gè)亮度值,這三個(gè)值表示在不同光波段上的強(qiáng)度,人眼看來(lái)就是不同的顏色。超波段圖像上每個(gè)點(diǎn)具有幾十或幾百個(gè)特性。按圖像空間坐標(biāo)和明暗程度的連續(xù)性可分為模擬圖像和數(shù)字圖像。模擬圖像指空間坐標(biāo)和明暗程度都是連續(xù)變化的、計(jì)算機(jī)無(wú)法直接處理的圖像。數(shù)字圖像是一種空間坐標(biāo)和灰度均不連續(xù)的、用離散的數(shù)字(一般用整數(shù))表示的圖像。這樣的圖像才能被計(jì)算機(jī)處理。1.1.2圖像處理對(duì)圖像進(jìn)行一系列的操作,以達(dá)到預(yù)期的目的的技術(shù)稱作圖像處理。圖像處理可分為模擬圖像處理和數(shù)字圖像處理兩種方式。利用光學(xué)、照像和電子學(xué)方法對(duì)模擬圖像的處理稱為模擬圖像處理。光學(xué)圖像處理方法已有很長(zhǎng)的歷史,在激光全息技術(shù)出現(xiàn)后,它得到了進(jìn)一步的發(fā)展。盡管光學(xué)圖像處理理論日臻完善,且處理速度快,信息容量大,分辨率高,又非常經(jīng)濟(jì),但處理精度不高,穩(wěn)定性差,設(shè)備笨重,操作不方便和工藝水平不高等原因限制了它的發(fā)展速度。從20世紀(jì)60年代起,隨著電子計(jì)算機(jī)技術(shù)的進(jìn)步,計(jì)算機(jī)圖像處理獲得了飛躍發(fā)展。所謂數(shù)字圖像處理,就是利用計(jì)算機(jī)對(duì)數(shù)字圖像進(jìn)行系列操作,從而獲得某種預(yù)期的結(jié)果的技術(shù)。數(shù)字圖像處理離不開(kāi)計(jì)算機(jī),因此又稱計(jì)算機(jī)圖像處理。為了與模擬圖像處理想?yún)^(qū)別,下文采用“數(shù)字圖像處理”。1.2圖像處理學(xué)的內(nèi)容和其他相關(guān)學(xué)科的關(guān)系1.2.1圖像處理學(xué)的內(nèi)容至20世紀(jì)70年代末以來(lái),由于數(shù)字技術(shù)和微電子技術(shù)的迅猛發(fā)展給數(shù)字圖像處理提供了先進(jìn)的技術(shù)手段,基于計(jì)算機(jī)的圖像處理學(xué)也就從信息處理、自動(dòng)控制系統(tǒng)論、計(jì)算機(jī)科學(xué)、數(shù)據(jù)通信、電視技術(shù)等學(xué)科中脫穎而出,成為研究“圖像信息的獲取、傳輸、存儲(chǔ)、變換、顯示、理解與綜合利用”的一門(mén)嶄新學(xué)科。圖像處理學(xué)所包含的內(nèi)容是相當(dāng)豐富的,根據(jù)抽象程度的不同可分為三個(gè)層次:狹義圖像處理、圖像分析和圖像理解。狹義圖像處理著重強(qiáng)調(diào)在圖像之間進(jìn)行的變換,主要是指對(duì)圖像進(jìn)行各種操作以改善圖像的視覺(jué)效果,或?qū)D像進(jìn)行壓縮編碼以減少所需存儲(chǔ)空間或傳輸時(shí)間、傳輸通路的要求。它是一個(gè)從圖像到圖像的過(guò)程。圖像分析主要是對(duì)圖像中感興趣的目標(biāo)進(jìn)行檢測(cè)和測(cè)量,從而建立對(duì)圖像的描述。圖像分析是一個(gè)從圖像到數(shù)值或符號(hào)的過(guò)程。圖像理解超出了目前的所學(xué)范圍,則不加以討論。1.2.2圖像處理學(xué)與相關(guān)學(xué)科的關(guān)系圖像處理學(xué)是一門(mén)綜合性邊緣學(xué)科。從研究范圍來(lái)看,它與計(jì)算機(jī)圖形學(xué)、模式識(shí)別、計(jì)算機(jī)視覺(jué)等既有聯(lián)系又有區(qū)別。圖形學(xué)原本指用圖形、圖表、繪圖等形式表達(dá)數(shù)據(jù)信息的科學(xué)。而計(jì)算機(jī)圖形學(xué)研究的是如何利用計(jì)算機(jī)技術(shù)來(lái)產(chǎn)生這些形式。和圖像分析對(duì)比,兩者的處理對(duì)象和輸出結(jié)果正好相反。計(jì)算機(jī)圖形學(xué)試圖從非圖像形式的數(shù)據(jù)描述來(lái)生成圖像。另一方面,模式識(shí)別與圖像分析則比較相似,只是前者試圖把圖像抽象成符號(hào)描述的類別,它們有相同的輸入,而不同的輸出結(jié)果之間可較方便的進(jìn)行轉(zhuǎn)換。至于計(jì)算機(jī)視覺(jué)主要強(qiáng)調(diào)用計(jì)算機(jī)去實(shí)現(xiàn)人的視覺(jué)功能,其中涉及圖像處理的許多技術(shù),但目前的研究?jī)?nèi)容主要與圖像理解相結(jié)合。由此看來(lái),以上學(xué)科相互聯(lián)系,相互交叉,它們之間并沒(méi)有絕對(duì)的界限。雖各有側(cè)重但又相互補(bǔ)充。另外以上各學(xué)科都得到了人工智能、神經(jīng)網(wǎng)絡(luò)、遺傳算法、模糊邏輯等新理論、新工具、新技術(shù)的支持,所以它們又都在近年得到了長(zhǎng)足發(fā)展。1.3數(shù)字圖像處理的特點(diǎn)及其應(yīng)用在計(jì)算機(jī)出現(xiàn)之前,模擬圖像處理占主導(dǎo)地位。隨著計(jì)算機(jī)的發(fā)展,數(shù)字圖像處理發(fā)展速度越來(lái)越快。與人類對(duì)視覺(jué)機(jī)能著迷的歷史相比,它是一門(mén)相對(duì)年輕的學(xué)科。盡管目前一般采用順序處理的計(jì)算機(jī),對(duì)大數(shù)據(jù)量的圖像處理速度不如光學(xué)方法快,但是其處理的精度高,實(shí)現(xiàn)多種功能的、高度復(fù)雜的運(yùn)算求解非常靈活方便。在其短短的歷史中,它卻成功的應(yīng)用于幾乎所有與成像有關(guān)的領(lǐng)域,并正發(fā)揮相當(dāng)重要的作用。1.3.1數(shù)字圖像處理的特點(diǎn)同模擬圖像處理相比,數(shù)字圖像處理有很多優(yōu)點(diǎn)。主要表現(xiàn)在:精度高不管是對(duì)4bit還是8bit和其他比特圖像的處理,對(duì)計(jì)算機(jī)程序來(lái)說(shuō)幾乎是一樣的。即使處理圖像變大,只需改變數(shù)組的參數(shù),而處理方法不變。所以從原理上不管處理多高精度的圖像都是可能的。而在模擬圖像處理中,要想使精度提高一個(gè)數(shù)量級(jí),就必須對(duì)處理裝置進(jìn)行大幅度改進(jìn)。再現(xiàn)性好不管是什么圖像,它們均用數(shù)組或集合表示。將它們輸入到計(jì)算機(jī)內(nèi),用計(jì)算機(jī)容易處理的方式表示。在傳送和復(fù)制圖像時(shí),只在計(jì)算機(jī)內(nèi)部進(jìn)行處理,這樣數(shù)據(jù)就不會(huì)丟失或遭破壞,保持了完好的再現(xiàn)性。而在模擬圖像處理中,就會(huì)因?yàn)楦鞣N干擾及設(shè)備故障而無(wú)法保持圖像的再現(xiàn)性。通用性、靈活性高不管是可視圖像還是X線照片、紅外線熱成像、超聲波圖像等不可見(jiàn)光成像,盡管這些圖像成像體系中的設(shè)備規(guī)模和精度各不相同,但當(dāng)把圖像信號(hào)直接進(jìn)行A/D變換,或記錄成照片再數(shù)字化,對(duì)于計(jì)算機(jī)來(lái)說(shuō)都能用二維數(shù)組表示,不管什么樣的圖像都可以用同樣的方法進(jìn)行處理,這就是計(jì)算機(jī)處理的通用性。另外,對(duì)處理程序自由加以改變,可進(jìn)行各種各樣的處理。如上下滾動(dòng)、漫游、拼圖、合成、變換、放大、縮小和各種邏輯運(yùn)算等,所以靈活性很高。1.3.2數(shù)字圖像處理的應(yīng)用計(jì)算機(jī)圖像處理和計(jì)算機(jī)、多媒體、智能機(jī)器人、專家系統(tǒng)等技術(shù)的發(fā)展緊密相關(guān)。近年來(lái)計(jì)算機(jī)識(shí)別、理解圖像的技術(shù)發(fā)展很快,也就是圖像處理的目的除了直接供人觀看(如醫(yī)學(xué)圖像是為醫(yī)生觀看作診斷)外,還進(jìn)一步發(fā)展了與計(jì)算機(jī)視覺(jué)有關(guān)的應(yīng)用,如郵件自動(dòng)分檢,車(chē)輛自動(dòng)駕駛等。下面僅羅列了一些典型應(yīng)用實(shí)例,而實(shí)際應(yīng)用更廣。在生物醫(yī)學(xué)中的應(yīng)用主要包括顯微圖像處理;DNA顯示分析;紅、白血球分析計(jì)數(shù);蟲(chóng)卵及組織切片的分析;癌細(xì)胞的識(shí)別;染色體分析等等。遙感航天中的應(yīng)用軍事偵察、定位、導(dǎo)航、指揮等應(yīng)用;多光譜衛(wèi)星圖像分析;地形、地圖、國(guó)土普查;地質(zhì)、礦藏勘探;天文、太空星體的探測(cè)及分析等。工業(yè)應(yīng)用CAD和CAM技術(shù)用于模具、零件制造、服裝、印染業(yè);零件、產(chǎn)品無(wú)損檢測(cè),焊縫及內(nèi)部缺陷檢查;交通管制、機(jī)場(chǎng)監(jiān)控;火車(chē)車(chē)皮識(shí)別等。軍事公安領(lǐng)域中的應(yīng)用巡航導(dǎo)彈地形識(shí)別;指紋自動(dòng)識(shí)別;警戒系統(tǒng)及自動(dòng)火炮控制;反偽裝偵察;手跡、人像、印章的鑒定識(shí)別;過(guò)期檔案文字的復(fù)原;集裝箱的不開(kāi)箱檢查等。其他應(yīng)用圖像的遠(yuǎn)距離通信;多媒體計(jì)算機(jī)系統(tǒng)及應(yīng)用;電視電話;服裝試穿顯示;理發(fā)發(fā)型預(yù)測(cè)顯示;電視會(huì)議;辦公自動(dòng)化、現(xiàn)場(chǎng)視頻管理等。1.4VisualC++1.4.1VisualC++簡(jiǎn)述VisualC++(簡(jiǎn)稱VC)是微軟公司提供的基于C/C++的應(yīng)用程序集成開(kāi)發(fā)工具。VC擁有豐富的功能和大量的擴(kuò)展庫(kù),使用它能有效的創(chuàng)建高性能的Windows應(yīng)用程序和Web應(yīng)用程序。VC的優(yōu)越性主要表現(xiàn)在以下幾個(gè)方面:開(kāi)發(fā)分布式應(yīng)用。開(kāi)發(fā)的應(yīng)用程序運(yùn)行效率高、具有健壯性。能縮短軟件升級(jí)周期。能夠生成多線程應(yīng)用,而多線程應(yīng)用對(duì)于增加并發(fā)響應(yīng)有實(shí)際意義。VC除了提供高效的C/C++編譯器外,還提供了大量的可重用類和組件,包括著名的微軟基礎(chǔ)類庫(kù)(MFC)和活動(dòng)模板類庫(kù)(ATL),因此它是軟件開(kāi)發(fā)人員不可多得的開(kāi)發(fā)工具。1.4.2將VisualC++應(yīng)用于數(shù)字圖像的幾何變換VC豐富的功能和大量的擴(kuò)展庫(kù),類的重用特性以及它對(duì)函數(shù)庫(kù)、DLL庫(kù)的支持能使程序更好的模塊化,并且通過(guò)向?qū)С绦虼蟠蠛?jiǎn)化了庫(kù)資源的使用和應(yīng)用程序的開(kāi)發(fā),正由于VC具有明顯的優(yōu)勢(shì),因而我選擇了它來(lái)作為數(shù)字圖像幾何變換的開(kāi)發(fā)工具。在本程序的開(kāi)發(fā)過(guò)程中,VC的核心知識(shí)、消息映射機(jī)制、對(duì)話框控件編程等都得到了生動(dòng)的體現(xiàn)和靈活的應(yīng)用。第二章數(shù)字圖像處理的基本概念本章將詳細(xì)介紹Windows下VisualC++數(shù)字圖像處理的基礎(chǔ)知識(shí)。主要的內(nèi)容有:1:Windows位圖的結(jié)構(gòu)和調(diào)色板的概念;2:GDI位圖與設(shè)備無(wú)關(guān)位圖的概念;3:如何構(gòu)造自己的DIB函數(shù)庫(kù),及如何用VisualC++編程來(lái)實(shí)現(xiàn)Windows位圖的讀寫(xiě)。2.1圖像和調(diào)色板2.1.1圖像的顯示普通的顯示器屏幕是由許多的點(diǎn)構(gòu)成的,這些點(diǎn)稱為像素。顯示時(shí)采用掃描的方式:電子槍每次從左到右掃描一行,為每個(gè)像素著色,然后再像這樣從上到下掃描整個(gè)屏幕,利用人眼的視覺(jué)暫留效應(yīng)就可以顯示出一屏完整的圖像。為了防止閃爍,每秒要重復(fù)上述掃描過(guò)程幾十次。一般刷新頻率大于80Hz時(shí),人眼感受不到屏幕刷新而產(chǎn)生的閃爍,這種顯示器被稱為位映像設(shè)備。所謂位映像,就是指一個(gè)二維的像素矩陣,而位圖就是采用位映像方法顯示和存儲(chǔ)的圖像。對(duì)于彩色圖像,它的顯示必須從三原色RGB的概念說(shuō)起。眾所周知,自然界中的所有顏色都可以由紅綠藍(lán)(R、G、B)3原色組合而成。針對(duì)三原色成分的多少,可以人為的將每種顏色分成0到255共256個(gè)等級(jí)。這樣,根據(jù)紅、綠、藍(lán)各種不同的組合,就能表示出256*256*256(約1600萬(wàn))種顏色。當(dāng)一幅圖中每個(gè)像素被賦予不同的RGB值時(shí),就能呈現(xiàn)出五彩繽紛的顏色了,這就形成了彩色圖像。2.1.2調(diào)色板如果一幅圖像的每個(gè)像素都用其RGB分量來(lái)表示,那么所有的圖像文件都將變的非常龐大,實(shí)際上的做法不完全是這樣的,可以先來(lái)看一個(gè)簡(jiǎn)單的計(jì)算。對(duì)一幅200*200的16色圖像,它共有40000個(gè)像素,如果每一個(gè)像素都用R、G、B三個(gè)分量表示,則一個(gè)像素需要3個(gè)字節(jié),這樣保存整個(gè)圖像要用200*200*3即120000字節(jié)。但是如果采用下面的方法,就能省很多字節(jié)。對(duì)于16色圖像,圖中最多只有16種顏色,如果采用一個(gè)顏色表,表中的每一行記錄一種顏色的R、G、B值,這樣當(dāng)表示一個(gè)像素的顏色時(shí),只需要指出該顏色是在第幾行,即該顏色在顏色表中的索引值便可以。例如,如果表的第0行為255,0,0(紅色),那么當(dāng)某個(gè)像素為紅色時(shí),只需要標(biāo)明0即可。通過(guò)顏色索引表來(lái)表示圖像,16種狀態(tài)可以用4位(bit)表示,所以一個(gè)像素要用半個(gè)字節(jié)。整個(gè)圖像要用200*200*0.5即20000字節(jié),在加上顏色表占用3*16=48字節(jié),也不過(guò)20048字節(jié)。這樣一幅圖像整個(gè)占用的字節(jié)數(shù)只是前面的1/6。其實(shí)這張RGB表,就是通常所說(shuō)的調(diào)色板(Palette),或顏色查找表LUT(LookUpTable)。不僅僅是Windows位圖,其他許多圖像文件格式,例如“.pcx”、“.tif”、“.gif”等都用到了調(diào)色板。還有一種情況,即真彩色圖像(又叫做24位圖像)的顏色種類高達(dá)256*256*256=16777216種,也就是包含上述提到的R、G、B顏色表示方法中所有的顏色。真彩色圖像是說(shuō)它具有顯示所有顏色的能力,即可以包含所有的顏色。通常,在表示真彩色圖像時(shí),每個(gè)像素直接用R、G、B這3個(gè)分量字節(jié)表示,而不采用調(diào)色板技術(shù)。原因很簡(jiǎn)單:如果使用調(diào)色板,表示一個(gè)像素顏色在調(diào)色板中的索引要用24位,這和直接用R、G、B這3個(gè)分量表示用的字節(jié)數(shù)一樣,不但沒(méi)有節(jié)省任何空間,還要加上一個(gè)256*256*256*3個(gè)字節(jié)大的調(diào)色板。所以真彩色直接用R、G、B這3個(gè)分量表示。2.1.3色彩系統(tǒng)前面介紹的RGB色彩系統(tǒng)是最常用的顏色系統(tǒng),但在其他方面也會(huì)用到其他的色彩系統(tǒng),常見(jiàn)的有:CMY色彩系統(tǒng)CMY(Cyan,Megenta,Yellow)色彩系統(tǒng)也是一種常用的表示顏色的方式。計(jì)算機(jī)屏幕的顯示通常用RGB色彩系統(tǒng),它是通過(guò)顏色的相加來(lái)產(chǎn)生其他顏色,這種做法通常稱為加色合成法。而在印刷工業(yè)上則通常用CMY色彩系統(tǒng),它是通過(guò)顏色相減來(lái)產(chǎn)生其他顏色的,所以稱這種方式為減色合成法。圖2.1RGB與CMY色彩系統(tǒng)關(guān)系圖YIQ色彩系統(tǒng)YIQ色彩系統(tǒng)通常被北美的電視系統(tǒng)所采用,這里Y不是指黃色,而是指顏色的明視度,即亮度。其實(shí)Y就是圖像的灰度值,而I和Q則是指色調(diào),即描述圖像色彩及飽和度的屬性。RGB與YIQ之間的對(duì)應(yīng)關(guān)系如下:YUV色彩系統(tǒng)YUV色彩系統(tǒng)被歐洲的電視系統(tǒng)所采用,其中Y和上面的YIQ色彩系統(tǒng)中的Y相同,都是指亮度。U和V雖然也是指色調(diào),但是和I與Q的表達(dá)方式不完全相同。RGB與YUV之間的對(duì)應(yīng)關(guān)系如下:YCbCr色彩系統(tǒng)YCbCr色彩系統(tǒng)也是一種常見(jiàn)的色彩系統(tǒng),JPEG采用的色彩系統(tǒng)正是該系統(tǒng)。它是從YUV色彩系統(tǒng)衍生出來(lái)的。其中Y還是指亮度,而Cb和Cr則是將U和V做少量調(diào)整而得到的。RGB色彩系統(tǒng)和YCbCr色彩系統(tǒng)之間的對(duì)應(yīng)關(guān)系如下:2.1.4灰度圖灰度圖(Grayscale)是指只含亮度信息,不含色彩信息的圖像。因此,要表示灰度圖,就需要把亮度值進(jìn)行量化。通常劃分為0到255共256個(gè)級(jí)別,0最暗(全黑),255最亮(全白)。BMP格式的文件中并沒(méi)有灰度圖這個(gè)概念,但是可以很容易的用BMP文件來(lái)表示灰度圖。方法是用256色的調(diào)色板,只不過(guò)這個(gè)調(diào)色板有點(diǎn)特殊,每一項(xiàng)的RGB值都是相同的。也就是說(shuō)RGB值從(0,0,0),(1,1,1)一直到(255,255,255)。(0,0,0)是全黑色,(255,255,255)是全白色,中間的是灰色。對(duì)于R=G=B的色彩,帶入YIQ或YUV色彩系統(tǒng)轉(zhuǎn)換公式中可以看到其顏色分量都是0,即沒(méi)有色彩信息?;叶葓D使用比較方便。首先RGB的值都一樣;其次。圖像數(shù)據(jù)即顏色表索引值,也就是實(shí)際的RGB的亮度值;另外因?yàn)槭?56色的調(diào)色板,所以圖像數(shù)據(jù)中一個(gè)字節(jié)代表一個(gè)像素。如果是彩色的256色圖,圖像處理后有可能會(huì)產(chǎn)生不屬于這256種顏色的新顏色,所以,圖像處理一般采用灰度圖。2.2GDI位圖GDI是圖形設(shè)備接口(GraphicsDeviceInterface)的縮寫(xiě)。GDI位圖是一種GDI對(duì)象,在Microsoft基本類(MFC)庫(kù)中用CBitmap類來(lái)表示。在CBitmap類對(duì)象中,包含一種和Windows的GDI模塊有關(guān)的Windows數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)是與設(shè)備相關(guān)的。應(yīng)用程序可以得到GDI位圖數(shù)據(jù)結(jié)構(gòu)的一個(gè)備份,但是其中位的安排則完全依賴于顯示設(shè)備??梢詫DI位圖數(shù)據(jù)在同一臺(tái)計(jì)算機(jī)的內(nèi)的不同的應(yīng)用程序間任意傳遞,但是由于其對(duì)設(shè)備的依賴性,在不同類型計(jì)算機(jī)間的傳遞是沒(méi)有任何意義的。下圖是CBitmap類的繼承關(guān)系圖。CBitmap類封裝了WindowsGDI位圖,同時(shí)提供了一些操作位圖的成員函數(shù)。在使用CBitmap對(duì)象時(shí),首先要?jiǎng)?chuàng)建一個(gè)CBitmap對(duì)象,然后把它選進(jìn)設(shè)備環(huán)境中,再調(diào)用其成員函數(shù)進(jìn)行處理,在使用完畢后,把它從設(shè)備環(huán)境中選出并刪除。圖2.2CBitmap類的繼承關(guān)系圖2.2.1從資源中裝入GDI位圖為了加載位圖,可以使用CBitmap類的LoadBitmap()成員函數(shù)。LoadBitmap()函數(shù)有兩種調(diào)用方式。BOOLLoadBitmap(LPCTSTRlpszResourseName);BOOLLoadBitmap(UINTnIDResourse);一種是通過(guò)資源名稱(由參數(shù)lpszResourseName指定)來(lái)加載指定的GDI位圖;另外一種是通過(guò)資源ID(由參數(shù)nIDResourse指定)來(lái)加載指定的GDI位圖。2.2.2伸縮位圖有時(shí),想對(duì)位圖進(jìn)行放大或縮小的操作,這時(shí)就可以使用StretchBlt()函數(shù)來(lái)顯示位圖。下面是該函數(shù)的原型:BOOLStretchBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,intnSrcWidth,intnSrcHeight,DWORDdwRop);該函數(shù)中各個(gè)參數(shù)含義如下:x:指定繪制區(qū)域的左上角x坐標(biāo)(邏輯單位);y:指定繪制區(qū)域的左上角y坐標(biāo)(邏輯單位);nWidth:指定繪制區(qū)域的寬度;nHeight:指定繪制區(qū)域的高度;pSrcDC:指向要復(fù)制位圖所在的CDC對(duì)象的指針;xSrc:指定原位圖要繪制區(qū)域的左上角x坐標(biāo)(邏輯單位);ySrc:指定原位圖要繪制區(qū)域的左上角y坐標(biāo)(邏輯單位);nSrcWidth:指定要復(fù)制原圖像的寬度;nSrcHeight:指定要復(fù)制原圖像的高度;dwRop:指定繪制方式。2.3設(shè)備無(wú)關(guān)位圖(DIB)DIB是Device-IndependentBitmap(設(shè)備無(wú)關(guān)位圖)的縮寫(xiě)。它自帶顏色信息,因此調(diào)色板管理非常容易。DIB也使打印時(shí)的灰度陰影的控制更加容易。任何運(yùn)行Windows的計(jì)算機(jī)都可以處理DIB,它通常以BMP文件的形式被保存在磁盤(pán)中或則作為資源保存在EXE文件和DLL文件中。2.3.1BMP文件中DIB的結(jié)構(gòu)DIB是標(biāo)準(zhǔn)的Windows位圖格式,BMP文件中包含了一個(gè)DIB。一個(gè)BMP文件大體上分成如下4個(gè)部分:圖2.3BMP文件結(jié)構(gòu)示意圖第一部分為位圖文件頭BITMAPFILEHEADER,它是一個(gè)結(jié)構(gòu),其定義如下:typedefstructtagBITMAPFILEHEADER{WORDbfType; DWORD bfSize;WORDbfReserved1;WORDbfReserved2;DWORD bfOffBits;}BITMAPFILEHEADER,FAR*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;該結(jié)構(gòu)的長(zhǎng)度是固定的,為14個(gè)字節(jié)(WORD為無(wú)符號(hào)16位整數(shù),DWORD為無(wú)符號(hào)32位整數(shù)),各個(gè)域的說(shuō)明如下:bfType:指定文件類型,必須是0x424D,即字符串“BM”,也就是說(shuō)所有“.bmp”文件的頭兩個(gè)字節(jié)都是“BM”。bfSize:指定文件大小,包括這14個(gè)字。bfReserved1,bfReserved2:為保留字,不用考慮。bfOffBits:為從文件頭到實(shí)際的位圖數(shù)據(jù)的偏移字節(jié)數(shù),即上圖中前三個(gè)部分的和。第二部分為位圖信息頭BITMAPINFOHEADER,它也是一個(gè)結(jié)構(gòu),其定義如下:typedefstructtagBITMAPINFOHEADER{DWORDbiSize;LONGbiWidth; LONGbiHeight;WORDbiPlanes;WORDbiBitCount;DWORDbiCompression;DWORDbiSizeImage;LONGbiXPelsPerMeter;LONGbiYPelsPerMeter;DWORDbiClrUsed;DWORDbiClrImportant;}BITMAPINFOHEADER,F(xiàn)AR*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;該結(jié)構(gòu)的長(zhǎng)度也是固定的,為40個(gè)字節(jié)。各個(gè)域的說(shuō)明如下:biSize:指定這個(gè)結(jié)構(gòu)的長(zhǎng)度,為40字節(jié)。biWidth:指定圖像的寬度,單位是像素。biHeight:指定圖像的高度,單位是像素。biPlanes:必須是1,不用考慮。biBitCount:指定表示顏色時(shí)要用到的位數(shù),常用的值為1(黑白二色圖)、4(16色圖)、8(256色)、24(真彩色),新的“.bmp”格式支持32位色,這里就不做討論了。biCompression:指定位圖是否壓縮,有效的值為BI-RGB,BI-RLE8,BI-RLE4,BI-BITFIELDS(都是Windows定義好的常量)。要說(shuō)明的是,Windows位圖可以采用RLE4和RLE8的壓縮格式,但用的不多。今后所討論的只有第一種不壓縮的情況,即biCompression為BI-RGB的情況。biSizeImage:指定實(shí)際的位圖數(shù)據(jù)占用的字節(jié)數(shù)。biXPelsPerMeter:指定目標(biāo)設(shè)備的水平分辨率,單位是像素/米。biYPelsPerMeter:指定目標(biāo)設(shè)備的垂直分辨率,單位是像素/米。biClrUsed:指定本圖像實(shí)際用到的顏色數(shù),如果該項(xiàng)為0,則用到的顏色數(shù)為2的biCompression次冪。biClrImportant:指定本圖像中重要的顏色數(shù),如果該值為0,則認(rèn)為所有的顏色都是重要的。第三部分為調(diào)色板(Palette)。有些位圖需要調(diào)色板,有些位圖,如真彩色圖,不需要調(diào)色板,它們的BITMAPINFOHEADER后面直接是位圖數(shù)據(jù)。調(diào)色板實(shí)際上是一個(gè)數(shù)組,共有biClrUsed個(gè)元素(如果該值為0,則有2的biBitCount次冪個(gè)元素)。數(shù)組中每個(gè)元素的類型是一個(gè)RGBQUAD結(jié)構(gòu),占4個(gè)字節(jié),其定義如下:typedefstructtagRGBQUAD{BYTErgbBlue;BYTErgbGreen;BYTErgbRed;BYTErgbReserved;}RGBQUAD;其中:rgbBlue:該顏色的藍(lán)色分量。rgbGreen:該顏色的綠色分量。rgbRed:該顏色的紅色分量。rgbReserved:保留值。第四部分就是實(shí)際的圖像數(shù)據(jù)。對(duì)于用到調(diào)色板的位圖,圖像數(shù)據(jù)就是該像素顏色在調(diào)色板中的索引值,對(duì)于真彩色圖,圖像數(shù)據(jù)就是實(shí)際的R、G、B值。下面就2色、16色、256色位圖和真彩色位圖分別介紹。對(duì)于2色位圖,用1位就可以表示該像素的顏色(一般0表示黑,1表示白),所以一個(gè)字節(jié)可以表示8個(gè)像素。對(duì)于16色位圖,用4位可以表示一個(gè)像素的顏色,所以1個(gè)字節(jié)可以表示2個(gè)像素。對(duì)于256色位圖,1個(gè)字節(jié)剛好可以表示1個(gè)像素。對(duì)于真彩色圖,3個(gè)字節(jié)才能表示1個(gè)像素。2.3.2DIB訪問(wèn)函數(shù)Windows支持一些重要的DIB訪問(wèn)函數(shù),但是這些函數(shù)都還沒(méi)有被封裝到MFC中,這些函數(shù)主要有:SetDIBitsToDevice函數(shù):該函數(shù)可以直接在顯示器或打印機(jī)上顯示DIB。在顯示時(shí)不進(jìn)行縮放處理。StretchDIBits函數(shù):該函數(shù)可以縮放顯示DIB于顯示器和打印機(jī)上。GetDIBits函數(shù):還函數(shù)利用申請(qǐng)到的內(nèi)存,由GDI位圖來(lái)構(gòu)造DIB。通過(guò)該函數(shù),可以對(duì)DIB的格式進(jìn)行控制,可以指定每個(gè)像素顏色的位數(shù),而且可以指定是否進(jìn)行壓縮。CreateDIBitmap函數(shù):利用該函數(shù)可以從DIB出發(fā)來(lái)創(chuàng)建GDI位圖。CreateDIBSection函數(shù):該函數(shù)能創(chuàng)建一種特殊的DIB,稱為DIB項(xiàng),然后返回一個(gè)GDI位圖句柄。LoadImage函數(shù):該函數(shù)可以直接從磁盤(pán)文件中讀入一個(gè)位圖,并返回一個(gè)DIB句柄。DrawDibDraw函數(shù):Windows提供了窗口視頻(VFW)組件,VisualC++支持該組件。VFW中的DrawDibDraw函數(shù)是一個(gè)可以替代StretchDIBits的函數(shù)。它的最主要的優(yōu)點(diǎn)是可以使用抖動(dòng)顏色,并且提高顯示DIB的速度,缺點(diǎn)是必須將VFW代碼連接到進(jìn)程中。2.3.3使用DIB讀寫(xiě)B(tài)MP文件雖然MFC沒(méi)有封裝DIB,但是在程序中使用DIB還是十分方便的。作者構(gòu)造了自己的DIB函數(shù)庫(kù),這樣在使用DIB時(shí),只要對(duì)它進(jìn)行調(diào)用就可以了。接下來(lái)作者使用這些DIB函數(shù)編寫(xiě)了一個(gè)簡(jiǎn)單的讀寫(xiě)B(tài)MP的多文檔應(yīng)用程序。該程序不但可以直接讀寫(xiě)B(tài)MP文件,打印當(dāng)前DIB,還支持剪貼板操作,復(fù)制當(dāng)前DIB到剪貼板,可以將剪貼板中現(xiàn)有的DIB拷貝到當(dāng)前的DIB中。下面是讀寫(xiě)DIB的程序流程圖:圖2.4建立與打開(kāi)圖像圖2.5保存圖像下面是程序打開(kāi)一幅圖像時(shí)的界面:第三章圖像的幾何變換圖像的幾何變換,通常包括圖像的平移、圖像的鏡像變換、圖像的轉(zhuǎn)置、圖像的縮放和圖像的旋轉(zhuǎn)等。程序基本框架如下:圖3.1程序基本框架圖3.1圖像的平移圖像的平移是幾何變換中最簡(jiǎn)單的變換之一。3.1.1理論基礎(chǔ)圖像平移就是將圖像中所有的點(diǎn)都按照指定的平移量水平、垂直移動(dòng)。設(shè)(x0,y0)為原圖像上的一點(diǎn),圖像水平平移量為tx,垂直平移量為ty,則平移后點(diǎn)(x0,y0)坐標(biāo)將變?yōu)椋▁1,y1)。顯然(x0,y0)和(x1,y1)的關(guān)系如下:用矩陣表示如下:對(duì)該矩陣求逆,可以得到逆變換:即這樣,平移后的圖像上的每一點(diǎn)都可以在原圖像中找到對(duì)應(yīng)的點(diǎn)。例如,對(duì)于新圖中的(0,0)像素,代入上面的方程組,可以求出對(duì)應(yīng)原圖中的像素(-tx,-ty)。如果tx或ty大于0,則(-tx,-ty)不在原圖中。對(duì)于不在原圖中的點(diǎn),可以直接將它的像素值統(tǒng)一設(shè)置為0或則255(對(duì)于灰度圖就是黑色或白色)。同樣,若有點(diǎn)不在原圖中,也就說(shuō)明原圖中有點(diǎn)被移出顯示區(qū)域。如果不想丟失被移出的部分圖像,可以將新生成的圖像寬度擴(kuò)大|tx|,高度擴(kuò)大|ty|。3.1.2VisualC++編程實(shí)現(xiàn)有了上面的理論基礎(chǔ),可以十分容易的用VisualC++來(lái)實(shí)現(xiàn)圖像的平移。在這里,只介紹灰度圖像的平移,因?yàn)榛叶葓D像每個(gè)像素位數(shù)正好是8位,即1個(gè)字節(jié),這樣,在進(jìn)行圖像處理時(shí),可以不必考慮拼湊字節(jié)的問(wèn)題。而且由于灰度圖調(diào)色板的特殊性,進(jìn)行灰度圖像處理時(shí),不必考慮調(diào)色板的問(wèn)題。根據(jù)上面的公式可以得到圖像的平移程序流程圖:圖3.2圖像平移程序流程圖由上面的程序流程圖可以得到如下算法://每行for(i=0;i<lHeight;i++){//每列 for(j=0;j<lWidth;j++) { lpDst=(char*)lpNewDIBBits+lLineBytes*(lHeight-1-i)+j; //計(jì)算該像素在原DIB中的坐標(biāo) i0=i-lXOffset; j0=j-lYOffset; //判斷是否在原圖范圍內(nèi) if(j0>=0)&&(j0<lWidth)&&(i0>=0)&&(i0<lHeight) { //指向原DIB第i0行,第j0個(gè)像素的指針 //同樣要注意DIB上下倒置的問(wèn)題 lpSrc=(char*)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0; //復(fù)制像素 *lpDst=*lpSrc; } else {*((unsignedchar*)lpDst)=255;//對(duì)于原圖中沒(méi)有的像素,直接賦值為255 } }}由于每行像素是連續(xù)放置的,可以直接逐行地來(lái)復(fù)制圖像。首先計(jì)算移出后可視的區(qū)域。對(duì)于x軸方向,當(dāng)tx-width時(shí),圖像完全移出了屏幕,不用做任何處理;當(dāng)-width<tx0時(shí),圖像區(qū)域的x范圍從0到width-,對(duì)應(yīng)原圖的范圍從到width;當(dāng)0〈tx〈width時(shí),圖像區(qū)域的x范圍從tx到width,對(duì)應(yīng)原圖的范圍從0到width-tx;當(dāng)txwidth時(shí),圖像完全移出了屏幕,不用做任何處理;對(duì)于y軸方向,當(dāng)ty-height時(shí),圖像完全移出了屏幕,不用做任何處理;當(dāng)-height〈ty0時(shí),圖像區(qū)域的y范圍從0到height-,對(duì)應(yīng)原圖的范圍從到height;當(dāng)0〈ty〈height時(shí),圖像區(qū)域的y范圍從ty到height,對(duì)應(yīng)原圖的范圍從0到height-ty;當(dāng)tyheight時(shí),圖像完全移出了屏幕,不用做任何處理;當(dāng)計(jì)算出經(jīng)移動(dòng)而可視的區(qū)域后,就可以利用位圖存儲(chǔ)的連續(xù)性,即同一行的像素在內(nèi)存中是相鄰的這一規(guī)則進(jìn)行計(jì)算。利用memcpy函數(shù),從(x0,y0)點(diǎn)開(kāi)始,一次可以拷貝一整行(寬度為x1-x0),然后將內(nèi)存指針移到(x0,y0+1)處,拷貝下一行。這樣拷貝到(y1-y0)行就完成了全部操作,避免了單個(gè)像素的計(jì)算,從而提高了效率。按照上面的描述,現(xiàn)在可以構(gòu)造自己的圖像幾何變換函數(shù)庫(kù)了。首先來(lái)完成圖像的平移函數(shù)。圖像的平移函數(shù)操作不需要改變DIB的調(diào)色板和文件頭,只要把指向DIB像素起始位置的指針和DIB高寬傳遞給子函數(shù)就可以完成平移工作。下面以圖像平移為例說(shuō)明圖像處理的簡(jiǎn)易流程圖:圖3.3圖像平移處理的簡(jiǎn)易流程圖下面是程序進(jìn)行平移時(shí)的界面:圖像平移后的結(jié)果為:3.2圖像的鏡像變換圖像的鏡像變換分為兩種:一種是水平鏡像,另外一種是垂直鏡像。圖像的水平鏡像操作是將圖像的左半部分和右半部分以圖像垂直中軸線為中心鏡像進(jìn)行對(duì)換;圖像的垂直鏡像操作是將圖像上半部分和下半部分以圖像水平中軸線為中心鏡像進(jìn)行對(duì)換。3.2.1理論基礎(chǔ)設(shè)圖像高度為lHeight,寬度為lWidth,原圖中(x0,y0)經(jīng)過(guò)水平鏡像后坐標(biāo)將變?yōu)椋╨Width-x0,y0),其矩陣表達(dá)式為:逆運(yùn)算矩陣表達(dá)式為:即同樣,(x0,y0)經(jīng)過(guò)垂直鏡像后坐標(biāo)將變?yōu)椋▁0,lHeight-y0),其矩陣表達(dá)式為:逆運(yùn)算矩陣表達(dá)式為:即3.2.2VisualC++編程實(shí)現(xiàn)按照上面的變換公式,可以非常簡(jiǎn)單的實(shí)現(xiàn)圖像的水平和垂直鏡像操作。下圖是鏡像操作的程序流程圖:圖3.4圖像鏡像程序流程圖算法如下所示(bDirection為真時(shí)表示水平鏡像,否則為垂直)://每行for(i=0;i<lHeight;i++){//每列 for(j=0;j<lWidth;j++) { //指向新DIB第i行,第j個(gè)像素的指針 lpDst=(char*)lpNewDIBBits+lLineBytes*(lHeight-i-1)+j; //計(jì)算該像素在原DIB中的坐標(biāo) if(bDirection) { //水平鏡像 i0=i; j0=lWidth-j; } else { //垂直鏡像 i0=lHeight-i; j0=j; } if(j0>=0)&&(j0<lWidth)&&(i0>=0)&&(i0<lHeight) { //指向原DIB第i0行,第j0個(gè)像素的指針 //同樣要注意DIB上下倒置的問(wèn)題 lpSrc=(char*)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0; //復(fù)制像素 *lpDst=*lpSrc; } else { *((unsignedchar*)lpDst)=255;//對(duì)于原圖中沒(méi)有的像素,直接賦值為255 } }}和圖像平移一樣,在垂直鏡像中也可以利用位圖存儲(chǔ)的連續(xù)性整行復(fù)制圖像。水平鏡像后的結(jié)果為:垂直鏡像后的結(jié)果為:3.3圖像的轉(zhuǎn)置圖像的轉(zhuǎn)置操作是將圖像像素的x坐標(biāo)和y坐標(biāo)互換。該操作將改變圖像的大小,圖像的高度和寬度將互換。3.3.1理論基礎(chǔ)轉(zhuǎn)置的變換矩陣表達(dá)式很簡(jiǎn)單:它的逆矩陣表達(dá)式是:即3.3.2VisualC++編程實(shí)現(xiàn)圖像轉(zhuǎn)置的實(shí)現(xiàn)和圖像鏡像變換相似,不同之處在于圖像轉(zhuǎn)置后DIB的頭文件也要進(jìn)行相應(yīng)的改變,主要是將頭文件中圖像高度和寬度信息更新。因此傳遞給圖像轉(zhuǎn)置函數(shù)的參數(shù)是直接指向DIB的指針,而不是直接指向DIB像素的指針。根據(jù)公式可以得到如下所示的程序流程圖:圖3.5圖像轉(zhuǎn)置程序流程圖根據(jù)上圖可以得到如下算法:for(i=0;i<lHeight;i++)//針對(duì)圖像每行進(jìn)行操作 { for(j=0;j<lWidth;j++)//針對(duì)每行圖像每列進(jìn)行操作 { lpSrc=(char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;//指向原DIB圖像第i行,第j個(gè)像素的指針 lpDst=(char*)lpNewDIBBits+lNewLineBytes*(lWidth-1-j)+i;//指向轉(zhuǎn)置DIB第j行,第i個(gè)像素的指針 *lpDst=*lpSrc;//復(fù)制像素 } }memcpy(lpDIBBits,lpNewDIBBits,lWidth*lNewLineBytes);//復(fù)制轉(zhuǎn)置后的圖像 //互換DIB中圖像的高寬 if(IS_WIN30_DIB(lpDIB)) { lpbmi->biWidth=lHeight; lpbmi->biHeight=lWidth; } else { lpbmc->bcWidth=(unsignedshort)lHeight; lpbmc->bcHeight=(unsignedshort)lWidth; }圖像轉(zhuǎn)置后的結(jié)果為:3.4圖像的縮放上面的幾種圖像幾何變換中都是1:1的變換,而圖像的縮放操作將會(huì)改變圖像的大小,產(chǎn)生的圖像中的像素可能在原圖中找不到相應(yīng)的像素點(diǎn),這樣就必須進(jìn)行近似處理。一般的方法是直接賦值為和它最相近的像素值,也可以通過(guò)一些插值算法來(lái)計(jì)算。下面的代碼直接采用了前一種做法。3.4.1理論基礎(chǔ)假設(shè)圖像x軸方向縮放比率為fx,y軸方向縮放比率為fy,那么原圖中點(diǎn)(x0,y0)對(duì)應(yīng)與新圖中的點(diǎn)(x1,y1)的轉(zhuǎn)換矩陣為:其逆運(yùn)算如下:即例如,當(dāng)fx=fy=0.5時(shí),圖像被縮放到一半大小,此時(shí)縮小后圖像中的(0,0)像素對(duì)應(yīng)于原圖中的(0,0)像素;(0,1)像素對(duì)應(yīng)于原圖中的(0,2)像素;(1,0)像素對(duì)應(yīng)于原圖中的(2,0)像素,以此類推。在原圖基礎(chǔ)上,每行隔一個(gè)像素取一點(diǎn),每隔一行進(jìn)行操作。其實(shí)是將原圖每行中的像素重復(fù)取值一遍,然后每行重復(fù)一次。3.4.2VisualC++編程實(shí)現(xiàn)按照上面的轉(zhuǎn)換公式,可以容易的寫(xiě)出圖像的縮放程序流程圖:圖3.6圖像縮放程序流程圖根據(jù)流程圖可以編寫(xiě)如下算法:memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+::PaletteSize(lpDIB));//復(fù)制DIB信息頭和調(diào)色板 lpNewDIBBits=::FindDIBBits(lpNewDIB);//找到新DIB像素起始位置 lpbmi=(LPBITMAPINFOHEADER)lpNewDIB;//獲取指針 lpbmc=(LPBITMAPCOREHEADER)lpNewDIB; //更新DIB中圖像的寬度和高度 if(IS_WIN30_DIB(lpNewDIB)) { lpbmi->biWidth=lNewWidth; lpbmi->biHeight=lNewHeight; } else { lpbmc->bcWidth=(unsignedshort)lNewWidth; lpbmc->bcHeight=(unsignedshort)lNewHeight; } for(i=0;i<lNewHeight;i++)//針對(duì)圖像每行進(jìn)行操作 { for(j=0;j<lNewWidth;j++)//針對(duì)圖像每列進(jìn)行操作 { //指向新DIB第i行,第j個(gè)像素的指針 lpDst=(char*)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+j; i0=(LONG)(i/fYZoomRatio+0.5);//計(jì)算該像素在原DIB中的坐標(biāo) j0=(LONG)(j/fXZoomRatio+0.5); //判斷是否在原圖范圍內(nèi) if((j0>=0)&&(j0<lWidth)&&(i0>=0)&&(i0<lHeight)) { //指向原DIB第i0行,第j0個(gè)像素的指針 lpSrc=(char*)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0; *lpDst=*lpSrc;//復(fù)制像素 } else { *((unsignedchar*)lpDst)=255;//對(duì)于原圖中沒(méi)有的像素,直接賦值為255 } } } returnhDIB;下面是進(jìn)行縮放的界面:縮放后的結(jié)果為:3.5圖像的旋轉(zhuǎn)一般圖像的旋轉(zhuǎn)是以圖像的中心為原點(diǎn),旋轉(zhuǎn)一定的角度。旋轉(zhuǎn)后,圖像的大小一般會(huì)改變。和圖像平移一樣,既可以把轉(zhuǎn)出顯示區(qū)域的圖像截去,也可以擴(kuò)大圖像范圍以顯示所有的圖像。3.5.1理論基礎(chǔ)可以推導(dǎo)一下旋轉(zhuǎn)運(yùn)算的變換公式。如下圖所示,點(diǎn)(x0,y0)經(jīng)過(guò)旋轉(zhuǎn)θ度后坐標(biāo)變成(x1,y1)。在旋轉(zhuǎn)前:旋轉(zhuǎn)后:寫(xiě)成矩陣表達(dá)式為:其逆運(yùn)算如下:3.5.2VisualC++編程實(shí)現(xiàn)有了上面的轉(zhuǎn)換公式,就可以非常方便的編寫(xiě)出實(shí)現(xiàn)圖像旋轉(zhuǎn)的函數(shù)。首先應(yīng)計(jì)算出公式中需要的幾個(gè)參數(shù):a,b,c,d和旋轉(zhuǎn)后新圖像的高、寬度?,F(xiàn)在已知圖像的原始寬度為lWidth,高度為lHeight,以圖像中心為坐標(biāo)系原點(diǎn),則原始圖像四個(gè)角的坐標(biāo)分別為,,和,按照旋轉(zhuǎn)公式,在旋轉(zhuǎn)后的新圖中,這四個(gè)點(diǎn)坐標(biāo)為:則新圖像的寬度lNewWidth和高度lNewHeight為:lNewWidth=max(,)lNewHeight=max(,)令因?yàn)閍=,b=,c=,d=所以則程序流程圖如下:圖3.7圖像旋轉(zhuǎn)程序流程圖進(jìn)行圖像旋轉(zhuǎn)的算法如下所示:memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+::PaletteSize(lpDIB)); lpNewDIBBits=::FindDIBBits(lpNewDIB); lpbmi=(LPBITMAPINFOHEADER)lpNewDIB; lpbmc=(LPBITMAPCOREHEADER)lpNewDIB; if(IS_WIN30_DIB(lpNewDIB)) { lpbmi->biWidth=lNewWidth; lpbmi->biHeight=lNewHeight; } else { lpbmc->bcWidth=(unsignedshort)lNewWidth; lpbmc->bcHeight=(unsignedshort)lNewHeight; }for(i=0;i<lNewHeight;i++)//針對(duì)圖像每行進(jìn)行操作 { for(j=0;j<lNewWidth;j++)//針對(duì)圖像每列進(jìn)行操作 { //指向新DIB第i行,第j個(gè)像素的指針 lpDst=(char*)lpNewDIBBits+lNewLineBytes*(lNewHeight-1-i)+j; //計(jì)算該像素在原DIB中的坐標(biāo) i0=(LONG)(-((float)j)*fSina+((float)i)*fCosa+f2+0.5); j0=(LONG)(((float)j)*fCosa+((float)i)*fSina+f1+0.5); //判斷是否在原圖范圍內(nèi) if((j0>=0)&&(j0<lWidth)&&(i0>=0)&&(i0<lHeight)) { //指向原DIB第i0行,第j0個(gè)像素的指針 lpSrc=(char*)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0; *lpDst=*lpSrc;//復(fù)制像素 } else { *((unsignedchar*)lpDst)=255;//對(duì)于原圖中沒(méi)有的像素,直接賦值為255 } } } returnhDIB;下面是進(jìn)行旋轉(zhuǎn)的界面:旋轉(zhuǎn)后的結(jié)果為:3.6本程序基本類對(duì)象之間的相互訪問(wèn)關(guān)系前面就圖像的幾何變換,詳細(xì)的介紹了圖像的平移、鏡像(包括垂直鏡像和水平鏡像)、轉(zhuǎn)置、縮放和旋轉(zhuǎn)的流程和功能,這些功能的實(shí)現(xiàn)都調(diào)用了自定義的一些全局函數(shù)。下面就整個(gè)程序流程和基本類對(duì)象之間的相互訪問(wèn)關(guān)系進(jìn)行圖解說(shuō)明:圖3.8程序基本類對(duì)象之間的相互訪問(wèn)關(guān)系第四章結(jié)論與展望4.1結(jié)論數(shù)字圖像處理數(shù)據(jù)量大,處理速度相對(duì)較慢。為了簡(jiǎn)化操作,本例只針對(duì)256級(jí)灰度圖進(jìn)行處理。由于本程序首先要實(shí)現(xiàn)任意BMP圖像的讀寫(xiě),打印,以及剪貼板操作,故用VisualC++創(chuàng)建一個(gè)多文檔應(yīng)用程序框架,然后根據(jù)BMP圖像的結(jié)構(gòu)定義自己的函數(shù)庫(kù),函數(shù)庫(kù)中包括經(jīng)常要用到的功能,例如創(chuàng)建DIB對(duì)象調(diào)色板,返回DIB寬度和高度等,這樣在要使用DIB時(shí),只需要對(duì)它進(jìn)行調(diào)用就可以了。最后,在對(duì)BMP圖像各種基礎(chǔ)操作實(shí)現(xiàn)的基礎(chǔ)上,完成經(jīng)典的圖像幾何變換功能。包括:圖像的平移。經(jīng)典的圖像平移有兩種算法,一種不會(huì)改變圖像大小,另一種可以相應(yīng)擴(kuò)大圖像。本程序采用了第一種算法。為了使圖像能按照用戶指定的水平平移量和垂直平移量移動(dòng),作者首先定義了一個(gè)參數(shù)設(shè)定窗,并在圖像平移菜單的事件處理函數(shù)中對(duì)此對(duì)話框進(jìn)行定義,獲取平移量。然后調(diào)用圖像平移函數(shù),從而實(shí)現(xiàn)將圖像中所有的點(diǎn)(像素)都按照指定的平移量水平、垂直移動(dòng),平移后的圖像上的每一點(diǎn)都可以在原圖像中找到對(duì)應(yīng)的點(diǎn)。圖像的鏡像。圖像的水平鏡像操作是將圖像的左半部分和右半部分以圖像垂直中軸線為中心鏡像進(jìn)行對(duì)換;圖像的垂直鏡像操作是將圖像上半部分和下半部分以圖像水平中軸線鏡像進(jìn)行對(duì)換。可以一個(gè)個(gè)像素進(jìn)行鏡像,也可以利用位圖存儲(chǔ)的連續(xù)性進(jìn)行整行復(fù)制。對(duì)于水平鏡像作者采用前者,而垂直鏡像采用后者,對(duì)兩種方法都進(jìn)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)學(xué)教育的道德價(jià)值與社會(huì)責(zé)任
- 二零二五年度新能源船舶動(dòng)力系統(tǒng)研發(fā)與股權(quán)置換協(xié)議3篇
- 個(gè)人贖樓融資擔(dān)保合同(2024年修訂)3篇
- 創(chuàng)新思維的推廣與普及在科技發(fā)展中的作用
- 2025版學(xué)校醫(yī)務(wù)室緊急救援預(yù)案與協(xié)同合作合同
- 二零二五年度高科技企業(yè)孵化器場(chǎng)地出租協(xié)議示范文本2篇
- 融合媒體的商業(yè)模式變革與創(chuàng)新思維
- 2025版智慧消防及通風(fēng)系統(tǒng)施工與運(yùn)營(yíng)合同3篇
- 二零二五年度特色餐飲品牌特許經(jīng)營(yíng)合作協(xié)議2篇
- 二零二五年度海外農(nóng)產(chǎn)品銷售代理及供應(yīng)鏈管理合同2篇
- 2024版《建設(shè)工程開(kāi)工、停工、復(fù)工安全管理臺(tái)賬表格(流程圖、申請(qǐng)表、報(bào)審表、考核表、通知單等)》模版
- 2024年廣州市高三一模普通高中畢業(yè)班高三綜合測(cè)試一 物理試卷(含答案)
- 部編版《道德與法治》六年級(jí)下冊(cè)教材分析萬(wàn)永霞
- 粘液腺肺癌病理報(bào)告
- 酒店人防管理制度
- 油田酸化工藝技術(shù)
- 上海高考英語(yǔ)詞匯手冊(cè)列表
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(yíng)(吳洪貴)任務(wù)五 其他內(nèi)容類型的生產(chǎn)
- 上海石油化工股份有限公司6181乙二醇裝置爆炸事故調(diào)查報(bào)告
- 例說(shuō)相機(jī)誘導(dǎo)在語(yǔ)文教學(xué)中的運(yùn)用 相機(jī)誘導(dǎo)
- 浙江省紹興市2023年中考科學(xué)試題(word版-含答案)
評(píng)論
0/150
提交評(píng)論