版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 摘要</b></p><p> 幾何變換是最常見的圖像處理手段,通過對變形的圖像進(jìn)行幾何校正,可以得出準(zhǔn)確的圖像。常用的幾何變換功能包括圖像的平移、圖像的鏡像變換、圖像的轉(zhuǎn)置、圖像的縮放、圖像的旋轉(zhuǎn)等等。目前數(shù)字圖像處理的應(yīng)用越來越廣泛,已經(jīng)滲透到工業(yè)、航空航天、軍事等各個領(lǐng)域,在國民經(jīng)濟中發(fā)揮越來越大的作用。</p><p> 作為
2、數(shù)字圖像處理的一個重要部分,本文介紹的工作是如何用Visual C++編程工具設(shè)計一個完整的應(yīng)用程序,實現(xiàn)經(jīng)典的圖像幾何變換功能。程序大概分為兩大部分:讀寫B(tài)MP圖像,和數(shù)字圖像的幾何變換。即首先用Visual C++創(chuàng)建一個多文檔應(yīng)用程序框架,在實現(xiàn)任意BMP圖像的讀寫,打印,以及剪貼板操作的基礎(chǔ)上,完成經(jīng)典的圖像幾何變換功能。</p><p> 圖像幾何變換的Visual C++編程實現(xiàn),為校內(nèi)課題的實現(xiàn)提
3、供了一個實例。</p><p> 關(guān)鍵字:圖像處理;幾何變換;BMP圖像;Visual C++</p><p><b> Abstract</b></p><p> The geometrical transformation is the most popular image processing method. We can get
4、an exact image from a distorted image through the geometrical emendation. The transforming methods in common use including translation, mirror, rotation, or transpose an image. Since the domain of digital image processin
5、g application has becoming wider and wider, it penetrates into many fields. Such as industry, aviation, military, and has become much more important in every aspects of our life.</p><p> Being an important
6、part of digital image processing, the work introduced in this article is about how to design an integrated application program using Visual C++ to implement the classic geometrical transformation. The program can be divi
7、ded into two parts: read or write a BMP image, and the geometrical transformation for it. So I designed a multiple document interface first, on the basic of read, write, print, and the clipboard operation of an image, th
8、en carry out the function of geometrical </p><p> The implementation of geometrical transformation using Visual C++ is a good example for carrying out intramural problems.</p><p> Keywords: Im
9、age processing; Geometrical transformation; BMP image; Visual C++</p><p><b> 目錄</b></p><p><b> 第一章 緒論1</b></p><p> 1.1 何謂數(shù)字圖像處理1</p><p> 1
10、.1.1 圖像的概念1</p><p> 1.1.2圖像處理1</p><p> 1.2 圖像處理學(xué)的內(nèi)容和其他相關(guān)學(xué)科的關(guān)系2</p><p> 1.2.1 圖像處理學(xué)的內(nèi)容2</p><p> 1.2.2 圖像處理學(xué)與相關(guān)學(xué)科的關(guān)系2</p><p> 1.3 數(shù)字圖像處理的特點及其應(yīng)用2&l
11、t;/p><p> 1.3.1 數(shù)字圖像處理的特點2</p><p> 1.3.2 數(shù)字圖像處理的應(yīng)用3</p><p> 1.4 Visual C++4</p><p> 1.4.1 Visual C++簡述4</p><p> 1.4.2 將Visual C++應(yīng)用于數(shù)字圖像的幾何變換4</p
12、><p> 第二章 數(shù)字圖像處理的基本概念5</p><p> 2.1 圖像和調(diào)色板5</p><p> 2.1.1 圖像的顯示5</p><p> 2.1.2 調(diào)色板5</p><p> 2.1.3 色彩系統(tǒng)6</p><p> 2.1.4 灰度圖7</p>
13、<p> 2.2 GDI位圖7</p><p> 2.2.1 從資源中裝入GDI位圖8</p><p> 2.2.2 伸縮位圖8</p><p> 2.3 設(shè)備無關(guān)位圖(DIB)8</p><p> 2.3.1 BMP文件中DIB的結(jié)構(gòu)9</p><p> 2.3.2 DIB訪問函數(shù)1
14、1</p><p> 2.3.3 使用DIB讀寫B(tài)MP文件12</p><p> 第三章 圖像的幾何變換14</p><p> 3.1 圖像的平移14</p><p> 3.1.1 理論基礎(chǔ)14</p><p> 3.1.2 Visual C++編程實現(xiàn)15</p><p>
15、 3.2 圖像的鏡像變換19</p><p> 3.2.1 理論基礎(chǔ)19</p><p> 3.2.2 Visual C++編程實現(xiàn)20</p><p> 3.3 圖像的轉(zhuǎn)置23</p><p> 3.3.1 理論基礎(chǔ)23</p><p> 3.3.2 Visual C++編程實現(xiàn)24</
16、p><p> 3.4 圖像的縮放26</p><p> 3.4.1 理論基礎(chǔ)26</p><p> 3.4.2 Visual C++編程實現(xiàn)27</p><p> 3.5 圖像的旋轉(zhuǎn)30</p><p> 3.5.1 理論基礎(chǔ)31</p><p> 3.5.2 Visual C
17、++編程實現(xiàn)31</p><p> 3.6 本程序基本類對象之間的相互訪問關(guān)系35</p><p> 第四章 結(jié)論與展望37</p><p><b> 4.1 結(jié)論37</b></p><p><b> 4.2 展望37</b></p><p><b&
18、gt; 致謝39</b></p><p><b> 參考文獻(xiàn)40</b></p><p><b> 第一章 緒論</b></p><p> 1.1 何謂數(shù)字圖像處理</p><p> 數(shù)字圖像處理(Digital Image Processing),就是利用數(shù)字計算機或則其
19、他數(shù)字硬件,對從圖像信息轉(zhuǎn)換而得到的電信號進(jìn)行某些數(shù)學(xué)運算,以提高圖像的實用性。例如從衛(wèi)星圖片中提取目標(biāo)物的特征參數(shù),三維立體斷層圖像的重建等??偟膩碚f,數(shù)字圖像處理包括點運算、幾何處理、圖像增強、圖像復(fù)原、圖像形態(tài)學(xué)處理、圖像編碼、圖像重建、模式識別等。目前數(shù)字圖像處理的應(yīng)用越來越廣泛,已經(jīng)滲透到工業(yè)、醫(yī)療保健、航空航天、軍事等各個領(lǐng)域,在國民經(jīng)濟中發(fā)揮越來越大的作用。</p><p> 1.1.1 圖像的概
20、念</p><p> 圖像是對客觀對象的一種相似性的、生動性的描述或?qū)懻??;蛘哒f圖像是客觀對象的一種表示,它包含了被描述對象的有關(guān)信息。它是人們最主要的信息來源。據(jù)統(tǒng)計,一個人獲取的信息大約有75%來自視覺。圖像根據(jù)其形式或產(chǎn)生方法來分類。</p><p> 從人眼的視覺特點上可將圖像分為可見圖像和不可見圖像。其中可見圖像的一個子集為圖片,它包括照片、用線條畫的圖和畫;另一個子集為光圖
21、像,即用透鏡、光柵和全息技術(shù)產(chǎn)生的圖像。不可見的圖像包括不可見光成像和不可見量,如溫度、壓力及人口密度等的分布圖。</p><p> 按波段多少圖像可分為但波段、多波段和超波段圖像。但波段圖像上每點只有一個亮度值;多波段圖像上每點不只一個特性。例如紅、綠、藍(lán)三波段光譜圖像或彩色圖像上的每個點具有紅、綠、藍(lán)三個亮度值,這三個值表示在不同光波段上的強度,人眼看來就是不同的顏色。超波段圖像上每個點具有幾十或幾百個特性
22、。</p><p> 按圖像空間坐標(biāo)和明暗程度的連續(xù)性可分為模擬圖像和數(shù)字圖像。模擬圖像指空間坐標(biāo)和明暗程度都是連續(xù)變化的、計算機無法直接處理的圖像。數(shù)字圖像是一種空間坐標(biāo)和灰度均不連續(xù)的、用離散的數(shù)字(一般用整數(shù))表示的圖像。這樣的圖像才能被計算機處理。</p><p><b> 1.1.2圖像處理</b></p><p> 對圖像進(jìn)行
23、一系列的操作,以達(dá)到預(yù)期的目的的技術(shù)稱作圖像處理。圖像處理可分為模擬圖像處理和數(shù)字圖像處理兩種方式。</p><p> 利用光學(xué)、照像和電子學(xué)方法對模擬圖像的處理稱為模擬圖像處理。光學(xué)圖像處理方法已有很長的歷史,在激光全息技術(shù)出現(xiàn)后,它得到了進(jìn)一步的發(fā)展。盡管光學(xué)圖像處理理論日臻完善,且處理速度快,信息容量大,分辨率高,又非常經(jīng)濟,但處理精度不高,穩(wěn)定性差,設(shè)備笨重,操作不方便和工藝水平不高等原因限制了它的發(fā)展
24、速度。從20世紀(jì)60年代起,隨著電子計算機技術(shù)的進(jìn)步,計算機圖像處理獲得了飛躍發(fā)展。</p><p> 所謂數(shù)字圖像處理,就是利用計算機對數(shù)字圖像進(jìn)行系列操作,從而獲得某種預(yù)期的結(jié)果的技術(shù)。數(shù)字圖像處理離不開計算機,因此又稱計算機圖像處理。為了與模擬圖像處理想?yún)^(qū)別,下文采用“數(shù)字圖像處理”。</p><p> 1.2 圖像處理學(xué)的內(nèi)容和其他相關(guān)學(xué)科的關(guān)系</p><
25、p> 1.2.1 圖像處理學(xué)的內(nèi)容</p><p> 至20世紀(jì)70年代末以來,由于數(shù)字技術(shù)和微電子技術(shù)的迅猛發(fā)展給數(shù)字圖像處理提供了先進(jìn)的技術(shù)手段,基于計算機的圖像處理學(xué)也就從信息處理、自動控制系統(tǒng)論、計算機科學(xué)、數(shù)據(jù)通信、電視技術(shù)等學(xué)科中脫穎而出,成為研究“圖像信息的獲取、傳輸、存儲、變換、顯示、理解與綜合利用”的一門嶄新學(xué)科。</p><p> 圖像處理學(xué)所包含的內(nèi)容是相
26、當(dāng)豐富的,根據(jù)抽象程度的不同可分為三個層次:狹義圖像處理、圖像分析和圖像理解。</p><p> 狹義圖像處理著重強調(diào)在圖像之間進(jìn)行的變換,主要是指對圖像進(jìn)行各種操作以改善圖像的視覺效果,或?qū)D像進(jìn)行壓縮編碼以減少所需存儲空間或傳輸時間、傳輸通路的要求。它是一個從圖像到圖像的過程。</p><p> 圖像分析主要是對圖像中感興趣的目標(biāo)進(jìn)行檢測和測量,從而建立對圖像的描述。圖像分析是一個
27、從圖像到數(shù)值或符號的過程。</p><p> 圖像理解超出了目前的所學(xué)范圍,則不加以討論。</p><p> 1.2.2 圖像處理學(xué)與相關(guān)學(xué)科的關(guān)系</p><p> 圖像處理學(xué)是一門綜合性邊緣學(xué)科。從研究范圍來看,它與計算機圖形學(xué)、模式識別、計算機視覺等既有聯(lián)系又有區(qū)別。</p><p> 圖形學(xué)原本指用圖形、圖表、繪圖等形式表達(dá)數(shù)
28、據(jù)信息的科學(xué)。而計算機圖形學(xué)研究的是如何利用計算機技術(shù)來產(chǎn)生這些形式。和圖像分析對比,兩者的處理對象和輸出結(jié)果正好相反。計算機圖形學(xué)試圖從非圖像形式的數(shù)據(jù)描述來生成圖像。另一方面,模式識別與圖像分析則比較相似,只是前者試圖把圖像抽象成符號描述的類別,它們有相同的輸入,而不同的輸出結(jié)果之間可較方便的進(jìn)行轉(zhuǎn)換。至于計算機視覺主要強調(diào)用計算機去實現(xiàn)人的視覺功能,其中涉及圖像處理的許多技術(shù),但目前的研究內(nèi)容主要與圖像理解相結(jié)合。</p&g
29、t;<p> 由此看來,以上學(xué)科相互聯(lián)系,相互交叉,它們之間并沒有絕對的界限。雖各有側(cè)重但又相互補充。另外以上各學(xué)科都得到了人工智能、神經(jīng)網(wǎng)絡(luò)、遺傳算法、模糊邏輯等新理論、新工具、新技術(shù)的支持,所以它們又都在近年得到了長足發(fā)展。</p><p> 1.3 數(shù)字圖像處理的特點及其應(yīng)用</p><p> 在計算機出現(xiàn)之前,模擬圖像處理占主導(dǎo)地位。隨著計算機的發(fā)展,數(shù)字圖像處
30、理發(fā)展速度越來越快。與人類對視覺機能著迷的歷史相比,它是一門相對年輕的學(xué)科。盡管目前一般采用順序處理的計算機,對大數(shù)據(jù)量的圖像處理速度不如光學(xué)方法快,但是其處理的精度高,實現(xiàn)多種功能的、高度復(fù)雜的運算求解非常靈活方便。在其短短的歷史中,它卻成功的應(yīng)用于幾乎所有與成像有關(guān)的領(lǐng)域,并正發(fā)揮相當(dāng)重要的作用。</p><p> 1.3.1 數(shù)字圖像處理的特點</p><p> 同模擬圖像處理相
31、比,數(shù)字圖像處理有很多優(yōu)點。主要表現(xiàn)在:</p><p><b> 精度高</b></p><p> 不管是對4bit還是8bit和其他比特圖像的處理,對計算機程序來說幾乎是一樣的。即使處理圖像變大,只需改變數(shù)組的參數(shù),而處理方法不變。所以從原理上不管處理多高精度的圖像都是可能的。而在模擬圖像處理中,要想使精度提高一個數(shù)量級,就必須對處理裝置進(jìn)行大幅度改進(jìn)。<
32、;/p><p><b> 再現(xiàn)性好</b></p><p> 不管是什么圖像,它們均用數(shù)組或集合表示。將它們輸入到計算機內(nèi),用計算機容易處理的方式表示。在傳送和復(fù)制圖像時,只在計算機內(nèi)部進(jìn)行處理,這樣數(shù)據(jù)就不會丟失或遭破壞,保持了完好的再現(xiàn)性。而在模擬圖像處理中,就會因為各種干擾及設(shè)備故障而無法保持圖像的再現(xiàn)性。</p><p><b&g
33、t; 通用性、靈活性高</b></p><p> 不管是可視圖像還是X線照片、紅外線熱成像、超聲波圖像等不可見光成像,盡管這些圖像成像體系中的設(shè)備規(guī)模和精度各不相同,但當(dāng)把圖像信號直接進(jìn)行A/D變換,或記錄成照片再數(shù)字化,對于計算機來說都能用二維數(shù)組表示,不管什么樣的圖像都可以用同樣的方法進(jìn)行處理,這就是計算機處理的通用性。另外,對處理程序自由加以改變,可進(jìn)行各種各樣的處理。如上下滾動、漫游、拼圖
34、、合成、變換、放大、縮小和各種邏輯運算等,所以靈活性很高。</p><p> 1.3.2 數(shù)字圖像處理的應(yīng)用</p><p> 計算機圖像處理和計算機、多媒體、智能機器人、專家系統(tǒng)等技術(shù)的發(fā)展緊密相關(guān)。近年來計算機識別、理解圖像的技術(shù)發(fā)展很快,也就是圖像處理的目的除了直接供人觀看(如醫(yī)學(xué)圖像是為醫(yī)生觀看作診斷)外,還進(jìn)一步發(fā)展了與計算機視覺有關(guān)的應(yīng)用,如郵件自動分檢,車輛自動駕駛等。下
35、面僅羅列了一些典型應(yīng)用實例,而實際應(yīng)用更廣。</p><p><b> 在生物醫(yī)學(xué)中的應(yīng)用</b></p><p> 主要包括顯微圖像處理;DNA顯示分析;紅、白血球分析計數(shù);蟲卵及組織切片的分析;癌細(xì)胞的識別;染色體分析等等。</p><p><b> 遙感航天中的應(yīng)用</b></p><p&g
36、t; 軍事偵察、定位、導(dǎo)航、指揮等應(yīng)用;多光譜衛(wèi)星圖像分析;地形、地圖、國土普查;地質(zhì)、礦藏勘探;天文、太空星體的探測及分析等。</p><p><b> 工業(yè)應(yīng)用</b></p><p> CAD 和CAM技術(shù)用于模具、零件制造、服裝、印染業(yè);零件、產(chǎn)品無損檢測,焊縫及內(nèi)部缺陷檢查;交通管制、機場監(jiān)控;火車車皮識別等。</p><p>
37、 軍事公安領(lǐng)域中的應(yīng)用</p><p> 巡航導(dǎo)彈地形識別;指紋自動識別;警戒系統(tǒng)及自動火炮控制;反偽裝偵察;手跡、人像、印章的鑒定識別;過期檔案文字的復(fù)原;集裝箱的不開箱檢查等。</p><p><b> 其他應(yīng)用</b></p><p> 圖像的遠(yuǎn)距離通信;多媒體計算機系統(tǒng)及應(yīng)用;電視電話;服裝試穿顯示;理發(fā)發(fā)型預(yù)測顯示;電視會議;
38、辦公自動化、現(xiàn)場視頻管理等。</p><p> 1.4 Visual C++</p><p> 1.4.1 Visual C++簡述</p><p> Visual C++(簡稱VC)是微軟公司提供的基于C/C++的應(yīng)用程序集成開發(fā)工具。VC擁有豐富的功能和大量的擴展庫,使用它能有效的創(chuàng)建高性能的Windows應(yīng)用程序和Web應(yīng)用程序。VC的優(yōu)越性主要表現(xiàn)在以
39、下幾個方面:</p><p><b> 開發(fā)分布式應(yīng)用。</b></p><p> 開發(fā)的應(yīng)用程序運行效率高、具有健壯性。</p><p> 能縮短軟件升級周期。</p><p> 能夠生成多線程應(yīng)用,而多線程應(yīng)用對于增加并發(fā)響應(yīng)有實際意義。</p><p> VC除了提供高效的C/C+
40、+編譯器外,還提供了大量的可重用類和組件,包括著名的微軟基礎(chǔ)類庫(MFC)和活動模板類庫(ATL),因此它是軟件開發(fā)人員不可多得的開發(fā)工具。</p><p> 1.4.2 將Visual C++應(yīng)用于數(shù)字圖像的幾何變換</p><p> VC豐富的功能和大量的擴展庫,類的重用特性以及它對函數(shù)庫、DLL庫的支持能使程序更好的模塊化,并且通過向?qū)С绦虼蟠蠛喕藥熨Y源的使用和應(yīng)用程序的開發(fā),
41、正由于VC具有明顯的優(yōu)勢,因而我選擇了它來作為數(shù)字圖像幾何變換的開發(fā)工具。</p><p> 在本程序的開發(fā)過程中,VC的核心知識、消息映射機制、對話框控件編程等都得到了生動的體現(xiàn)和靈活的應(yīng)用。</p><p> 第二章 數(shù)字圖像處理的基本概念</p><p> 本章將詳細(xì)介紹Windows下Visual C++數(shù)字圖像處理的基礎(chǔ)知識。主要的內(nèi)容有:</
42、p><p> 1:Windows位圖的結(jié)構(gòu)和調(diào)色板的概念;</p><p> 2:GDI位圖與設(shè)備無關(guān)位圖的概念;</p><p> 3:如何構(gòu)造自己的DIB函數(shù)庫,及如何用Visual C++編程來實現(xiàn)Windows位圖的讀寫。</p><p> 2.1 圖像和調(diào)色板</p><p> 2.1.1 圖像的顯示&
43、lt;/p><p> 普通的顯示器屏幕是由許多的點構(gòu)成的,這些點稱為像素。顯示時采用掃描的方式:電子槍每次從左到右掃描一行,為每個像素著色,然后再像這樣從上到下掃描整個屏幕,利用人眼的視覺暫留效應(yīng)就可以顯示出一屏完整的圖像。為了防止閃爍,每秒要重復(fù)上述掃描過程幾十次。一般刷新頻率大于80Hz時,人眼感受不到屏幕刷新而產(chǎn)生的閃爍,這種顯示器被稱為位映像設(shè)備。所謂位映像,就是指一個二維的像素矩陣,而位圖就是采用位映像方
44、法顯示和存儲的圖像。</p><p> 對于彩色圖像,它的顯示必須從三原色RGB的概念說起。眾所周知,自然界中的所有顏色都可以由紅綠藍(lán)(R、G、B)3原色組合而成。針對三原色成分的多少,可以人為的將每種顏色分成0到255共256個等級。這樣,根據(jù)紅、綠、藍(lán)各種不同的組合,就能表示出256*256*256(約1600萬)種顏色。當(dāng)一幅圖中每個像素被賦予不同的RGB值時,就能呈現(xiàn)出五彩繽紛的顏色了,這就形成了彩色圖
45、像。</p><p><b> 2.1.2 調(diào)色板</b></p><p> 如果一幅圖像的每個像素都用其RGB分量來表示,那么所有的圖像文件都將變的非常龐大,實際上的做法不完全是這樣的,可以先來看一個簡單的計算。</p><p> 對一幅200*200的16色圖像,它共有40 000個像素,如果每一個像素都用R、G、B三個分量表示,則一
46、個像素需要3個字節(jié),這樣保存整個圖像要用200*200*3即120 000字節(jié)。但是如果采用下面的方法,就能省很多字節(jié)。</p><p> 對于16色圖像,圖中最多只有16種顏色,如果采用一個顏色表,表中的每一行記錄一種顏色的R、G、B值,這樣當(dāng)表示一個像素的顏色時,只需要指出該顏色是在第幾行,即該顏色在顏色表中的索引值便可以。例如,如果表的第0行為255,0,0(紅色),那么當(dāng)某個像素為紅色時,只需要標(biāo)明0即
47、可。通過顏色索引表來表示圖像,16種狀態(tài)可以用4位(bit)表示,所以一個像素要用半個字節(jié)。整個圖像要用200*200*0.5即20 000字節(jié),在加上顏色表占用3*16=48字節(jié),也不過20 048字節(jié)。這樣一幅圖像整個占用的字節(jié)數(shù)只是前面的1/6。</p><p> 其實這張RGB表,就是通常所說的調(diào)色板(Palette),或顏色查找表LUT(Look Up Table)。不僅僅是Windows位圖,其他許
48、多圖像文件格式,例如“.pcx”、“.tif”、“.gif”等都用到了調(diào)色板。</p><p> 還有一種情況,即真彩色圖像(又叫做24位圖像)的顏色種類高達(dá)256*256*256=16 777 216種,也就是包含上述提到的R、G、B顏色表示方法中所有的顏色。真彩色圖像是說它具有顯示所有顏色的能力,即可以包含所有的顏色。通常,在表示真彩色圖像時,每個像素直接用R、G、B這3個分量字節(jié)表示,而不采用調(diào)色板技術(shù)。
49、原因很簡單:如果使用調(diào)色板,表示一個像素顏色在調(diào)色板中的索引要用24位,這和直接用R、G、B這3個分量表示用的字節(jié)數(shù)一樣,不但沒有節(jié)省任何空間,還要加上一個256*256*256*3個字節(jié)大的調(diào)色板。所以真彩色直接用R、G、B這3個分量表示。</p><p> 2.1.3 色彩系統(tǒng)</p><p> 前面介紹的RGB色彩系統(tǒng)是最常用的顏色系統(tǒng),但在其他方面也會用到其他的色彩系統(tǒng),常見的
50、有:</p><p><b> CMY色彩系統(tǒng)</b></p><p> CMY(Cyan,Megenta,Yellow)色彩系統(tǒng)也是一種常用的表示顏色的方式。計算機屏幕的顯示通常用RGB色彩系統(tǒng),它是通過顏色的相加來產(chǎn)生其他顏色,這種做法通常稱為加色合成法。而在印刷工業(yè)上則通常用CMY色彩系統(tǒng),它是</p><p> 通過顏色相減來產(chǎn)生
51、其他顏色的,所以稱這種方式為減色合成法。</p><p> 圖2.1 RGB與CMY色彩系統(tǒng)關(guān)系圖</p><p><b> YIQ色彩系統(tǒng)</b></p><p> YIQ色彩系統(tǒng)通常被北美的電視系統(tǒng)所采用,這里Y不是指黃色,而是指顏色的明視度,即亮度。其實Y就是圖像的灰度值,而I和Q則是指色調(diào),即描述圖像色彩及飽和度的屬性。RGB與
52、YIQ之間的對應(yīng)關(guān)系如下:</p><p><b> YUV色彩系統(tǒng)</b></p><p> YUV色彩系統(tǒng)被歐洲的電視系統(tǒng)所采用,其中Y和上面的YIQ色彩系統(tǒng)中的Y相同,都是指亮度。U和V雖然也是指色調(diào),但是和I與Q的表達(dá)方式不完全相同。RGB與YUV之間的對應(yīng)關(guān)系如下:</p><p><b> YCbCr色彩系統(tǒng)<
53、/b></p><p> YCbCr色彩系統(tǒng)也是一種常見的色彩系統(tǒng),JPEG采用的色彩系統(tǒng)正是該系統(tǒng)。它是從YUV色彩系統(tǒng)衍生出來的。其中Y還是指亮度,而Cb和Cr則是將U和V做少量調(diào)整而得到的。RGB色彩系統(tǒng)和YCbCr色彩系統(tǒng)之間的對應(yīng)關(guān)系如下:</p><p><b> 2.1.4 灰度圖</b></p><p> 灰度圖(G
54、rayscale)是指只含亮度信息,不含色彩信息的圖像。因此,要表示灰度圖,就需要把亮度值進(jìn)行量化。通常劃分為0到255共256個級別,0最暗(全黑),255最亮(全白)。</p><p> BMP格式的文件中并沒有灰度圖這個概念,但是可以很容易的用BMP文件來表示灰度圖。方法是用256色的調(diào)色板,只不過這個調(diào)色板有點特殊,每一項的RGB值都是相同的。也就是說RGB值從(0,0,0),(1,1,1)一直到(25
55、5,255,255)。(0,0,0)是全黑色,(255,255,255)是全白色,中間的是灰色。對于R=G=B的色彩,帶入YIQ或YUV色彩系統(tǒng)轉(zhuǎn)換公式中可以看到其顏色分量都是0,即沒有色彩信息。</p><p> 灰度圖使用比較方便。首先RGB的值都一樣;其次。圖像數(shù)據(jù)即顏色表索引值,也就是實際的RGB的亮度值;另外因為是256色的調(diào)色板,所以圖像數(shù)據(jù)中一個字節(jié)代表一個像素。如果是彩色的256色圖,圖像處理后
56、有可能會產(chǎn)生不屬于這256種顏色的新顏色,所以,圖像處理一般采用灰度圖。</p><p><b> 2.2 GDI位圖</b></p><p> GDI是圖形設(shè)備接口(Graphics Device Interface)的縮寫。GDI位圖是一種GDI對象,在Microsoft基本類(MFC)庫中用CBitmap類來表示。在CBitmap類對象中,包含一種和Wind
57、ows的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)的一個備份,但是其中位的安排則完全依賴于顯示設(shè)備。可以將GDI位圖數(shù)據(jù)在同一臺計算機的內(nèi)的不同的應(yīng)用程序間任意傳遞,但是由于其對設(shè)備的依賴性,在不同類型計算機間的傳遞是沒有任何意義的。</p><p> 下圖是CBitmap類的繼承關(guān)系圖。CBitmap類封裝了Windows GDI位圖,同時提供了一些操
58、作位圖的成員函數(shù)。在使用CBitmap對象時,首先要創(chuàng)建一個CBitmap對象,然后把它選進(jìn)設(shè)備環(huán)境中,再調(diào)用其成員函數(shù)進(jìn)行處理,在使用完畢后,把它從設(shè)備環(huán)境中選出并刪除。</p><p> 圖2.2 CBitmap類的繼承關(guān)系圖</p><p> 2.2.1 從資源中裝入GDI位圖</p><p> 為了加載位圖,可以使用CBitmap類的LoadBitm
59、ap()成員函數(shù)。LoadBitmap()函數(shù)有兩種調(diào)用方式。</p><p> BOOL LoadBitmap(LPCTSTR lpszResourseName );</p><p> BOOL LoadBitmap(UINT nIDResourse );</p><p> 一種是通過資源名稱(由參數(shù)lpszResourseName指定)來加載指定的GDI位
60、圖;另外一種是通過資源ID(由參數(shù)nIDResourse指定)來加載指定的GDI位圖。</p><p> 2.2.2 伸縮位圖</p><p> 有時,想對位圖進(jìn)行放大或縮小的操作,這時就可以使用StretchBlt()函數(shù)來顯示位圖。下面是該函數(shù)的原型:</p><p> BOOL StretchBlt(int x,int y,int nWidth, int
61、 nHeight,CDC *pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop );</p><p> 該函數(shù)中各個參數(shù)含義如下:</p><p> x:指定繪制區(qū)域的左上角x坐標(biāo)(邏輯單位);</p><p> y:指定繪制區(qū)域的左上角y坐標(biāo)(邏輯單位);</p>
62、<p> nWidth:指定繪制區(qū)域的寬度;</p><p> nHeight:指定繪制區(qū)域的高度;</p><p> pSrcDC:指向要復(fù)制位圖所在的CDC對象的指針;</p><p> xSrc:指定原位圖要繪制區(qū)域的左上角x坐標(biāo)(邏輯單位);</p><p> ySrc:指定原位圖要繪制區(qū)域的左上角y坐標(biāo)(邏輯單位
63、);</p><p> nSrcWidth:指定要復(fù)制原圖像的寬度;</p><p> nSrcHeight:指定要復(fù)制原圖像的高度;</p><p> dwRop:指定繪制方式。</p><p> 2.3 設(shè)備無關(guān)位圖(DIB)</p><p> DIB是Device-Independent Bitmap(
64、設(shè)備無關(guān)位圖)的縮寫。它自帶顏色信息,因此調(diào)色板管理非常容易。DIB也使打印時的灰度陰影的控制更加容易。任何運行Windows的計算機都可以處理DIB,它通常以BMP文件的形式被保存在磁盤中或則作為資源保存在EXE文件和DLL文件中。</p><p> 2.3.1 BMP文件中DIB的結(jié)構(gòu)</p><p> DIB是標(biāo)準(zhǔn)的Windows位圖格式,BMP文件中包含了一個DIB。一個BMP
65、文件大體上分成如下4個部分:</p><p> 圖2.3 BMP文件結(jié)構(gòu)示意圖</p><p> 第一部分為位圖文件頭BITMAPFILEHEADER,它是一個結(jié)構(gòu),其定義如下:</p><p> typedef struct tagBITMAPFILEHEADER{</p><p> WORD bfType;</p&g
66、t;<p> DWORD bfSize;</p><p> WORD bfReserved1;</p><p> WORD bfReserved2;</p><p> DWORD bfOffBits; </p><p> }BITMAPFILEHEADER,FAR*LPBITMAPFILEHEADE
67、R,*PBITMAPFILEHEADER;</p><p> 該結(jié)構(gòu)的長度是固定的,為14個字節(jié)(WORD為無符號16位整數(shù),DWORD為無符號32位整數(shù)),各個域的說明如下:</p><p> bfType:指定文件類型,必須是0x424D,即字符串“BM”,也就是說所有“.bmp”文件的頭兩個字節(jié)都是“BM”。</p><p> bfSize:指定文件大小
68、,包括這14個字。</p><p> bfReserved1,bfReserved2:為保留字,不用考慮。</p><p> bfOffBits:為從文件頭到實際的位圖數(shù)據(jù)的偏移字節(jié)數(shù),即上圖中前三個部分的和。</p><p> 第二部分為位圖信息頭BITMAPINFOHEADER,它也是一個結(jié)構(gòu),其定義如下:</p><p> ty
69、pedef struct tagBITMAPINFOHEADER{</p><p> DWORD biSize;</p><p> LONG biWidth;</p><p> LONG biHeight;</p><p> WORD biPlanes;</p><p> WORD biBitCount;&l
70、t;/p><p> DWORD biCompression;</p><p> DWORD biSizeImage;</p><p> LONG biXPelsPerMeter;</p><p> LONG biYPelsPerMeter;</p><p> DWORD biClrUsed;</p>
71、<p> DWORD biClrImportant;</p><p> }BITMAPINFOHEADER,F(xiàn)AR *LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;</p><p> 該結(jié)構(gòu)的長度也是固定的,為40個字節(jié)。各個域的說明如下:</p><p> biSize:指定這個結(jié)構(gòu)的長度,為40字節(jié)。</p
72、><p> biWidth:指定圖像的寬度,單位是像素。</p><p> biHeight:指定圖像的高度,單位是像素。</p><p> biPlanes:必須是1,不用考慮。</p><p> biBitCount:指定表示顏色時要用到的位數(shù),常用的值為1(黑白二色圖)、4(16色圖)、8(256色)、24(真彩色),新的“.bmp
73、”格式支持32位色,這里就不做討論了。</p><p> biCompression:指定位圖是否壓縮,有效的值為BI-RGB,BI-RLE8,BI-RLE4,BI-BITFIELDS(都是Windows定義好的常量)。要說明的是,Windows位圖可以采用RLE4和RLE8的壓縮格式,但用的不多。今后所討論的只有第一種不壓縮的情況,即biCompression為BI-RGB的情況。</p>&l
74、t;p> biSizeImage:指定實際的位圖數(shù)據(jù)占用的字節(jié)數(shù)。</p><p> biXPelsPerMeter:指定目標(biāo)設(shè)備的水平分辨率,單位是像素/米。</p><p> biYPelsPerMeter:指定目標(biāo)設(shè)備的垂直分辨率,單位是像素/米。</p><p> biClrUsed:指定本圖像實際用到的顏色數(shù),如果該項為0,則用到的顏色數(shù)為2
75、的biCompression次冪。</p><p> biClrImportant:指定本圖像中重要的顏色數(shù),如果該值為0,則認(rèn)為所有的顏色都是重要的。</p><p> 第三部分為調(diào)色板(Palette)。有些位圖需要調(diào)色板,有些位圖,如真彩色圖,不需要調(diào)色板,它們的BITMAPINFOHEADER后面直接是位圖數(shù)據(jù)。</p><p> 調(diào)色板實際上是一個數(shù)
76、組,共有biClrUsed個元素(如果該值為0,則有2的biBitCount次冪個元素)。數(shù)組中每個元素的類型是一個RGBQUAD結(jié)構(gòu),占4個字節(jié),其定義如下:</p><p> typedef struct tagRGBQUAD{</p><p> BYTE rgbBlue;</p><p> BYTE rgbGreen;</p><p&
77、gt; BYTE rgbRed;</p><p> BYTE rgbReserved;</p><p><b> }RGBQUAD;</b></p><p><b> 其中:</b></p><p> rgbBlue:該顏色的藍(lán)色分量。</p><p> rgbG
78、reen:該顏色的綠色分量。</p><p> rgbRed:該顏色的紅色分量。</p><p> rgbReserved:保留值。</p><p> 第四部分就是實際的圖像數(shù)據(jù)。對于用到調(diào)色板的位圖,圖像數(shù)據(jù)就是該像素顏色在調(diào)色板中的索引值,對于真彩色圖,圖像數(shù)據(jù)就是實際的R、G、B值。下面就2色、16色、256色位圖和真彩色位圖分別介紹。</p>
79、;<p> 對于2色位圖,用1位就可以表示該像素的顏色(一般0表示黑,1表示白),所以一個字節(jié)可以表示8個像素。</p><p> 對于16色位圖,用4位可以表示一個像素的顏色,所以1個字節(jié)可以表示2個像素。</p><p> 對于256色位圖,1個字節(jié)剛好可以表示1個像素。</p><p> 對于真彩色圖,3個字節(jié)才能表示1個像素。</
80、p><p> 2.3.2 DIB訪問函數(shù)</p><p> Windows支持一些重要的DIB訪問函數(shù),但是這些函數(shù)都還沒有被封裝到MFC中,這些函數(shù)主要有:</p><p> SetDIBitsToDevice函數(shù):該函數(shù)可以直接在顯示器或打印機上顯示DIB。 在顯示時不進(jìn)行縮放處理。</p><p> StretchDIBits函
81、數(shù):該函數(shù)可以縮放顯示DIB于顯示器和打印機上。</p><p> GetDIBits函數(shù):還函數(shù)利用申請到的內(nèi)存,由GDI位圖來構(gòu)造DIB。通過該函數(shù),可以對DIB的格式進(jìn)行控制,可以指定每個像素顏色的位數(shù),而且可以指定是否進(jìn)行壓縮。</p><p> CreateDIBitmap函數(shù):利用該函數(shù)可以從DIB出發(fā)來創(chuàng)建GDI位圖。</p><p> Crea
82、teDIBSection函數(shù):該函數(shù)能創(chuàng)建一種特殊的DIB,稱為DIB項,然后返回一個GDI位圖句柄。</p><p> LoadImage函數(shù):該函數(shù)可以直接從磁盤文件中讀入一個位圖,并返回一個DIB句柄。</p><p> DrawDibDraw函數(shù):Windows提供了窗口視頻(VFW)組件,Visual C++支持該組件。VFW中的DrawDibDraw函數(shù)是一個可以替代Str
83、etchDIBits的函數(shù)。它的最主要的優(yōu)點是可以使用抖動顏色,并且提高顯示DIB的速度,缺點是必須將VFW代碼連接到進(jìn)程中。</p><p> 2.3.3 使用DIB讀寫B(tài)MP文件</p><p> 雖然MFC沒有封裝DIB,但是在程序中使用DIB還是十分方便的。作者構(gòu)造了自己的DIB函數(shù)庫,這樣在使用DIB時,只要對它進(jìn)行調(diào)用就可以了。接下來作者使用這些DIB函數(shù)編寫了一個簡單的讀
84、寫B(tài)MP的多文檔應(yīng)用程序。該程序不但可以直接讀寫B(tài)MP文件,打印當(dāng)前DIB,還支持剪貼板操作,復(fù)制當(dāng)前DIB到剪貼板,可以將剪貼板中現(xiàn)有的DIB拷貝到當(dāng)前的DIB中。下面是讀寫DIB的程序流程圖:</p><p> 圖2.4 建立與打開圖像</p><p> 圖2.5 保存圖像</p><p> 下面是程序打開一幅圖像時的界面:</p>&l
85、t;p> 第三章 圖像的幾何變換</p><p> 圖像的幾何變換,通常包括圖像的平移、圖像的鏡像變換、圖像的轉(zhuǎn)置、圖像的縮放和圖像的旋轉(zhuǎn)等。</p><p><b> 程序基本框架如下:</b></p><p> 圖3.1 程序基本框架圖</p><p><b> 3.1 圖像的平移<
86、/b></p><p> 圖像的平移是幾何變換中最簡單的變換之一。</p><p> 3.1.1 理論基礎(chǔ)</p><p> 圖像平移就是將圖像中所有的點都按照指定的平移量水平、垂直移動。設(shè)(x0,y0)為原圖像上的一點,圖像水平平移量為tx,垂直平移量為ty,則平移后點(x0,y0)坐標(biāo)將變?yōu)椋▁1,y1)。</p><p>
87、 顯然(x0,y0)和(x1,y1)的關(guān)系如下:</p><p><b> 用矩陣表示如下:</b></p><p> 對該矩陣求逆,可以得到逆變換:</p><p><b> 即</b></p><p> 這樣,平移后的圖像上的每一點都可以在原圖像中找到對應(yīng)的點。例如,對于新圖中的(0,0
88、)像素,代入上面的方程組,可以求出對應(yīng)原圖中的像素(-tx,-ty)。如果tx或ty大于0,則(- tx,- ty)不在原圖中。對于不在原圖中的點,可以直接將它的像素值統(tǒng)一設(shè)置為0或則255(對于灰度圖就是黑色或白色)。同樣,若有點不在原圖中,也就說明原圖中有點被移出顯示區(qū)域。如果不想丟失被移出的部分圖像,可以將新生成的圖像寬度擴大|tx |,高度擴大| ty |。</p><p> 3.1.2 Visual
89、C++編程實現(xiàn)</p><p> 有了上面的理論基礎(chǔ),可以十分容易的用Visual C++來實現(xiàn)圖像的平移。在這里,只介紹灰度圖像的平移,因為灰度圖像每個像素位數(shù)正好是8位,即1個字節(jié),這樣,在進(jìn)行圖像處理時,可以不必考慮拼湊字節(jié)的問題。而且由于灰度圖調(diào)色板的特殊性,進(jìn)行灰度圖像處理時,不必考慮調(diào)色板的問題。根據(jù)上面的公式可以得到圖像的平移程序流程圖:</p><p> 圖3.2 圖
90、像平移程序流程圖</p><p> 由上面的程序流程圖可以得到如下算法:</p><p><b> //每行</b></p><p> for(i=0;i<lHeight;i++)</p><p><b> {</b></p><p><b> //
91、每列</b></p><p> for(j=0;j<lWidth;j++)</p><p><b> {</b></p><p> lpDst=(char*)lpNewDIBBits+lLineBytes*(lHeight-1-i)+j;</p><p> //計算該像素在原DIB中的坐標(biāo)<
92、;/p><p> i0=i-lXOffset;</p><p> j0=j-lYOffset;</p><p> //判斷是否在原圖范圍內(nèi)</p><p> if(j0>=0)&&(j0<lWidth)&&(i0>=0)&&(i0<lHeight)</p>
93、<p><b> {</b></p><p> //指向原DIB第i0行,第j0個像素的指針</p><p> //同樣要注意DIB上下倒置的問題</p><p> lpSrc=(char*)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0;</p><p><b&
94、gt; //復(fù)制像素</b></p><p> *lpDst=*lpSrc;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> *((unsi
95、gned char*)lpDst)=255; //對于原圖中沒有的像素,直接賦值為255</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 由于每行像素是連續(xù)放置的,可以直接逐行地來復(fù)制
96、圖像。首先計算移出后可視的區(qū)域。</p><p><b> 對于x軸方向,</b></p><p> 當(dāng)tx -width時,圖像完全移出了屏幕,不用做任何處理;</p><p> 當(dāng)-width< tx 0時,圖像區(qū)域的x范圍從0到width-,對應(yīng)原圖的范圍從到width;</p><p> 當(dāng)0〈
97、 tx〈width時,圖像區(qū)域的x范圍從tx到width,對應(yīng)原圖的范圍從0到width-tx;</p><p> 當(dāng)tx width時,圖像完全移出了屏幕,不用做任何處理;</p><p><b> 對于y軸方向,</b></p><p> 當(dāng)ty -height時,圖像完全移出了屏幕,不用做任何處理;</p><
98、;p> 當(dāng)-height〈 ty 0時,圖像區(qū)域的y范圍從0到height- ,對應(yīng)原圖的范圍從到height;</p><p> 當(dāng)0〈 ty〈height時,圖像區(qū)域的y范圍從ty到height,對應(yīng)原圖的范圍從0到height-ty;</p><p> 當(dāng)ty height時,圖像完全移出了屏幕,不用做任何處理;</p><p> 當(dāng)計算出經(jīng)移
99、動而可視的區(qū)域后,就可以利用位圖存儲的連續(xù)性,即同一行的像素在內(nèi)存中是相鄰的這一規(guī)則進(jìn)行計算。利用memcpy函數(shù),從(x0,y0)點開始,一次可以拷貝一整行(寬度為x1-x0),然后將內(nèi)存指針移到(x0,y0+1)處,拷貝下一行。這樣拷貝到(y1-y0)行就完成了全部操作,避免了單個像素的計算,從而提高了效率。</p><p> 按照上面的描述,現(xiàn)在可以構(gòu)造自己的圖像幾何變換函數(shù)庫了。首先來完成圖像的平移函數(shù)
100、。圖像的平移函數(shù)操作不需要改變DIB的調(diào)色板和文件頭,只要把指向DIB像素起始位置的指針和DIB高寬傳遞給子函數(shù)就可以完成平移工作。</p><p> 下面以圖像平移為例說明圖像處理的簡易流程圖:</p><p> 圖3.3 圖像平移處理的簡易流程圖</p><p> 下面是程序進(jìn)行平移時的界面:</p><p> 圖像平移后的結(jié)果
101、為:</p><p> 3.2 圖像的鏡像變換</p><p> 圖像的鏡像變換分為兩種:一種是水平鏡像,另外一種是垂直鏡像。圖像的水平鏡像操作是將圖像的左半部分和右半部分以圖像垂直中軸線為中心鏡像進(jìn)行對換;圖像的垂直鏡像操作是將圖像上半部分和下半部分以圖像水平中軸線為中心鏡像進(jìn)行對換。</p><p> 3.2.1 理論基礎(chǔ)</p><p
102、> 設(shè)圖像高度為lHeight,寬度為lWidth,原圖中(x0,y0)經(jīng)過水平鏡像后坐標(biāo)將變?yōu)椋╨Width-x0,y0),其矩陣表達(dá)式為:</p><p> 逆運算矩陣表達(dá)式為:</p><p><b> 即</b></p><p> 同樣,(x0,y0)經(jīng)過垂直鏡像后坐標(biāo)將變?yōu)椋▁0,lHeight-y0),其矩陣表達(dá)式為:
103、</p><p> 逆運算矩陣表達(dá)式為:</p><p><b> 即</b></p><p> 3.2.2 Visual C++編程實現(xiàn)</p><p> 按照上面的變換公式,可以非常簡單的實現(xiàn)圖像的水平和垂直鏡像操作。下圖是鏡像操作的程序流程圖:</p><p> 圖3.4 圖像鏡
104、像程序流程圖</p><p> 算法如下所示(bDirection為真時表示水平鏡像,否則為垂直):</p><p><b> //每行</b></p><p> for(i=0;i<lHeight;i++) </p><p><b> {</b></p><p&g
105、t;<b> //每列</b></p><p> for(j=0;j<lWidth;j++) </p><p><b> {</b></p><p> //指向新DIB第i行,第j個像素的指針</p><p> lpDst=(char*)lpNewDIBBits+lLineBytes
106、*(lHeight-i-1)+j;</p><p> //計算該像素在原DIB中的坐標(biāo)</p><p> if(bDirection)</p><p><b> {</b></p><p><b> //水平鏡像</b></p><p><b> i0=i
107、;</b></p><p> j0=lWidth-j;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> //垂直鏡像<
108、/b></p><p> i0=lHeight-i;</p><p><b> j0=j;</b></p><p><b> }</b></p><p> if(j0>=0)&&(j0<lWidth)&&(i0>=0)&&
109、;(i0<lHeight)</p><p><b> {</b></p><p> //指向原DIB第i0行,第j0個像素的指針</p><p> //同樣要注意DIB上下倒置的問題</p><p> lpSrc=(char*)lpDIBBits+lLineBytes*(lHeight-1-i0)+j0;&
110、lt;/p><p><b> //復(fù)制像素</b></p><p> *lpDst=*lpSrc;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b><
111、/p><p> *((unsigned char*)lpDst)=255; //對于原圖中沒有的像素,直接賦值為255</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
112、; 和圖像平移一樣,在垂直鏡像中也可以利用位圖存儲的連續(xù)性整行復(fù)制圖像。</p><p> 水平鏡像后的結(jié)果為:</p><p> 垂直鏡像后的結(jié)果為:</p><p><b> 3.3 圖像的轉(zhuǎn)置</b></p><p> 圖像的轉(zhuǎn)置操作是將圖像像素的x坐標(biāo)和y坐標(biāo)互換。該操作將改變圖像的大小,圖像的高度和寬
113、度將互換。</p><p> 3.3.1 理論基礎(chǔ)</p><p> 轉(zhuǎn)置的變換矩陣表達(dá)式很簡單:</p><p> 它的逆矩陣表達(dá)式是:</p><p><b> 即</b></p><p> 3.3.2 Visual C++編程實現(xiàn)</p><p> 圖像轉(zhuǎn)
114、置的實現(xiàn)和圖像鏡像變換相似,不同之處在于圖像轉(zhuǎn)置后DIB的頭文件也要進(jìn)行相應(yīng)的改變,主要是將頭文件中圖像高度和寬度信息更新。因此傳遞給圖像轉(zhuǎn)置函數(shù)的參數(shù)是直接指向DIB的指針,而不是直接指向DIB像素的指針。根據(jù)公式可以得到如下所示的程序流程圖:</p><p> 圖3.5 圖像轉(zhuǎn)置程序流程圖</p><p> 根據(jù)上圖可以得到如下算法:</p><p>
115、for(i=0;i<lHeight;i++) //針對圖像每行進(jìn)行操作</p><p><b> {</b></p><p> for(j=0;j<lWidth;j++) //針對每行圖像每列進(jìn)行操作</p><p><b> { </b></p&
116、gt;<p> lpSrc=(char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j; //指向原DIB圖像第i行,第j個像素的指針</p><p> lpDst=(char*)lpNewDIBBits+lNewLineBytes*(lWidth-1-j)+i; //指向轉(zhuǎn)置DIB第j行,第i個像素的指針</p><p> *lpDst
117、=*lpSrc; //復(fù)制像素</p><p><b> }</b></p><p><b> }</b></p><p> memcpy(lpDIBBits,lpNewDIBBits,lWidth*lNewLineBytes); //復(fù)制轉(zhuǎn)置后的圖像</p><p&g
118、t; //互換DIB中圖像的高寬</p><p> if(IS_WIN30_DIB(lpDIB))</p><p><b> {</b></p><p> lpbmi->biWidth=lHeight;</p><p> lpbmi->biHeight=lWidth;</p><
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字圖像處理畢業(yè)設(shè)計
- 數(shù)字圖像處理畢業(yè)設(shè)計
- 畢業(yè)設(shè)計----基于matlab的數(shù)字圖像處理
- 畢業(yè)設(shè)計----數(shù)字圖像處理技術(shù)研究
- 數(shù)字圖像處理課程設(shè)計---數(shù)字圖像處理
- 數(shù)字圖像處理原理與實踐 基于visual c++開發(fā)(帶書簽)
- 畢業(yè)設(shè)計----數(shù)字圖像處理系統(tǒng)的研制
- 數(shù)字圖像處理外文翻譯--- 數(shù)字圖像處理
- 數(shù)字圖像處理課程設(shè)計--數(shù)字圖像處理系統(tǒng)
- 數(shù)字圖像處理課程設(shè)計--基于matlab的數(shù)字圖像處理
- 畢業(yè)設(shè)計---visul c++圖象處理設(shè)計
- 數(shù)字圖像處理課程設(shè)計--基于matlab的數(shù)字圖像處理
- 數(shù)字圖像處理
- 基于visual_c++的數(shù)字圖像處理畢業(yè)論文
- 畢業(yè)論文---數(shù)字圖像處理
- 數(shù)字圖像處理畢業(yè)論文
- 數(shù)字圖像處理畢業(yè)論文
- 數(shù)字圖像處理畢業(yè)論文
- 畢業(yè)設(shè)計--基于數(shù)字圖像處理的車牌定位與識別
- 畢業(yè)設(shè)計 matlab在數(shù)字圖像處理中的應(yīng)用 正文
評論
0/150
提交評論