日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#图像处理基础概念知识

發(fā)布時間:2023/12/18 C# 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#图像处理基础概念知识 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圖像是人類獲取和交換信息的主要來源,因此,圖像處理的應(yīng)用領(lǐng)域必然涉及到人類生活和工作的方方面面。隨著人類活動范圍的不斷擴大,圖像處理的應(yīng)用領(lǐng)域也將隨之不斷擴大。(1)航天和航空技術(shù)方面的應(yīng)用 數(shù)字圖像處理技術(shù)在航天和航空技術(shù)方面的應(yīng)用,除了上面介紹的JPL對月球、火星照片的處理之外,另一方面的應(yīng)用是在飛機遙感和衛(wèi)星遙感技術(shù)中。許多國家每天派出很多偵察飛機對地球上有興趣的地區(qū)進行大量的空中攝影。對由此得來的照片進行處理分析,以前需要雇用幾千人,而現(xiàn)在改用配備有高級計算機的圖像處理系統(tǒng)來判讀分析,既節(jié)省人力,又加快了速度,還可以從照片中提取人工所不能發(fā)現(xiàn)的大量有用情報。從60年代末以來,美國及一些國際組織發(fā)射了資源遙感衛(wèi)星(如LANDSAT系列)和天空實驗室(如SKYLAB),由于成像條件受飛行器位置、姿態(tài)、環(huán)境條件等影響,圖像質(zhì)量總不是很高。因此,以如此昂貴的代價進行簡單直觀的判讀來獲取圖像是不合算的,而必須采用數(shù)字圖像處理技術(shù)。如LANDSAT系列陸地衛(wèi)星,采用多波段掃描器(MSS),在900km高空對地球每一個地區(qū)以18天為一周期進行掃描成像,其圖像分辨率大致相當(dāng)于地面上十幾米或100米左右(如1983年發(fā)射的LANDSAT-4,分辨率為30m)。這些圖像在空中先處理(數(shù)字化,編碼)成數(shù)字信號存入磁帶中,在衛(wèi)星經(jīng)過地面站上空時,再高速傳送下來,然后由處理中心分析判讀。這些圖像無論是在成像、存儲、傳輸過程中,還是在判讀分析中,都必須采用很多數(shù)字圖像處理方法?,F(xiàn)在世界各國都在利用陸地衛(wèi)星所獲取的圖像進行資源調(diào)查(如森林調(diào)查、海洋泥沙和漁業(yè)調(diào)查、水資源調(diào)查等),災(zāi)害檢測(如病蟲害檢測、水火檢測、環(huán)境污染檢測等),資源勘察(如石油勘查、礦產(chǎn)量探測、大型工程地理位置勘探分析等),農(nóng)業(yè)規(guī)劃(如土壤營養(yǎng)、水份和農(nóng)作物生長、產(chǎn)量的估算等),城市規(guī)劃(如地質(zhì)結(jié)構(gòu)、水源及環(huán)境分析等)。我國也陸續(xù)開展了以上諸方面的一些實際應(yīng)用,并獲得了良好的效果。在氣象預(yù)報和對太空其它星球研究方面,數(shù)字圖像處理技術(shù)也發(fā)揮了相當(dāng)大的作用。(2)生物醫(yī)學(xué)工程方面的應(yīng)用 數(shù)字圖像處理在生物醫(yī)學(xué)工程方面的應(yīng)用十分廣泛,而且很有成效。除了上面介紹的CT技術(shù)之外,還有一類是對醫(yī)用顯微圖像的處理分析,如紅細胞、白細胞分類,染色體分析,癌細胞識別等。此外,在X光肺部圖像增晰、超聲波圖像處理、心電圖分析、立體定向放射治療等醫(yī)學(xué)診斷方面都廣泛地應(yīng)用圖像處理技術(shù)。 (3)通信工程方面的應(yīng)用 當(dāng)前通信的主要發(fā)展方向是聲音、文字、圖像和數(shù)據(jù)結(jié)合的多媒體通信。具體地講是將電話、電視和計算機以三網(wǎng)合一的方式在數(shù)字通信網(wǎng)上傳輸。其中以圖像通信最為復(fù)雜和困難,因圖像的數(shù)據(jù)量十分巨大,如傳送彩色電視信號的速率達100Mbit/s以上。要將這樣高速率的數(shù)據(jù)實時傳送出去,必須采用編碼技術(shù)來壓縮信息的比特量。在一定意義上講,編碼壓縮是這些技術(shù)成敗的關(guān)鍵。除了已應(yīng)用較廣泛的熵編碼、DPCM編碼、變換編碼外,目前國內(nèi)外正在大力開發(fā)研究新的編碼方法,如分行編碼、自適應(yīng)網(wǎng)絡(luò)編碼、小波變換圖像壓縮編碼等。(4)工業(yè)和工程方面的應(yīng)用 在工業(yè)和工程領(lǐng)域中圖像處理技術(shù)有著廣泛的應(yīng)用,如自動裝配線中檢測零件的質(zhì)量、并對零件進行分類,印刷電路板疵病檢查,彈性力學(xué)照片的應(yīng)力分析,流體力學(xué)圖片的阻力和升力分析,郵政信件的自動分揀,在一些有毒、放射性環(huán)境內(nèi)識別工件及物體的形狀和排列狀態(tài),先進的設(shè)計和制造技術(shù)中采用工業(yè)視覺等等。其中值得一提的是研制具備視覺、聽覺和觸覺功能的智能機器人,將會給工農(nóng)業(yè)生產(chǎn)帶來新的激勵,目前已在工業(yè)生產(chǎn)中的噴漆、焊接、裝配中得到有效的利用。(5)軍事公安方面的應(yīng)用 在軍事方面圖像處理和識別主要用于導(dǎo)彈的精確末制導(dǎo),各種偵察照片的判讀,具有圖像傳輸、存儲和顯示的軍事自動化指揮系統(tǒng),飛機、坦克和軍艦?zāi)M訓(xùn)練系統(tǒng)等;公安業(yè)務(wù)圖片的判讀分析,指紋識別,人臉鑒別,不完整圖片的復(fù)原,以及交通監(jiān)控、事故分析等。目前已投入運行的高速公路不停車自動收費系統(tǒng)中的車輛和車牌的自動識別都是圖像處理技術(shù)成功應(yīng)用的例子。(6)文化藝術(shù)方面的應(yīng)用 目前這類應(yīng)用有電視畫面的數(shù)字編輯,動畫的制作,電子圖像游戲,紡織工藝品設(shè)計,服裝設(shè)計與制作,發(fā)型設(shè)計,文物資料照片的復(fù)制和修復(fù),運動員動作分析和評分等等,現(xiàn)在已逐漸形成一門新的藝術(shù)--計算機美術(shù)。

數(shù)字圖像處理技術(shù)與圖象處理系統(tǒng)是七十年代末期形成一個獨立學(xué)科,當(dāng)時只能處理靜止圖象,主要用于軍事、科研醫(yī)學(xué)等領(lǐng)域。圖象處理系統(tǒng)是為了加快處理速度而設(shè)計的專用系統(tǒng),在中小型計算機控制下運行。這些系統(tǒng)的規(guī)模大,價格昂貴。面向PC機的圖象處理系統(tǒng)是八十年代中后期開始出現(xiàn)的。它價格便宜,易于擴充, 軟件豐富,因此很快得到推廣,帶動了圖象處理技術(shù)的普及。

在過去的二十年里,C和C++已經(jīng)成為在商業(yè)軟件的開發(fā)領(lǐng)域中使用最廣泛的語言。它們?yōu)槌绦騿T提供了十分靈活的操作,不過同時也犧牲了一定的效率。與諸如Microsoft,Visual Basic, 等語言相比,同等級別的C/C++應(yīng)用程序往往需要更長時間來開發(fā)。由于C/C++語言的復(fù)雜性,許多程序員都試圖尋找一種新的語言,希望能在功能與效率之間找到一個更為理想的權(quán)衡點。

???? 目前有些語言,以犧牲靈活性的代價來提高效率??墒沁@些靈活性正是C/C++程序員所需要的。這些解決方案對編程人員的限制過多(如屏蔽一些底層代碼控制的機制),其所提供的功能難以令人滿意。這些語言無法方便地同早先的系統(tǒng)交互,也無法很好地和當(dāng)前的網(wǎng)絡(luò)編程相結(jié)合。

??? 對于C/C++用戶來說,最理想的解決方案無疑是在快速開發(fā)的同時又可以調(diào)用底層平臺的所有功能。他們想要一種和最新的網(wǎng)絡(luò)標準保持同步并且能和已有的應(yīng)用程序良好整合的環(huán)境。另外,一些C/C++開發(fā)人員還需要在必要的時候進行一些底層的編程。

??? 微軟推出C# (C sharp)是微軟對這一問題的解決方案。C#是一種最新的、面向?qū)ο蟮木幊陶Z言。它使得程序員可以快速地編寫各種基于Microsoft .NET平臺的應(yīng)用程序,Microsoft .NET提供了一系列的工具和服務(wù)來最大程度地開發(fā)利用計算與通訊領(lǐng)域。正是由于C#面向?qū)ο蟮淖吭皆O(shè)計,使它成為構(gòu)建各類組件的理想之選--無論是高級的商業(yè)對象還是系統(tǒng)級的應(yīng)用程序。使用簡單的C#語言結(jié)構(gòu),這些組件可以方便的轉(zhuǎn)化為XML 網(wǎng)絡(luò)服務(wù),從而使它們可以由任何語言在任何操作系統(tǒng)上通過Internet進行調(diào)用。最重要的是,C#使得C++程序員可以高效的開發(fā)程序,而絕不損失C/C++原有的強大的功能。因為這種繼承關(guān)系,C#與C/C++具有極大的相似性,熟悉類似語言的開發(fā)者可以很快的轉(zhuǎn)向C#。

??? 效率與安全性新興的網(wǎng)絡(luò)經(jīng)濟迫使商務(wù)企業(yè)必須更加迅速的應(yīng)對競爭的威脅。開發(fā)者必須不斷縮短開發(fā)周期,不斷推出應(yīng)用程序的新版本,而不僅僅是開發(fā)一個"標志性"的版本。

?? C#在設(shè)計時就考慮了這些問題。它使開發(fā)者用更少的代碼做更多的事,同時也不易出錯。新的應(yīng)用程序開發(fā)模型意味著越來越多地解決方案依賴于新出現(xiàn)的網(wǎng)絡(luò)標準,例如HTML,XML,SOAP等?,F(xiàn)存的開發(fā)工具往往都是早于Internet出現(xiàn)的,或者是在我們所熟知的網(wǎng)絡(luò)還處于孕育期時出現(xiàn)的。所以,它們一般無法很好地支持最新的網(wǎng)絡(luò)技術(shù)。

??? C#程序員可以在Microsoft.NET平臺上事半功倍的構(gòu)建應(yīng)用程序的擴展框架。C#包含了內(nèi)置的特性,使任何組件可以輕松轉(zhuǎn)化為XML網(wǎng)絡(luò)服務(wù),通過Internet被任何操作系統(tǒng)上運行的任何程序調(diào)用。更突出的是,XML網(wǎng)絡(luò)服務(wù)框架可以使現(xiàn)有的XML網(wǎng)絡(luò)服務(wù)對程序員來說就和C#對象一樣。這樣,程序員就可以方便地使用他們已有的面向?qū)ο蟮木幊碳记蓙黹_發(fā)利用現(xiàn)有的XML網(wǎng)絡(luò)服務(wù)。

???? 還有一些精細的特性,使得C#成為一流的網(wǎng)絡(luò)編程工具。例如,XML正逐漸成為在網(wǎng)絡(luò)上傳輸結(jié)構(gòu)化數(shù)據(jù)的標準。這種數(shù)據(jù)集合往往非常小。為提高性能,C#允許把XML數(shù)據(jù)直接映射到struct數(shù)據(jù)類型,而不是class。這樣對處理少量的數(shù)據(jù)非常有效。

??? 即使是專家級的C++程序員也常會犯一些最簡單的小錯誤--比如忘了初始化變量,但往往就是這些小錯誤帶來了難以預(yù)料的問題,有些甚至需要很長時間來尋找和解決。一旦一個程序作為產(chǎn)品來使用,就算最簡單的錯誤糾正起來也可能要付出極其昂貴的代價。C#的現(xiàn)代化設(shè)計能夠消除很多常見的C++編程錯誤。 例如:資源回收減輕了程序員內(nèi)存管理的負擔(dān);C#中變量由環(huán)境自動初始化;變量是類型安全的。這樣,程序員編寫與維護那些解決復(fù)雜商業(yè)問題的程序就更方便了。

更新軟件組件是一項很容易出錯的工作,因為代碼的修改可能無意間改變原有程序的語義。為協(xié)助開發(fā)者進行這項工作,C#為版本的更新提供內(nèi)在的支持。例如,方法重載必須顯式聲明。這樣可以防止編碼錯誤,保證版本更新的靈活性。還有一個相關(guān)的特性就是對接口和接口繼承的內(nèi)在支持。這些特性使得C#可以開發(fā)復(fù)雜的框架并且隨著時間不斷發(fā)展更新它。

??? 總體來說,這些特性使得開發(fā)程序項目的后續(xù)版本的過程更加健壯,從而減少后續(xù)版本的開發(fā)成本。

C#語言允許類型定義的,擴展的元數(shù)據(jù)。這些元數(shù)據(jù)可以應(yīng)用于任何對象。項目構(gòu)建者可以定義領(lǐng)域特有的屬性并把他們應(yīng)用于任何語言元素-類,接口等等。然后,開發(fā)人員可以編程檢查每個元素的屬性。這樣,很多工作都變得方便多了,比如編寫一個小工具來自動檢查每個類或接口是否被正確定義為某個抽象商業(yè)對象的一部分,或者只是創(chuàng)建一份基于對象的領(lǐng)域特有屬性的報表。定制的元數(shù)據(jù)和程序代碼之間的緊密對應(yīng)有助于加強程序的預(yù)期行為和實際實現(xiàn)的之間的對應(yīng)關(guān)系。

作為一種自動管理的,類型安全的環(huán)境,C#適合于大多數(shù)企業(yè)應(yīng)用程序。但實際的經(jīng)驗表明有些應(yīng)用程序仍然需要一些底層的代碼,要么是因為基于性能的考慮,要么是因為要與現(xiàn)有的應(yīng)用程序接口兼容。這些情況可能會迫使開發(fā)者使用C++,即使他們本身寧愿使用更高效的開發(fā)環(huán)境。C#采用以下對策來解決這一問題:內(nèi)置對組建對象模型(COM)和基于Windows的API的支持;允許有限制地使用純指針(Native Pointer)。

在C#中,每個對象都自動生成為一個COM對象。開發(fā)者不再需要顯式的實現(xiàn)IUnknown和其他COM接口.這些功能都是內(nèi)置的.類似的,C#可以調(diào)用現(xiàn)有的COM對象,無論它是由什么語言編寫的。

  C#包含了一個特殊的功能,使程序可以調(diào)用任何純API。在一段特別標記的代碼中,開發(fā)者可以使用指針和傳統(tǒng)C/C++特性,如手工的內(nèi)存管理和指針運算。這是其相對于其它環(huán)境的極大優(yōu)勢。這意味著C#程序員可以在原有的C/C++代碼的基礎(chǔ)上編寫程序,而不是徹底放棄那些代碼。無論是支持COM還是純API的調(diào)用,都是為了使開發(fā)者在C#環(huán)境中直接擁有必要的強大功能。

所以C#是一種現(xiàn)代的面向?qū)ο笳Z言。它使程序員快速便捷地創(chuàng)建基于Microsoft .NET平臺的解決方案。這種框架使C#組件可以方便地轉(zhuǎn)化為XML網(wǎng)絡(luò)服務(wù),從而使任何平臺的應(yīng)用程序都可以通過Internet調(diào)用它。C#增強了開發(fā)者的效率,同時也致力于消除編程中可能導(dǎo)致嚴重結(jié)果的錯誤。C#使C/C++程序員可以快速進行網(wǎng)絡(luò)開發(fā),同時也保持了開發(fā)者所需要的強大性和靈活性。

C#中,Image為源自?Bitmap??Metafile?的類提供功能的抽象基類,使用Image可以操作各種支持的圖片,如GIF,?BMP,?JPG?Image.FromFile()返回的是某個繼承自Image的具體類的對象,在這里,就是Bitmap或者Metafile其中之一。這Bitmap不僅僅對應(yīng)于bmp,其實只要是像素式的圖片格式(矢量格式不行),理論上都可以用Bitmap。由于Bitmap是忽略圖像格式的,所以,在本圖像處理的源代碼中,并沒有給出不同圖像格式轉(zhuǎn)換的代碼,我們所做的僅僅是創(chuàng)建一個Bitmap對象,用?Image.FromFile()方法載入圖像并保存到我們所創(chuàng)建的Bitmap對象中即可。對載入圖像,我們可以使用SystemDrawing命名空間里提供的Getpixel方法提取像素的RGB值來進行處理。

2.1 BMP圖像

2.1 BMP圖像的基本介紹

如今Windows(3.x以及95,98,NT)系列已經(jīng)成為絕大多數(shù)用戶使用的操作系統(tǒng),它比DOS成功的一個重要因素是它可視化的漂亮界面。那么Windows是如何顯示圖象的呢?這就要談到位圖(bitmap)。

在 Windows 3.0 以前,Windows系統(tǒng)用的是DDB(設(shè)備有關(guān)位圖)。DDB沒有調(diào)色板,顯示的顏色依賴硬件,處理色彩很不方便。所以 Microsoft 在 Windows 3.0中 重新定義了BMP文件格式(BMP 3.0),使其支持設(shè)備無關(guān)位圖——也就是DIB。時至今日,BMP的版本號已升至5.0(Windows NT 4.0、Windows95 定義了 BMP 4.0,Windows 98、Windows 2000 定義了 BMP 5.0),但基本結(jié)構(gòu)沒有變——仍是 BMP文件頭 和 DIB 組成。

Windows 3.1以上版本提供了對設(shè)備無關(guān)位圖DIB的支持。DIB位圖可以在不同的機器或系統(tǒng)中顯示位圖所固有的圖像。與DDB相比而言,DIB是一種外部的位圖格式,經(jīng)常存儲為以BMP為后綴的位圖文件(有時也以DIB為后綴)。DIB位圖還支持圖像數(shù)據(jù)的壓縮。與Windows DIB結(jié)構(gòu)相似,但不完全相同的另一種DIB是OS/2采用的DIB。

DIB位圖的位數(shù)據(jù)緊跟在顏色表后面。數(shù)據(jù)可以是不壓縮的,也可以是壓縮的。對4位和8位位圖,可以采用RLE(游程長度編碼)壓縮,分別稱為RLE4和RLE8位圖。

位數(shù)據(jù)以行為單位存儲,每行都被填充到一個四字節(jié)邊界,即每行所占的存儲長度總是四字節(jié)(32位)的倍數(shù),不足時將多余位用0填充。位圖行的存儲次序是顛倒的,即位圖文件中第一行數(shù)據(jù)對應(yīng)的是位圖的最底行。對于像素位數(shù)為1的DIB位圖,其每個像素只占1位,每個字節(jié)存儲八個像素。字節(jié)的最高位對應(yīng)于最左邊的像素。在沒有壓縮的像素位數(shù)為4的DIB位圖中,每個字節(jié)存儲兩個像素,高四位對應(yīng)于最左邊的像素,每行填充到一個四字節(jié)邊界。采用RLE編碼壓縮的四位DIB由一系列組組成。有三種類型的組:重復(fù)組、文字組和特殊組。重復(fù)組由兩個字節(jié)組成,第一個字節(jié)表示像素個數(shù),第二個字節(jié)表示一對像素的值。文字組由一個0字節(jié)、一個像素計數(shù)字節(jié)和文字像素字節(jié)組成。像素計數(shù)值必須至少為3(小于3時,可采用重復(fù)組編碼),文字像素應(yīng)填充到一個偶數(shù)字節(jié)邊界。特殊組中,00 00表示一行的結(jié)束,00 01表示位圖的結(jié)束,00 02 xx yy表示位置增量,即圖像向右走xx個像素,向下走yy個像素。

在沒有壓縮的像素位數(shù)為8的DIB位圖中,每個字節(jié)存儲一個像素,每行填充到一個四字節(jié)邊界。采用R LE編碼壓縮的四位DIB由一系列組組成。有三種類型的組:重復(fù)組、文字組和特殊組。重復(fù)組內(nèi)兩個字節(jié)組成,第一個字節(jié)表示像素個數(shù),第二個字節(jié)表示像素值。文字組由一個0字節(jié)、一個像素計數(shù)字節(jié)和文字像素字節(jié)組成。像素計數(shù)值必須至少為3(小于3時,可采用重復(fù)組編碼),文字像素應(yīng)填充到一個偶數(shù)字節(jié)邊界。特殊組中,00 00表示一行的結(jié)束,00 01表示位圖的結(jié)束,0002xx yy表示位置增量,即圖像向右走xx個像素, 向下走yy個像素。在像素位數(shù)為24的DIB位圖中,每個像素占三字節(jié),從左到右的每一字節(jié)分別存儲藍、綠、紅的顏色值。每行用0填充到一個四字節(jié)邊界。

OS/2 DIB和Windows DIB的主要區(qū)別是位圖信息結(jié)構(gòu)(信息頭結(jié)構(gòu)和顏色表結(jié)構(gòu))不同。而它們的圖像位數(shù)據(jù)的存儲方式是完全一樣的。

我們知道,普通的顯示器屏幕是由許許多多點構(gòu)成的,我們稱之為象素。顯示時采用掃描的方法:電子槍每次從左到右掃描一行,為每個象素著色,然后從上到下這樣掃描若干行,就掃過了一屏。為了防止閃爍,每秒要重復(fù)上述過程幾十次。例如我們常說的屏幕分辨率為640×480,刷新頻率為70Hz,意思是說每行要掃描640個象素,一共有480行,每秒重復(fù)掃描屏幕70次。我們稱這種顯示器為位映象設(shè)備。所謂位映象,就是指一個二維的象素矩陣,而位圖就是采用位映象方法顯示和存儲的圖象。舉個例子,圖1.1是一幅普通的黑白位圖,圖1.2是被放大后的圖,圖中每個方格代表了一個象素。我們可以看到:整個骷髏就是由這樣一些黑點和白點組成的。在設(shè)計中,我們也是對圖像的像元進行處理的。

? ??而自然界中的所有顏色都可以由紅、綠、藍(R,G,B)組合而成。有的顏色含有紅色成分多一些,如深紅;有的含有紅色成分少一些,如淺紅。針對含有紅色成分的多少,可以分成0到255共256個等級,0級表示不含紅色成分;255級表示含有100%的紅色成分。同樣,綠色和藍色也被分成256級。這種分級概念稱為量化。這樣,根據(jù)紅、綠、藍各種不同的組合我們就能表示出256×256×256,約1600萬種顏色。這么多顏色對于我們?nèi)搜蹃碚f已經(jīng)足夠豐富了。

常見顏色的RGB組合值

顏色?? R? ?? G?? ?? B

紅? ?? 255 ?? 0?? ?? 0

藍? ??? 0? ? 255? ?? 0

綠? ??? 0? ?? 0?? ? 255

黃? ?? 255?? 255? ?? 0

紫? ?? 255 ?? 0?? ? 255

青? ? ??0? ? 255? ? 255

白? ?? 255 ? 255? ? 255

黑? ??? 0? ?? 0?? ?? 0

灰? ?? 128 ? 128? ? 128

當(dāng)一幅圖中每個象素賦予不同的RGB值時,能呈現(xiàn)出五彩繽紛的顏色了,這樣就形成了彩色圖。

圖象數(shù)據(jù)就是該象素顏在調(diào)色板中的索引值。對于真彩色圖,圖象數(shù)據(jù)就是實際的R、G、B值。對于2色位圖,用1位就可以表示該象素的顏色(一般0表示黑,1表示白),所以一個字節(jié)可以表示8個象素。對于16色位圖,用4位可以表示一個象素的顏色,所以一個字節(jié)可以表示2個象素。對于256色位圖,一個字節(jié)剛好可以表示1個象素。對于真彩色圖,三個字節(jié)才能表示1個象素。

要注意兩點:

? (1)每一行的字節(jié)數(shù)必須是4的整倍數(shù),如果不是,則需要補齊。這在前面介紹biSizeImage時已經(jīng)提到了。

? (2)一般來說,.bMP文件的數(shù)據(jù)從下到上,從左到右的。也就是說,從文件中最先讀到的是圖象最下面一行的左邊第一個象素,然后是左邊第二個象素……接下來是倒數(shù)第二行左邊第一個象素,左邊第二個象素……依次類推,最后得到的是最上面一行的最右一個象素。

? Windows操作系統(tǒng)統(tǒng)一管理著諸如顯示,打印等操作,將它們看作是一個個的設(shè)備,每一個設(shè)備都有一個復(fù)雜的數(shù)據(jù)結(jié)構(gòu)來維護。所謂設(shè)備上下文就是指這個數(shù)據(jù)結(jié)構(gòu)。然而,我們不能直接和這些設(shè)備上下文打交道,只能通過引用標識它的句柄(實際上是一個整數(shù)),讓W(xué)indows去做相應(yīng)的處理。

2.2? 圖像的讀取

? ??圖像讀取主要方法是利用OpenFileDialog(文件打開控件)獲得打開圖像的絕對路徑,用System.Drawing里Bitmap.FromFile方法將所獲得的圖像轉(zhuǎn)換成DIB并加載到內(nèi)存中,同時將加載的圖像復(fù)制到pictureBox1圖像框中。

private void menuItem2_Click(object sender, System.EventArgs e)

{

OpenFileDialog imageopen = new OpenFileDialog();

imageopen.Title = "請打開圖像文件" ;

imageopen.InitialDirectory = @"c:/" ;

imageopen.Filter = "(圖像文件)*.bmp;jepg;jpg;gif;png|*.bmp;*.jepg;*.jpg;*.gif;*.png" ;

imageopen.FilterIndex = 1 ;

imageopen.RestoreDirectory = true ;

if(imageopen.ShowDialog() == DialogResult.OK)

{

filepath=imageopen.FileName;

this.progressBar1.Value=20;

this.pictureBox1.Image=System.Drawing.Bitmap.FromFile(filepath);

}

this.pictureBox2.Image=null;

}?

3? 灰度直方圖

3.1灰度直方圖的基本概念

從某種角度上來講,圖像處理是基于統(tǒng)計學(xué)概念上的,所以,為了能夠?qū)D像變成計算機所能夠識別并處理的數(shù)據(jù),我們必須對圖像進行量化,使得我們能從數(shù)值概念上獲得對圖像的映像。這里,我們引入灰度圖像的概念:灰度圖像是一種具有從黑到白256級灰度色域或等級的單色圖像。該圖像中的每個像素用8位數(shù)據(jù)表示,因此像素點值介于黑白間的256種灰度中的一種。該圖像只有灰度等級,而沒有顏色的變化。這樣,我們可以將圖像的RGB屬性歸一為灰度屬性,由此就可以方便我們對圖像進行處理。

3.2? 如何獲取灰度直方圖

首先我們應(yīng)該清楚的是灰度直方圖是一個從0-255范圍變化的步長為一的數(shù)組,數(shù)組的每一個元素對應(yīng)的是每一個灰度值。在這里,我們首先定義了一個int型數(shù)組,數(shù)組的大小為256,數(shù)組名為Histogram。其中,Histogram[i]對應(yīng)得是灰度為i的像素的個數(shù)。

在這里,我們使用的計算灰度的算法為Gray=(int)(0.3*r+0.59*g+0.11*b)。其中,r,g,b分別為所處理像素的RGB值。算法的源代碼如下:

private void menuItem24_Click(object sender, System.EventArgs e)

?????? {

?????????? ??? int height=this.pictureBox1.Image.Height;

????????????? int width=this.pictureBox1.Image.Width;

????????????? Bitmap process=(Bitmap)this.pictureBox1.Image;

????????????? Color pixel;

????????????? int? [] Histogram=new int[256];

????????????? int Times,Gray,r,g,b;

????????????? for (i=0;i<=255;i++)

????????????? {

????????????????? Histogram[i]=0;

????????????? }

????????????? for(i=0;i<width;i++)

????????????? {

????????????????? for(j=0;j<height;j++)

????????????????? {

???????????????????? pixel=process.GetPixel(i,j);

???????????????????? r=pixel.R;

???????????????????? g=pixel.G;

???????????????????? b=pixel.B;

???????????????????? Gray=(int)(0.3*r+0.59*g+0.11*b);

???????????????????? Histogram[Gray]=Histogram[Gray]+1;

????????????????? }

????????????? }

?????? }

下圖為對某一圖像處理后所獲得的灰度直方圖,從該圖中我們可以獲得一個圖像的灰度分布的直觀映像。

4???????? 圖象的幾何變換

4.1平移

平移(translation)變換大概是幾何變換中最簡單的一種了。如下圖,初始坐標為(x0,y0)的點經(jīng)過平移(tx,ty)(以向右,向下為正方向)后,坐標變?yōu)?x1,y1)。這兩點之間的關(guān)系是x1=x0+tx ,y1=y0+ty。

如下圖所示

?

以矩陣的形式表示為

?

我們更關(guān)心的是它的逆變換:

?

這是因為:我們想知道的是平移后的圖象中每個象素的顏色。例如我們想知道,新圖中左上角點的RGB值是多少?很顯然,該點是原圖的某點經(jīng)過平移后得到的,這兩點的顏色肯定是一樣的,所以只要知道了原圖那點的RGB值即可。那么到底新圖中的左上角點對應(yīng)原圖中的哪一點呢?將左上角點的坐標(0,0)入公式(2.2),得到x0=-tx ,y0=-ty;所以新圖中的(0,0)點的顏色和原圖中(-tx , -ty)的一樣。這樣就存在一個問題:如果新圖中有一點(x1,y1),按照公式(2.2)得到的(x0,y0)不在原圖中該怎么辦?通常的做法是,把該點的RGB值統(tǒng)一設(shè)成(0,0,0)或者(255,255,255)。

4.2旋轉(zhuǎn)

旋轉(zhuǎn)(rotation)有一個繞著什么轉(zhuǎn)的問題,通常的做法是以圖象的中心為圓心旋轉(zhuǎn)。在我們熟悉的坐標系中,將一個點順時針旋轉(zhuǎn)a角后的坐標變換公式,如下圖所示,r為該點到原點的距離,在旋轉(zhuǎn)過程中,r保持不變;b為r與x軸之間的夾角。

?

旋轉(zhuǎn)前:x0=rcosb;y0=rsinb

旋轉(zhuǎn)a角度后:

x1=rcos(b-a)=rcosbcosa+rsinbsina=x0cosa+y0sina;

y1=rsin(b-a)=rsinbcosa-rcosbsina=-x0sina+y0cosa;

以矩陣的形式表示:

?

上面的公式中,坐標系xoy是以圖象的中心為原點,向右為x軸正方向,向上為y軸正方向。它和以圖象左上角點為原點o’,向右為x’軸正方向,向下為y’軸正方向的坐標系x’o’y’之間的轉(zhuǎn)換關(guān)系如何呢

?

設(shè)圖象的寬為w,高為h,容易得到:

?

逆變換為:

?

理解了上述理論基礎(chǔ),其實在C#中我們有現(xiàn)成的方法函數(shù)進行操作,我們可以利用Graphics對象所生成的g.RotateTransform方法函數(shù)來對圖像進行旋轉(zhuǎn)操作。圖像旋轉(zhuǎn)后我們還需要將旋轉(zhuǎn)所得到的圖像填充到指定的矩形區(qū)域中,在這里我們使用了g.FillRectangle方法函數(shù)來進行填充。

private void panel2_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

?????? {

????????????? this.panel2.Refresh();

????????????? Graphics g = e.Graphics;

????????????? int angel=Convert.ToInt16(this.numericUpDown4.Value);

????????????? System.Drawing.Bitmap temp=new Bitmap(filepath);

????????????? TextureBrush brush=new TextureBrush(temp);

????????????? g.RotateTransform(flaot(angel));??????? ??? g.FillRectangle(brush,0,0,this.ClientRectangle.Width,this.ClientRectangle.Height);

????????????? return;

?????? }

?4.3縮放

假設(shè)放大因子為ratio,(為了避免新圖過大或過小,我們在程序中限制0.25≤ratio≤4),縮放(zoom)的變換矩陣很簡單:

?

由于放大圖象時產(chǎn)生了新的象素,以及浮點數(shù)的操作,得到的坐標可能并不是整數(shù),這一點我們在介紹旋轉(zhuǎn)時就提到了。我們采用的做法是找與之最臨近的點。實際上,更精確的做法是采用插值(interpolation),即利用鄰域的象素來估計新的象素值。其實我們前面的做法也是一種插值,稱為最鄰近插值(Nearest Neighbour Interpolation)。下面先介紹線形插值(Linear Interpolation)。

線形插值使用原圖中兩個值來構(gòu)造所求坐標處的值。舉一個一維的例子。下圖所示,如果已經(jīng)知道了兩點x0,x2處的函數(shù)值f(x0),f(x2),現(xiàn)在要求x1處的函數(shù)值f(x1)。我們假設(shè)函數(shù)是線形的,利用幾何知識可以知道

f(x1)=(f(x2)-f(x0))(x1-x0)/(x2-x0)+f(x0)

在圖象處理中需要將線形插值擴展到二維的情況,即采用雙線形插值(Bilinear Intrepolation),?

線形插值的示意圖

?

?? 雙線形插值的示意圖

已知a、b、c、d四點的灰度,要求e點的灰度,可以先在水平方向上由a,b線形插值求出g、c、d線形插值求出f,然后在垂直方向上由g,f線形插值求出e。

線形插值基于這樣的假設(shè):原圖的灰度在兩個象素之間是線形變化的。一般情況下,這種插值的效果還不錯。更精確的方法是采用曲線插值(Curvilinear Interpolation),即認為象素之間的灰度變化規(guī)律符合某種曲線,但這種處理的計算量是很大的。

同樣的,我們可以利用Graphics對象所生成的g.FillRectangle方法函數(shù)來對圖像進行縮放操作。圖像縮放后我們還需要將縮放所得到的圖像填充到指定的矩形區(qū)域中,同樣在這里我們使用了g.FillRectangle方法函數(shù)來進行填充。

private void panel2_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

?????? {

?????????? this.panel2.Refresh();

????????????? Graphics g = e.Graphics;

????????????? float fx=(float)(this.numericUpDown1.Value/10);

????????????? float fy=(float)(this.numericUpDown2.Value/10);

????????????? System.Drawing.Bitmap temp=new Bitmap(filepath);

????????????? TextureBrush brush=new TextureBrush(temp);

????????????? g.ScaleTransform(fx,fy);

?????????? ??? g.FillRectangle(brush,0,0,this.ClientRectangle.Width,this.ClientRectangle.Height);

????????????? checkscale=0;

?????? }

5 簡單圖像處理

5.1? 黑白處理:

彩色圖像黑白化處理通常有三種方法:最大值法、平均值法、加權(quán)平均值法
三種方法的原理
??????? 最大值法:最大值法是每個像素點的RGB值等于原像素點的RGB值中最大的一個,即R=G=B=MAX( R,G,B ); 效果,最大值發(fā)產(chǎn)生亮度很高的黑白圖像。
??????? 平均值法:平均值法使每個像素點的RGB值等于原像素點的RGB值的平均值,即R=G=B=(R+G+B)/3?
??????? 加權(quán)平均法:加權(quán)平均法根據(jù)需要指定每個像素點RGB的權(quán)數(shù),并取其加權(quán)平均值,即R=G=B=(Wr*R+Wg*G+Wb*B )/3?。Wr、Wg、Wb表示RGB的權(quán)數(shù),均大于零,通過取不同的權(quán)數(shù)可實現(xiàn)不同的效果。

? 本程序中采用的是平均值法來處理圖像:

private void menuItem20_Click(object sender, System.EventArgs e)

?????? {

?????????? if(this.pictureBox1.Image!=null)

?????????? {

????????????? this.pictureBox2.Visible=true;

????????????? int height=this.pictureBox1.Image.Height;

????????????? int width=this.pictureBox1.Image.Width;

????????????? Bitmap temp=new Bitmap(width,height);

????????????? Bitmap process=(Bitmap)this.pictureBox1.Image;

????????????? Color pixel;

????????????? for( int x=0;x<width;x++)

????????????? {

????????????????? for(int y=0;y<height;y++)

????????????????? {

???????????????????? int r,g,b,t;

???????????????????? pixel=process.GetPixel(x,y);

???????????????????? t=(pixel.R+pixel.G+pixel.B)/3;

?????????? ?????????? r=t;

???????????????????? g=t;

???????????????????? b=t;

???????????????????? temp.SetPixel(x,y,Color.FromArgb(r,g,b));

????????????????? }

????????????? }

????????????? this.pictureBox2.Image=temp;

?????????? }

?????? }?????

?

5.2? 浮雕處理

浮雕效果就是只將圖像的變化部分突出出來,而相同顏色部分則被淡化,使圖像出現(xiàn)縱深感,從而達到浮雕效果,這里采用的算法是將要處理的像素取值為與處于對角線上的另一個像素間的差值,這樣只有顏色變化區(qū)才會出現(xiàn)色彩,而顏色平淡區(qū)因差值幾乎為零則變成黑色。

???? ??? private void menuItem21_Click(object sender, System.EventArgs e)

?????? {

?????????? if(this.pictureBox1.Image!=null)

?????????? {

????????????? this.pictureBox2.Visible=true;

????????????? int height=this.pictureBox1.Image.Height;

????????????? int width=this.pictureBox1.Image.Width;

????????????? Bitmap temp=new Bitmap(width,height);

????????????? Bitmap process=(Bitmap)this.pictureBox1.Image;

????????????? Color pixel,pixelnext;

????????????? for( int x=0;x<width-1;x++)

????????????? {

????????????????? this.progressBar1.Value=(int)(((float)x/(float)width)*100);

????????????????? for(int y=0;y<height-1;y++)

????????????????? {

?????????????????

???????????????????? int r,g,b;

???????????????????? pixel=process.GetPixel(x,y);

???????????????????? pixelnext=process.GetPixel(x+1,y+1);

???????????????????? r=pixel.R-pixelnext.R+128;

???????????????????? b=pixel.B-pixelnext.B+128;

???????????????????? g=pixel.G-pixelnext.G+128;

???????????????????? r=Judge(r);

???????????????????? g=Judge(g);

???????????????????? b=Judge(b);

?????? ????????????? temp.SetPixel(x,y,Color.FromArgb(r,g,b));

????????????????? }

????????????? }

????????????? this.pictureBox2.Image=temp;

?????????? }

5.2? 反色處理

反色的實際含義是將R、G、B值反轉(zhuǎn)。若顏色的量化級別是256,則新圖的R、G、B值為255減去原圖的R、G、B值。這里針對的是所有圖,包括真彩圖、帶調(diào)色板的彩色圖(又稱為偽彩色圖)、和灰度圖。

private void menuItem22_Click(object sender, System.EventArgs e)

?????? {

?????????? if(this.pictureBox1.Image!=null)

?????????? {

????????????? this.pictureBox2.Visible=true;

????????????? int height=this.pictureBox1.Image.Height;

????????????? int width=this.pictureBox1.Image.Width;

????????????? Bitmap temp=new Bitmap(width,height);

????????????? Bitmap process=(Bitmap)this.pictureBox1.Image;

????????????? Color pixel;

????????????? for( int x=0;x<width;x++)

????????????? {

????????????????? this.progressBar1.Value=(int)(((float)x/(float)width)*100);

????????????????? for(int y=0;y<height;y++)

????????????????? {

???????????????????? int r,g,b;

???????????????????? pixel=process.GetPixel(x,y);

???????????????????? r=255-pixel.R;

???????????????????? g=255-pixel.G;

???????????????????? b=255-pixel.B;

???????????????????? temp.SetPixel(x,y,Color.FromArgb(r,g,b));

????????????????? }

????????????? }

????????????? this.pictureBox2.Image=temp;

?????????? }

?????? }

6圖象的輪廓提取

圖像的邊緣(輪廓)是圖像最基本的特征。所謂邊緣(或邊沿)是指其周圍象素灰度有階躍 變化或“屋頂”變化的那些象素的集合。邊緣廣泛存在于物體與背景之間、物體與物體之間、基元與基元之間。因此,它是圖像分割依賴的重要特征。

物體的邊緣是由灰度不連續(xù)性形成的。經(jīng)典的邊緣提取方法是考察圖像的每個象素在某個鄰域內(nèi)灰度的變化,利用邊緣鄰近一階或二階方向?qū)?shù)變化規(guī)律,用簡單的方法檢測邊緣。這種方法稱為邊緣檢測局部算子法。如果一個象素落在圖像中某一個物體的邊界上,那么他 的鄰域?qū)⒊蔀橐粋€灰度級的變化帶。對這種變化最有用的2個特征:灰度的變化率和方向, 他們分別以梯度向量的幅度和方向來表示。邊緣檢測算子檢查每個象素的鄰域并對灰度變化率進行量化,也包括方向的確定。常用的檢測算子有Roerts算子、Sobel算子、Prewitt 算子和 Kirsh 算子等。

我們給出一個模板 和一幅圖象 。不難發(fā)現(xiàn)原圖中左邊暗,右邊亮,中間存在著一條明顯的邊界。進行模板操作后的結(jié)果如下: 。

可以看出,第3、4列比其他列的灰度值高很多,人眼觀察時,就能發(fā)現(xiàn)一條很明顯的亮邊,其它區(qū)域都很暗,這樣就起到了邊沿檢測的作用。為什么會這樣呢?仔細看看那個模板就明白了,它的意思是將右鄰點的灰度值減左鄰點的灰度值作為該點的灰度值。在灰度相近的區(qū)域內(nèi),這么做的結(jié)果使得該點的灰度值接近于0;而在邊界附近,灰度值有明顯的跳變,這么做的結(jié)果使得該點的灰度值很大,這樣就出現(xiàn)了上面的結(jié)果。這種模板就是一種邊沿檢測器,它在數(shù)學(xué)上的涵義是一種基于梯度的濾波器,又稱邊沿算子,你沒有必要知道梯度的確切涵義,只要有這個概念就可以了。梯度是有方向的,和邊沿的方向總是正交(垂直)的,例如,對于上面那幅圖象的轉(zhuǎn)置圖象,邊是水平方向的,我們可以用梯度是垂直方向的模板 檢測它的邊沿。

例如,一個梯度為45度方向模板 ,可以檢測出135度方向的邊沿。

6 .1Sobel算子輪廓提取:

在邊沿檢測中,常用的一種模板是Sobel 算子。Sobel 算子有兩個,一個是檢測水平邊沿的 ;另一個是檢測垂直平邊沿的 。與 相比,Sobel算子對于象素的位置的影響做了加權(quán),因此效果更好。

Sobel算子另一種形式是各向同性Sobel(Isotropic Sobel)算子,也有兩個,一個是檢測水平邊沿的 ,另一個是檢測垂直平邊沿的 。各向同性Sobel算子和普通Sobel算子相比,它的位置加權(quán)系數(shù)更為準確,在檢測不同方向的邊沿時梯度的幅度一致。由于建筑物圖像的特殊性,我們可以發(fā)現(xiàn),處理該類型圖像輪廓時,并不需要對梯度方向進行運算,所以程序并沒有給出各向同性Sobel算子的處理方法。下面的兩幅圖中,下左圖為原圖;下右圖為Sobel算子處理后的結(jié)果圖??梢钥闯?/span>Sobel算子確實把圖象中的邊沿提取了出來。

?????????????????????? ?

原圖?????????????? ? ???????????????Sobel算子處理后的結(jié)果圖

? ??由于Sobel算子是濾波算子的形式,用于提取邊緣,可以利用快速卷積函數(shù), 簡單有效,因此應(yīng)用廣泛。美中不足的是,Sobel算子并沒有將圖像的主體與背景嚴格地區(qū)分開來,換言之就是Sobel算子沒有基于圖像灰度進行處理,由于Sobel算子沒有嚴格地模擬人的視覺生理特征,所以提取的圖像輪廓有時并不能令人滿意。? 在觀測一幅圖像的時候,我們往往首先注意的是圖像與背景不同的部分,正是這個部分將主體突出顯示,基于該理論,我們給出了下面閾值化輪廓提取算法,該算法已在數(shù)學(xué)上證明當(dāng)像素點滿足正態(tài)分布時所求解是最優(yōu)的。

6 .2閾值化提取:

閾值化(thresholding)可以看作是削波的一個特例,我們用下圖說明閾值化的原理。

?

閾值化的原理

不難看出,只要令削波中的g1old=g2old就實現(xiàn)了閾值化。閾值就象個門檻,比它大就是白,比它小就是黑。經(jīng)過閾值化處理后的圖象變成了黑白二值圖,所以說閾值化是灰度圖轉(zhuǎn)二值圖的一種常用方法(我們以前介紹過圖案化和抖動的方法)。進行閾值化只需給出閾值點g1old即可。一般情況下,閾值的選取對程序執(zhí)行結(jié)果有很大的影響,在本程序中采取的是直方圖求門限,迭代法求最佳閾值的方法,這個方法在數(shù)學(xué)上已被證明當(dāng)圖像像素概率分布逼近正態(tài)分布時是最佳的。閾值化處理后的結(jié)果,是一幅二值圖像

?

閾值化處理后的結(jié)果

在這里,閾值的選取是很重要的,閾值如果過高,就會產(chǎn)生將圖像主體誤認為是背景的情況;閾值如果過低,則會將背景部分誤認為是主體部分。因此,我們應(yīng)該仔細選擇閾值,我認為閾值不應(yīng)該是一個固定的值,它的值應(yīng)該隨著圖像的不同而不同。在本程序中,采取了動態(tài)求取閾值的方法。首先我們先求得被處理圖像的灰度直方圖,根據(jù)直方圖求得最大灰度與最小灰度。我們設(shè)置閾值的初值為最大灰度與最小灰度值之和的一半。然后求得小于閾值部分灰度的平均值iMean1Gray和大于閾值部分的平均值iMean2Gray,將閾值重新設(shè)為這兩個灰度均值 的一半,如此迭代,最后求得最佳閾值iThreshold。實驗結(jié)果證明該閾值是可信的,基本上可以把主體與背景區(qū)分開來。求閾值的代碼如下:

for(Times=0;Times<128&&iThreshold!=iNewThreshold;Times++)

?????????? {

?????????? ??? iThreshold=iNewThreshold;

????????????? lP1=0;

????????????? lP2=0;

????????????? lS1=0;

????????????? lS2=0;

????????????? for(i=iMinGray;i<iThreshold;i++)

????????????? {

????????????????? lP1+=Histogram[i]*i;

????????????????? lS1+=Histogram[i];

????????????? }

????????????? iMean1Gray=lP1/lS1;

????????????? for(i=iThreshold;i<iMaxGray;i++)

????????????? {

????????????????? lP2+=Histogram[i]*i;

????????????????? lS2+=Histogram[i];

????????????? }

????????????? iMean2Gray=lP2/lS2;

????????????? iNewThreshold=(iMean1Gray+iMean2Gray)/2;

????????? }

6 .3? Robert算子輪廓提取

Roberts邊緣檢測算子是一種利用局部差分算子尋找邊緣的算子

?

????????????????? ???Robert算子輪廓提取結(jié)果

可以看出,圖像處理后結(jié)果邊緣不是很平滑。經(jīng)分析,由于Robert算子通常會在圖像邊緣附近的區(qū)域內(nèi) 產(chǎn)生較寬的響應(yīng),故采用上述算子檢測的邊緣圖像常需做細化處理,邊緣定位的精度不是很高。

private void menuItem23_Click(object sender, System.EventArgs e)

?????? {

?????????? if(this.pictureBox1.Image!=null)

?????????? {

????????????? this.pictureBox2.Visible=true;

????????????? int height=this.pictureBox1.Image.Height;

????????????? int width=this.pictureBox1.Image.Width;

????????????? Bitmap temp=new Bitmap(width,height);

????????????? Bitmap process=(Bitmap)this.pictureBox1.Image;

????????????? int i,j,p0,p1,p2,p3;

????????????? Color [] pixel=new Color[4];

????????????? int result;

????????????? for(j=height-2;j>0;j--)

????????????? {

????????????????? for(i=0;i<width-2;i++)

????????????????? {

????????????????? ??? pixel[0]=process.GetPixel(i,j);

???????????????????? pixel[1]=process.GetPixel(i,j+1);

???????????????????? pixel[2]=process.GetPixel(i+1,j);

???????????????????? pixel[3]=process.GetPixel(i+1,j+1);

???????????????????? p0=(int)(0.3*pixel[0].R+0.59*pixel[0].G+0.11*pixel[0].B);

???????????????????? p1=(int)(0.3*pixel[1].R+0.59*pixel[1].G+0.11*pixel[1].B);

???????????????????? p2=(int)(0.3*pixel[2].R+0.59*pixel[2].G+0.11*pixel[2].B);

???????????????????? p3=(int)(0.3*pixel[3].R+0.59*pixel[3].G+0.11*pixel[3].B);

???????????????????? result=(int)Math.Sqrt((p0-p3)*(p0-p3)+(p1-p2)*(p1-p2));

???????????????????? if (result>255)

???????????????????????? result=255;

???????????????????? if (result<0)

???????????????????????? result=0;

???????????????????? temp.SetPixel(i,j,Color.FromArgb(result,result,result));

????????????????? }

????????????? }

????????????? this.pictureBox2.Image=temp;

?????????? }

?????? }

6程序運行

6 .1 程序運行主界面

?

6 .2 相關(guān)功能介紹

在文件菜單下,可以實現(xiàn)圖像的打開,保存,程序的退出等功能。

?

編輯菜單下可以將操作結(jié)果欄的圖像復(fù)制到緩存中

?

視圖菜單下可實現(xiàn)程序的所有圖像處理功能,并可以將被處理圖像轉(zhuǎn)換為源圖像。

?

窗口欄可將操作結(jié)果的圖像關(guān)閉。

?

程序處理圖像的結(jié)果如下圖所示,左邊為被處理圖像,右邊為處理結(jié)果圖像。

?

結(jié)? 論

數(shù)字圖像處理主要研究的內(nèi)容有以下幾個方面: (1) 圖像變換 由于圖像陣列很大,直接在空間域中進行處理,涉及計算量很大。因此,往往采用各種圖像變換的方法,如傅立葉變換、沃爾什變換、離散余弦變換等間接處理技術(shù),將空間域的處理轉(zhuǎn)換為變換域處理,不僅可減少計算量,而且可獲得更有效的處理(如傅立葉變換可在頻域中進行數(shù)字濾波處理)。(2) 圖像編碼壓縮 圖像編碼壓縮技術(shù)可減少描述圖像的數(shù)據(jù)量(即比特數(shù)),以便節(jié)省圖像傳輸、處理時間和減少所占用的存儲器容量。壓縮可以在不失真的前提下獲得,也可以在允許的失真條件下進行。編碼是壓縮技術(shù)中最重要的方法,它在圖像處理技術(shù)中是發(fā)展最早且比較成熟的技術(shù)。(3) 圖像增強和復(fù)原圖像增強和復(fù)原的目的是為了提高圖像的質(zhì)量,如去除噪聲,提高圖像的清晰度等。圖像增強不考慮圖像降質(zhì)的原因,突出圖像中所感興趣的部分。如強化圖像高頻分量,可使圖像中物體輪廓清晰,細節(jié)明顯;如強化低頻分量可減少圖像中噪聲影響。圖像復(fù)原要求對圖像降質(zhì)的原因有一定的了解,一般講應(yīng)根據(jù)降質(zhì)過程建立"降質(zhì)模型",再采用某種濾波方法,恢復(fù)或重建原來的圖像。(4) 圖像分割 圖像分割是數(shù)字圖像處理中的關(guān)鍵技術(shù)之一。圖像分割是將圖像中有意義的特征部分提取出來,其有意義的特征有圖像中的邊緣、區(qū)域等,這是進一步進行圖像識別、分析和理解的基礎(chǔ)。雖然目前已研究出不少邊緣提取、區(qū)域分割的方法,但還沒有一種普遍適用于各種圖像的有效方法。因此,對圖像分割的研究還在不斷深入之中,是目前圖像處理中研究的熱點之一,這個同時也是本設(shè)計的重中之重。(5) 圖像描述 圖像描述是圖像識別和理解的必要前提。作為最簡單的二值圖像可采用其幾何特性描述物體的特性,一般圖像的描述方法采用二維形狀描述,它有邊界描述和區(qū)域描述兩類方法。對于特殊的紋理圖像可采用二維紋理特征描述.(6) 圖像分類(識別)屬于模式識別的范疇,其主要內(nèi)容是圖像經(jīng)過某些預(yù)處理(增強、復(fù)原、壓縮)后,進行圖像分割和特征提取,從而進行判決分類。圖像分類常采用經(jīng)典的模式識別方法,有統(tǒng)計模式分類和句法(結(jié)構(gòu))模式分類,近年來新發(fā)展起來的模糊模式識別和人工神經(jīng)網(wǎng)絡(luò)模式分類在圖像識別中也越來越受到重視

總結(jié)

以上是生活随笔為你收集整理的C#图像处理基础概念知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。