圖像處理本科畢業(yè)論文_第1頁
圖像處理本科畢業(yè)論文_第2頁
圖像處理本科畢業(yè)論文_第3頁
圖像處理本科畢業(yè)論文_第4頁
圖像處理本科畢業(yè)論文_第5頁
已閱讀5頁,還剩83頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

沈陽理工大學(xué)學(xué)士學(xué)位論文PAGEIV摘要本文以VC++6.0做為編程語言,對圖像降噪技術(shù)進(jìn)行研究。本文通過介紹位圖的基本操作以及在圖像中加入椒鹽噪聲的操作,從而進(jìn)一步引出幾種降噪方法。本文分別介紹“均值濾波”、“中值濾波”以及“傅里葉降噪”和“小波降噪”四種算法,實(shí)現(xiàn)圖像降噪。詳細(xì)介紹了其基本原理、實(shí)現(xiàn)方法以及具體算法,并對降噪效果加以比較與分析?!熬禐V波”把每個像素都用周圍的8個像素來做均值操作,可以平滑圖像,速度快,算法簡單?!爸兄禐V波”是常用的非線性濾波方法,也是圖像處理技術(shù)中最常用的預(yù)處理技術(shù)。同時在“低通濾波”及“小波降噪”中分別引入“快速傅里葉變換”和“Mallat算法”,使得其取得更快速的計(jì)算,有效地解決了其計(jì)算量太大,運(yùn)算時間過長的弊端,從而達(dá)到更好的綜合降噪效果。 關(guān)鍵詞:圖像降噪;濾波;傅里葉降噪;小波降噪

AbstractTakingVC++6.0astheprogramminglanguage,thispaperisastudyaboutimagenoisereductiontechnology.Furthermore,introducingseveralnoisereducingmeasuresthroughtheintroductionofthebasicprocessingandtheoperationtoputthesaltandpeppernoiseintotheimage.ThepaperintroducesAveragingFilter,MedianFilter,FourierLowpassFilteringandWaveletFiltertoachieveimagenoisereducing.Hereweintroducethebasicprinciples,implementmethods,detailedarithmetic,andmakecomparisonandanalysisthenoisereducingeffects.AveragingFilteroperateseverypixelbyusing8pixelsmeanly.Itcanmaketheimagessmoothing,fastandeasytocalculate.MedianFilterFourierisacommonnonlinearfilteringwayandalsocommonpreprocessingtechniquewhenprocessingimages.IntroducingFFTandMallatAlgorithmseparatelyintoLowpassFilteringandWaveletFilter,andthenwecanmakefastercalculatingandsolvethemassivecalculatingmoreefficiently.Therefore,wecanhaveamoreeffectivenoisereducing.Keywords:ImageNoiseReduction;Filter;FourierFilter;Waveletfilter

畢業(yè)設(shè)計(jì)(論文)原創(chuàng)性聲明和使用授權(quán)說明原創(chuàng)性聲明本人鄭重承諾:所呈交的畢業(yè)設(shè)計(jì)(論文),是我個人在指導(dǎo)教師的指導(dǎo)下進(jìn)行的研究工作及取得的成果。盡我所知,除文中特別加以標(biāo)注和致謝的地方外,不包含其他人或組織已經(jīng)發(fā)表或公布過的研究成果,也不包含我為獲得及其它教育機(jī)構(gòu)的學(xué)位或?qū)W歷而使用過的材料。對本研究提供過幫助和做出過貢獻(xiàn)的個人或集體,均已在文中作了明確的說明并表示了謝意。作者簽名:日期:指導(dǎo)教師簽名:日期:使用授權(quán)說明本人完全了解大學(xué)關(guān)于收集、保存、使用畢業(yè)設(shè)計(jì)(論文)的規(guī)定,即:按照學(xué)校要求提交畢業(yè)設(shè)計(jì)(論文)的印刷本和電子版本;學(xué)校有權(quán)保存畢業(yè)設(shè)計(jì)(論文)的印刷本和電子版,并提供目錄檢索與閱覽服務(wù);學(xué)??梢圆捎糜坝?、縮印、數(shù)字化或其它復(fù)制手段保存論文;在不以贏利為目的前提下,學(xué)??梢怨颊撐牡牟糠只蛉績?nèi)容。作者簽名:日期:

目錄1緒論 11.1VC++6.0簡介 11.2數(shù)字圖像處理基本概念 11.3圖像降噪技術(shù)研究背景及意義 21.4圖像降噪的國內(nèi)外研究現(xiàn)狀 21.5關(guān)于圖像噪聲 22位圖操作基本知識 42.1CDIB類的介紹 42.2位圖操作 42.2.1圖像讀取 42.2.2圖像顯示 52.3程序源代碼 62.3.1圖像讀取 62.3.2圖像保存 83噪聲的添加 133.1基本原理 133.2實(shí)現(xiàn)步驟 133.3程序源代碼 133.3.1添加響應(yīng)函數(shù) 133.3.2添加成員函數(shù) 133.4輸出結(jié)果 164均值濾波 184.1基本原理 184.2 實(shí)現(xiàn)方法 184.3 程序源代碼 204.3.1添加響應(yīng)函數(shù) 204.3.2添加成員函數(shù) 204.4結(jié)果輸出及分析 234.4.1結(jié)果輸出 234.4.2結(jié)果分析 255中值濾波 265.1基本原理 265.2實(shí)現(xiàn)方法 265.3程序源代碼 265.3.1添加響應(yīng)函數(shù) 265.3.2添加成員函數(shù) 275.4結(jié)果輸出及分析 325.4.1結(jié)果輸出 325.4.2結(jié)果分析 336傅立葉降噪 346.1基本概念 346.1.1二維傅里葉變換 346.1.2二維離散傅里葉變換 346.1.3快速傅里葉變換 356.2相關(guān)原理 356.3程序源代碼 356.3.1快速傅里葉變換 366.3.2快速傅里葉逆變換 386.3.3低通濾波 406.4結(jié)果輸出及分析 436.4.1結(jié)果輸出 436.4.2結(jié)果分析 467小波降噪 477.1基本概念 477.1.1二維離散小波變換 477.2.2Mallat算法 487.2相關(guān)原理 497.3程序源代碼 507.3.1LPass_Filter函數(shù) 527.3.2HPass_Filter函數(shù) 537.3.3DWT_Inverse函數(shù) 557.4結(jié)果輸出及分析 567.4.1結(jié)果輸出 567.4.2結(jié)果分析 59結(jié)論 60致謝 61參考文獻(xiàn) 62附錄A英文原文 63附錄B中文翻譯 74PAGE821緒論1.1VC++6.0簡介VC++6.0是Microsoft公司推出的一個基于Windows系統(tǒng)平臺、可視化的集成開發(fā)環(huán)境,它的源程序按C++語言的要求編寫,并加入了微軟提供的功能強(qiáng)大的MFC(MicrosoftFoundationClass)類庫。MFC中封裝了大部分WindowsAPI函數(shù)和Windows控件,它包含的功能涉及到整個Windows操作系統(tǒng)。MFC不僅給用戶提供了Windows圖形環(huán)境下應(yīng)用程序的框架,而且還提供了創(chuàng)建應(yīng)用程序的組件,這樣,開發(fā)人員不必從頭設(shè)計(jì)創(chuàng)建和管理一個標(biāo)準(zhǔn)Windows應(yīng)用程序所需的程序,而是從一個比較高的起點(diǎn)編程,故節(jié)省了大量的時間。另外,它提供了大量的代碼,指導(dǎo)用戶編程時實(shí)現(xiàn)某些技術(shù)和功能。因此,使用VC++提供的高度可視化的應(yīng)用程序開發(fā)工具和MFC類庫,可使應(yīng)用程序開發(fā)變得簡單。1.2數(shù)字圖像處理基本概念數(shù)字圖像處理(DigitalImageProcessing)是通過計(jì)算機(jī)對圖像進(jìn)行去除噪聲、增強(qiáng)、復(fù)原、分割、提取特征等處理的方法和技術(shù)。數(shù)字圖像處理的產(chǎn)生和迅速發(fā)展主要受三個因素的影響:一是計(jì)算機(jī)的發(fā)展;二是數(shù)學(xué)的發(fā)展(特別是離散數(shù)學(xué)理論的創(chuàng)立和完善);三是廣泛的農(nóng)牧業(yè)、林業(yè)、環(huán)境、軍事、工業(yè)和醫(yī)學(xué)等方面的應(yīng)用需求的增長。20世紀(jì)20年代,圖像處理首次應(yīng)用于改善倫敦和紐約之間海底電纜發(fā)送的圖片質(zhì)量。到20世紀(jì)50年代,數(shù)字計(jì)算機(jī)發(fā)展到一定的水平后,數(shù)字圖像處理才真正引起人們的興趣。1964年美國噴氣推進(jìn)實(shí)驗(yàn)室用計(jì)算機(jī)對“徘徊者七號”太空船發(fā)回的大批月球照片進(jìn)行處理,收到明顯的效果。20世紀(jì)60年代末,數(shù)字圖像處理具備了比較完整的體系,形成了一門新興的學(xué)科。20世紀(jì)70年代,數(shù)字圖像處理技術(shù)得到迅猛的發(fā)展,理論和方法進(jìn)一步完善,應(yīng)用范圍更加廣泛。在這一時期,圖像處理主要和模式識別及圖像理解系統(tǒng)的研究相聯(lián)系,如文字識別、醫(yī)學(xué)圖像處理、遙感圖像的處理等。20世紀(jì)70年代后期到現(xiàn)在,各個應(yīng)用領(lǐng)域?qū)?shù)字圖像處理提出越來越高的要求,促進(jìn)了這門學(xué)科向更高級的方向發(fā)展。特別是在景物理解和計(jì)算機(jī)視覺(即機(jī)器視覺)方面,圖像處理已由二維處理發(fā)展到三維理解或解釋。近年來,隨著計(jì)算機(jī)和其它各有關(guān)領(lǐng)域的迅速發(fā)展,例如在圖像表現(xiàn)、科學(xué)計(jì)算可視化、多媒體計(jì)算技術(shù)等方面的發(fā)展,數(shù)字圖像處理已從一個專門的研究領(lǐng)域變成了科學(xué)研究和人機(jī)界面中的一種普遍應(yīng)用的工具。1.3圖像降噪技術(shù)研究背景及意義隨著計(jì)算機(jī)科學(xué)和圖像處理技術(shù)的迅速發(fā)展,圖像在醫(yī)學(xué)成像、模式識別等方面取得了廣泛應(yīng)用。但是,圖像在形成、傳輸過程中,不可避免會受到噪聲的干擾,而且有些圖像的噪聲非常嚴(yán)重,圖像中的噪聲往往和信號交織在一起,會使圖像本身的細(xì)節(jié)如邊界輪廓、線條等變的模糊不清。引起噪聲的原因很多,噪聲的種類也很多。因此,需要對圖像進(jìn)行降噪處理,便于更高層次的圖像分析與理解。如何既對圖像中出現(xiàn)的噪聲進(jìn)行合理的抑制、衰減以及去除不需要的信息,又能使有用的信息得到加強(qiáng),從而便于目標(biāo)區(qū)分或?qū)ο蠼忉?,是圖像去噪主要研究的主要任務(wù)。1.4圖像降噪的國內(nèi)外研究現(xiàn)狀圖像降噪是圖像處理的一個重要環(huán)節(jié)。目前圖像噪聲的取出在數(shù)字圖像處理技術(shù)中的重要性愈加明顯。近年來,在小波基礎(chǔ)上發(fā)展起來的圖像去噪仍是一個值得關(guān)注的問題,在理論和實(shí)踐上都具有重大的研究意義。其中,基于中值濾波和小波變換的圖像去噪小波變換是近年來興起的信號處理技術(shù),它具有良好的局部化分析特性和多分辨率分析特性,非常適合于圖像處理。1.5關(guān)于圖像噪聲噪聲是不可預(yù)測的隨機(jī)信號,通常采用概率統(tǒng)計(jì)方法對其進(jìn)行分析。噪聲對圖像處理十分重要,它影響圖像處理的、采集、處理的各個環(huán)節(jié)以及輸出結(jié)果的全過程。特別是圖像的輸入、采集噪聲的抑制是十分關(guān)鍵的問題,若輸入伴有較大的噪聲,必然影響處理全過程及輸出的結(jié)果。噪聲可以理解為“妨礙人們感覺器官,對所接收的信源信息理解的因素”。噪聲在理論上可以定義為“不可預(yù)測,只能用概率統(tǒng)計(jì)方法來認(rèn)識的隨機(jī)誤差”。因此將圖像噪聲看成是多維隨機(jī)過程是合適的,因而描述噪聲的方法完全可以借用隨機(jī)過程的描述,即用其概率分布函數(shù)和概率密度分布函數(shù)。但在很多情況下,這樣的描述方法是很復(fù)雜的,甚至是不可能的。而實(shí)際應(yīng)用往往也不必要。通常是用其數(shù)字特征,即均值方差,相關(guān)函數(shù)等。因?yàn)檫@些數(shù)字特征都可以從某些方面反映出噪聲的特征。除此之外,噪聲的灰度值與其周圍的灰度之間有著明顯的灰度差,也正式這些明顯的灰度差才造成了視覺障礙。因此一個良好的圖像處理系統(tǒng),不論是模擬處理還是用計(jì)算機(jī)進(jìn)行的數(shù)字處理,無不把減少最前一級的噪聲作為主攻目標(biāo)。特此根據(jù)噪聲性質(zhì)的不同,消除噪聲的方法也不同,本文將介紹“均值濾波”、“中值濾波”、“傅里葉降噪”、“小波變換”四種降噪方法。根據(jù)噪聲產(chǎn)生的來源,大致可以分為外部噪聲和內(nèi)部噪聲兩大類。外部噪聲是指從處理系統(tǒng)外來的影響,如天線干擾或電磁波從電源線竄入系統(tǒng)的噪聲。內(nèi)部噪聲則有一下幾種最常見形式:(1)由光和電的基本性質(zhì)引起的噪聲。例如電流可看作電子或空穴運(yùn)動,這些例子運(yùn)動產(chǎn)生隨機(jī)散粒噪聲,導(dǎo)體中電子流動的熱噪聲,光量子運(yùn)動的光量子噪聲等。(2)由機(jī)械運(yùn)動引起的噪聲。例如,接頭振動使電流不穩(wěn),磁頭或磁帶、磁盤抖動等。(3)元器件期檢噪聲。如光學(xué)底片的顆粒噪聲,磁帶、磁盤缺陷噪聲,光盤的疵點(diǎn)噪聲等。(4)系統(tǒng)內(nèi)部電流的噪聲。從噪聲的分類方法來看是多種多樣的。但綜合來說,噪聲是隨機(jī)產(chǎn)生的量,所以又可以從統(tǒng)計(jì)數(shù)學(xué)的觀點(diǎn)來定義噪聲。凡是統(tǒng)計(jì)特性不隨時間變化的噪聲稱為平穩(wěn)的噪聲,而統(tǒng)計(jì)特性隨時間變化的噪聲稱作非平穩(wěn)噪聲。以上所討論的各種類型的噪聲反映在圖像畫面上,大致可以分為兩種經(jīng)典的圖像噪聲。若噪聲的幅值基本相同,但是噪聲出現(xiàn)的位置是隨意的,稱這類噪聲為椒鹽噪聲。若從噪聲幅值大小的分布統(tǒng)計(jì)來看,其密度函數(shù)有高斯型、瑞利型,分別稱為高斯噪聲和瑞利噪聲,又如頻譜均勻分布的噪聲稱為白噪聲等等。本文著重討論椒鹽噪聲。

2位圖操作基本知識2.1CDIB類的介紹大多數(shù)圖像處理都是基于與設(shè)備無關(guān)位圖(DIB)來進(jìn)行討論的,而MFC中沒有處理DIB位圖的類,這就給編程帶來了很大困難。所以需要建立一個處理DIB位圖的專用類,CDIB類,在其中封裝必要而有效的處理函數(shù),該類具有的功能如下: VoidLoadFile(Cstringm_fileName);//裝載BMP位圖文件 Char*GetFileName();//返回位圖文件名 DWORDGetSize();//返回位圖文件的大小 UINTGetWidth();//返回位圖的寬度 UINTGetHeight();//返回位圖的高度 UINTGetNumberOfColors();//返回位圖顏色數(shù)目 RGBQUAD*GetRGB();//返回顏色表首地址 BITMAPINFO*GetInfo();//返回圖像信息結(jié)構(gòu)首地址 BYTE*GetData();//返回圖像數(shù)據(jù)首地址根據(jù)對DIB操作的分析,以及參照Cbitmap的功能設(shè)計(jì),CDIB類的基本操作功能應(yīng)包括:DIB文件的讀寫操作;提供位圖寬度、高度、顏色數(shù)目等位圖相關(guān)信息;提供有關(guān)位圖占據(jù)內(nèi)存空間的信息,包括:圖像數(shù)據(jù)區(qū)首地址、顏色表首地址、位圖信息結(jié)構(gòu)首地址等信息。2.2位圖操作2.2.1圖像讀取

得到文件的完整路徑名打開位圖文件得到文件的完整路徑名打開位圖文件讀取BITMAPFILEHEADER結(jié)構(gòu)文件是BMP格式嗎?計(jì)算得到bmp文件除文件頭以外的大小把bmp文件除文件頭以外的部分讀入內(nèi)存返回DIB句柄結(jié)束開始NY圖2.1圖像讀取流程圖2.2.2圖像顯示

開始開始設(shè)定顯示參數(shù),顯示位圖恢復(fù)原調(diào)色板結(jié)束從DOC對象中得到位圖數(shù)據(jù)起始位置指針,并得到圖像的寬、高等信息把新創(chuàng)建的調(diào)色板作為設(shè)備環(huán)境的調(diào)色板,并保留原調(diào)色板使用文件中顏色表數(shù)據(jù)創(chuàng)建調(diào)色板位圖是8位?NYN圖2.2圖像顯示流程圖2.3程序源代碼2.3.1圖像讀取通過ReadDIBFile()函數(shù)實(shí)現(xiàn)對函數(shù)的讀取,參數(shù)CFile&file,返回值HDIB。HDIBCDIB::ReadDIBFile(CFile&file){ BITMAPFILEHEADERbmfHeader; HDIBhDIB; LPBYTElpDIB; //獲取DIB(文件)長度(字節(jié)) DWORDdwBitsSize=file.GetLength(); //嘗試讀取DIB文件頭 if(file.Read((LPBYTE)&bmfHeader,sizeof(bmfHeader))!=sizeof(bmfHeader)) { //大小不對,返回NULL。 returnNULL; } //判斷是否是DIB對象,檢查頭兩個字節(jié)是否是"BM" if(bmfHeader.bfType!=DIB_HEADER_MARKER) { //非DIB對象,返回NULL。 returnNULL; } //為DIB分配內(nèi)存 hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize); if(hDIB==0) { //內(nèi)存分配失敗,返回NULL。 returnNULL; } //鎖定 lpDIB=(LPBYTE)::GlobalLock((HGLOBAL)hDIB); //讀象素 if(file.ReadHuge(lpDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!= dwBitsSize-sizeof(BITMAPFILEHEADER)) { //大小不對。 //解除鎖定 ::GlobalUnlock((HGLOBAL)hDIB); //釋放內(nèi)存 ::GlobalFree((HGLOBAL)hDIB); //返回NULL。 returnNULL; } //解除鎖定 ::GlobalUnlock((HGLOBAL)hDIB); //返回DIB句柄 returnhDIB;}2.3.2圖像保存通過ReadDIBFile()函數(shù)實(shí)現(xiàn)將DIB保存到指定文件中,參數(shù)HDIBhDib、CFile&file,返回值BOOL.BOOLCDIB::SaveDIB(HDIBhDib,CFile&file){ //Bitmap文件頭 BITMAPFILEHEADERbmfHdr; //指向BITMAPINFOHEADER的指針 LPBITMAPINFOHEADERlpBI; if(hDib==NULL) { //如果DIB為空,返回FALSE returnFALSE; } //讀取BITMAPINFO結(jié)構(gòu),并鎖定 lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib); if(lpBI==NULL) { //為空,返回FALSE returnFALSE; } //判斷是否是WIN3.0DIB if(!IS_WIN30_DIB(lpBI)) { //不支持其它類型的DIB保存 //解除鎖定 ::GlobalUnlock((HGLOBAL)hDib); //返回FALSE returnFALSE; } //填充文件頭 //文件類型"BM" bmfHdr.bfType=DIB_HEADER_MARKER; //計(jì)算DIB大小時,最簡單的方法是調(diào)用GlobalSize()函數(shù)。但是全局內(nèi)存大小并 //不是DIB真正的大小,它總是多幾個字節(jié)。這樣就需要計(jì)算一下DIB的真實(shí)大小。 //文件頭大?。伾泶笮?//(BITMAPINFOHEADER和BITMAPCOREHEADER結(jié)構(gòu)的第一個DWORD都是該結(jié)構(gòu)的大小) DWORDdwDIBSize=*(LPDWORD)lpBI+PaletteSize((LPBYTE)lpBI); //計(jì)算圖像大小 if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4)) { //對于RLE位圖,沒法計(jì)算大小,只能信任biSizeImage內(nèi)的值 dwDIBSize+=lpBI->biSizeImage; } else { //大小為Width*Height DWORDdwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight; //計(jì)算出DIB真正的大小 dwDIBSize+=dwBmBitsSize; //更新biSizeImage(很多BMP文件頭中biSizeImage的值是錯誤的) lpBI->biSizeImage=dwBmBitsSize; } //計(jì)算文件大?。篋IB大?。獴ITMAPFILEHEADER結(jié)構(gòu)大小 bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER); //兩個保留字 bmfHdr.bfReserved1=0; bmfHdr.bfReserved2=0; //計(jì)算偏移量bfOffBits,它的大小為Bitmap文件頭大?。獶IB頭大?。伾泶笮?bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+PaletteSize((LPBYTE)lpBI); //嘗試寫文件 TRY { //寫文件頭 file.Write((LPBYTE)&bmfHdr,sizeof(BITMAPFILEHEADER)); //寫DIB頭和象素 file.WriteHuge(lpBI,dwDIBSize); } CATCH(CFileException,e) { //解除鎖定 ::GlobalUnlock((HGLOBAL)hDib); //拋出異常 THROW_LAST(); } END_CATCH //解除鎖定 ::GlobalUnlock((HGLOBAL)hDib); //返回TRUE returnTRUE;}

3噪聲的添加3.1基本原理定義Saltnoising(HDIBhDIB)類,用以封裝實(shí)現(xiàn)添加噪聲的相關(guān)函數(shù)。設(shè)置指向源圖像的指針,設(shè)置表示行、列的循環(huán)變量i,j。在加噪過程中,存儲標(biāo)準(zhǔn)圖像象素信息后,生成一個為隨機(jī)種子,可以為任意數(shù)或系統(tǒng)時間。當(dāng)dTemp>31500時,指向源圖像倒數(shù)第j行,第i個象素的指針,將圖像中當(dāng)前點(diǎn)置為黑。即完成一次噪聲的添加。3.2實(shí)現(xiàn)步驟(1)取得圖像大小、數(shù)據(jù)區(qū),并把數(shù)據(jù)區(qū)復(fù)制到緩沖區(qū);(2)循環(huán)取得各點(diǎn)像素值;(3)若產(chǎn)生的隨機(jī)數(shù)大于特定值,把該點(diǎn)置黑;(4)把緩沖區(qū)中改動的數(shù)據(jù)復(fù)制到原數(shù)據(jù)區(qū)中。3.3程序源代碼3.3.1添加響應(yīng)函數(shù)CDIBview中添加“加入椒鹽噪聲”的響應(yīng)函數(shù):oidCDIPSView::OnAddnoisingSalt(){ //TODO:Addyourcommandhandlercodehere CDIPSDoc*pDoc=GetDocument(); CAddNoisingaddSALT; addSALT.Saltnoising(pDoc->GetHDIB()); Invalidate(); pDoc->SetModifiedFlag(TRUE); }3.3.2添加成員函數(shù)建立CaddNoising類,其成員函數(shù)執(zhí)行具體操作:voidCAddNoising::Saltnoising(HDIBhDIB){ //指向源圖像的指針 LPSTR lpSrc; //循環(huán)變量 longi; longj; //圖像每行的字節(jié)數(shù) LONGlLineBytes; //計(jì)算圖像每行的字節(jié)數(shù) LPBYTElpDIB=(LPBYTE)::GlobalLock((HGLOBAL)hDIB); LPBYTElpDIBBits; CDIBm_add; LONGlWidth=m_add.DIBWidth(lpDIB); LONGlHeight=m_add.DIBHeight(lpDIB); lpDIBBits=m_add.FindDIBBits(lpDIB); lLineBytes=WIDTHBYTES(lWidth*8); for(i=0;i<lLineBytes;i++)//存儲標(biāo)準(zhǔn)圖像象素信息 for(j=0;j<lHeight;j++) { BMP_stdData[i* lLineBytes+j]=*((BYTE*)lpDIBBits+lLineBytes*i+j); } if(m_add.DIBBitCount(lpDIB)!=8) { //prompt MessageBox("Thisprogramcanonlyprocess8bits'image.","Prompt",MB_ICONINFORMATION|MB_OK); //unlock ::GlobalUnlock((HGLOBAL)hDIB); } //生成偽隨機(jī)種子 srand((unsigned)2); inttem=0; //在圖像中加噪 for(j=0;j<lHeight;j++) { for(i=0;i<lLineBytes;i++) { doubledTemp; dTemp=rand(); if(dTemp>31500) { //指向源圖像倒數(shù)第j行,第i個象素的指針 lpSrc=(char*)lpDIBBits+lLineBytes*j+i; //圖像中當(dāng)前點(diǎn)置為黑 *lpSrc=0; // tem++; } } }// charctem[20]; // sprintf(ctem,"噪聲象素點(diǎn)個數(shù)為:%d",tem);// MessageBox(ctem); }3.4輸出結(jié)果圖3.1原圖像圖3.2加入椒鹽噪聲后的圖像

4均值濾波4.1基本原理所謂均值濾波實(shí)際上就是用均值替代原圖像中的各個像素值。均值濾波的方法如下:設(shè)被噪聲污染后的信號為,原始信號為,噪聲為,則。均值濾波公式如下:(4.1)經(jīng)過均值濾波后的圖像,可以看到噪聲明顯的被抑制了。下面推導(dǎo)均值濾波對抑制的原理。因?yàn)?4.2)等式兩邊取數(shù)學(xué)期望(即統(tǒng)計(jì)中),得(4.3)如果噪聲椒鹽噪聲,則有(4.4)所以(4.5)按照如上的定義可知,因?yàn)槌霈F(xiàn)的為椒鹽噪聲,其幅值基本相同,但是數(shù)據(jù)中,還存在一些點(diǎn)沒有噪聲,這樣,可以將未輸出的噪聲的點(diǎn)等同的認(rèn)為噪聲幅值為0,這樣就有(4.6)所以,經(jīng)過均值濾波之后,中所包含的噪聲強(qiáng)度值低于。椒鹽噪聲的抑制,只是將某點(diǎn)出現(xiàn)的噪聲強(qiáng)度,讓周圍的數(shù)據(jù)平均分擔(dān)了。實(shí)現(xiàn)方法根據(jù)上述對以為均值濾波的原理介紹,將其寬展到二維信號的處理,就可以事先對圖像噪聲的抑制。均值濾波方法是,對待處理的當(dāng)前像素,選擇一個模板,該模板為其近鄰的若干像素組成,用模板中像素的均值來替代原像素的方法。如圖123804765圖4.1均值濾波原理示意圖序號為0的是當(dāng)前像素,序號為1~8的像素是其模板中的鄰家像素。求模板中所有像素的均值,再把該均值賦予當(dāng)前像素點(diǎn),作為處理后圖像在該點(diǎn)上的灰度,即(4.7)其中,s為模板,M為該模板中包含當(dāng)前像素在內(nèi)的像素總個數(shù)??紤]到數(shù)據(jù)分布的平衡性,本文中模板選擇為3×3,待處理像素放在模板的中心。為了使輸出像素值保持在原理的灰度值范圍內(nèi),模板的權(quán)值總和應(yīng)該維持為1。模板與模板像素的乘積要除以一個系數(shù)(通常是模板系數(shù)之和),這個過程也被稱為模板的歸一化。模板的描述還可以采用矩陣的形式,入3×3的均值濾波可以描述如下:(4.8)該模板的響應(yīng)計(jì)算為(4.9)以式(4.8)對椒鹽噪聲圖片進(jìn)行均值濾波后,所得到的結(jié)果可知,均值濾波器對椒鹽噪聲的濾波效果不是很理想。因?yàn)榻符}噪聲的幅值都是基本相同的,只是出現(xiàn)噪聲點(diǎn)的位置是隨機(jī)的,所以在統(tǒng)計(jì)意義下的噪聲均值也不為0,因此,即使是理想情況也無法完全去除。但是從模板的含義來理解,經(jīng)過均值處理之后,噪聲部分被弱化到周圍像素點(diǎn)上,所以得到的結(jié)果是噪聲幅值減小,但是噪聲點(diǎn)的顆粒面積同時變大。另外,均值濾波有一個非常致命的缺點(diǎn),就是在求均值的計(jì)算中,會同時將景物的邊緣也同時進(jìn)行均值處理,這樣就使得景物的清晰度降低,畫面變的模糊。程序源代碼4.3.1添加響應(yīng)函數(shù)在CDIPSView類中,得到均指濾波響應(yīng)函數(shù)OnDenoisingAveraging():voidCDIPSView::OnDenoisingAveraging(){ //TODO:Addyourcommandhandlercodehere CDIPSDoc*pDoc=GetDocument(); //callclassCDeNoising CDeNoisingclsDeNoising; clsDeNoising.AveragingFilter(pDoc->GetHDIB()); //refreshtheview Invalidate(); //setflaginordertoindicatemodification pDoc->SetModifiedFlag(TRUE); }4.3.2添加成員函數(shù)建立類CdeNoising,其成員函數(shù)AveragingFilter(HDIBhDIB)執(zhí)行具體算法:voidCDeNoising::AveragingFilter(HDIBhDIB){ //variablesdefinition LONGi,j; intintensity1,intensity2,intensity3,intensity4,intensity5,intensity6,intensity7,intensity8,intensity; //apointertoBitMapFileHeader LPBYTElpDIB; //apointtostartofBitMapData LPBYTElpDIBBits; //LockandgetpointerOfDIB lpDIB=(LPBYTE)::GlobalLock((HGLOBAL)hDIB); //GetpointerofBitMapData lpDIBBits=m_clsDIB.FindDIBBits(lpDIB); //IfDIBBitCountequal24,thengiveapromptandexitthisprogram if(m_clsDIB.DIBBitCount(lpDIB)!=8) { //prompt MessageBox("Thisprogramcanonlyprocess8bits'image.","Prompt",MB_ICONINFORMATION|MB_OK); //unlock ::GlobalUnlock((HGLOBAL)hDIB); //exit return; } //letcursorinwaitstatus BeginWaitCursor(); //getwidthoftheimage LONGlWidth=m_clsDIB.DIBWidth(lpDIB); //getheightoftheimage LONGlHeight=m_clsDIB.DIBHeight(lpDIB); //getbytesofeachline LONGlLineBytes=WIDTHBYTES(lWidth*8); //accessseverypixel for(i=1;i<lHeight-1;i++) { for(j=1;j<lLineBytes-1;j++) { //getintensityvaluesofthepixelsonabove,undown,left,right intensity1=*((BYTE*)lpDIBBits+lLineBytes*i+j-1); intensity2=*((BYTE*)lpDIBBits+lLineBytes*i+j+1); intensity3=*((BYTE*)lpDIBBits+lLineBytes*(i-1)+j); intensity4=*((BYTE*)lpDIBBits+lLineBytes*(i+1)+j); //getintensityvaluesofthepixelsonletf-above,left-undown,right-above,right-down intensity5=*((BYTE*)lpDIBBits+lLineBytes*(i+1)+j-1); intensity6=*((BYTE*)lpDIBBits+lLineBytes*(i-1)+j-1); intensity7=*((BYTE*)lpDIBBits+lLineBytes*(i+1)+j+1); intensity8=*((BYTE*)lpDIBBits+lLineBytes*(i-1)+j-1); intensity=(intensity1+intensity2+intensity3+intensity4+intensity5+intensity6+intensity7+intensity8)/8; //writenewvalue *((BYTE*)lpDIBBits+lLineBytes*i+j)=(BYTE)intensity; } } //unlock ::GlobalUnlock((HGLOBAL)hDIB); //計(jì)算均方根誤差// Acc_Targets(lHeight,lWidth,lpDIBBits);//letcursorinnormalstatus EndWaitCursor();}4.4結(jié)果輸出及分析4.4.1結(jié)果輸出圖4.2加入椒鹽噪聲后的圖像圖4.3均值濾波后的圖像4.4.2結(jié)果分析從上面的簡單例子可以看到,均值濾波方法抑制噪聲算法簡單,計(jì)算速度快。然而對于模板寬度較大的圖像,在降低噪聲的同時也使圖像產(chǎn)生模糊,特別是在景物的邊緣和細(xì)節(jié)處,模板越大,雖然噪聲抑制效果越好,但同時畫面的模糊度也更加嚴(yán)重。

5中值濾波5.1基本原理中值濾波是基于排序系統(tǒng)理論的一種能有效抑制噪聲的非線性信號處理技術(shù)。在一維形式下,一維中值濾波器含有奇數(shù)個數(shù)的滑動模板,對模板中的數(shù)據(jù)由小到大,取排在中間位置上的數(shù)據(jù)作為最終的處理結(jié)果。下面,以一個簡單的一維數(shù)據(jù)序列的濾波為例,介紹中值濾波原理。設(shè)模板的長度為5,模板中的數(shù)據(jù)設(shè)為{10,15,45,20,25},則Med{10,15,45,20,25}=20(Med表示取中值函數(shù))。如果該模板中的數(shù)據(jù)為某個圖像中的一個局部的數(shù)據(jù),從數(shù)據(jù)的分布規(guī)律來看,原理模板中心位置上的像素值為45,較其周圍的像素值大,畫面上一定會出現(xiàn)一個突變的噪聲點(diǎn)。經(jīng)過中值濾波處理后的值為20,與周圍的像素差異不大,由此就得到了抑制噪聲的效果。中值濾波的核心運(yùn)算是將模板中的數(shù)據(jù)進(jìn)行排序,這樣,如果一個亮點(diǎn)(暗點(diǎn))為噪聲,就會在排序過程中被排在數(shù)據(jù)序列的最右側(cè)或者是最左側(cè),因此,最終選擇的數(shù)據(jù)序列中間位置上的值一般不是噪聲點(diǎn)的值,由此便可以達(dá)到抑制噪聲的目的。5.2實(shí)現(xiàn)方法取某種結(jié)構(gòu)的二維滑動模板,將模板內(nèi)像素按照像素值的大小進(jìn)行排序,生成單調(diào)上升(或下降)的二維數(shù)據(jù)序列。類似于一維,二維中值濾波輸出為:其中,,分別為原圖像和處理后的圖像。W為二維模板,通常選為3×3.5×5區(qū)域,也可以有不同的形狀,如線狀,圓形,十字形,圓環(huán)形等。因?yàn)榻符}噪聲只在畫面中的部分點(diǎn)上隨機(jī)出現(xiàn),所以根據(jù)中值濾波原理可知,通過數(shù)據(jù)排序的方法,將圖像中未被噪聲污染的點(diǎn)替代噪聲點(diǎn)的值的概率比較大,因此噪聲的抑制效果很好,同時畫面清晰的基本保持。5.3程序源代碼5.3.1添加響應(yīng)函數(shù)在CDIPSView類中,得到均值濾波響應(yīng)函數(shù)OnDenoisingMid():voidCDIPSView::OnDenoisingMid(){ //TODO:Addyourcommandhandlercodehere CDIPSDoc*pDoc=GetDocument(); //callclassCDeNoising CDeNoisingclsDeNoising; clsDeNoising.MidFilter(pDoc->GetHDIB()); //refreshtheview Invalidate(); //setflaginordertoindicatemodification pDoc->SetModifiedFlag(TRUE); }5.3.2添加成員函數(shù)在類CdeNoising中,其成員函數(shù)MidFilter(HDIBhDIB)執(zhí)行具體算法:voidCDeNoising::MidFilter(HDIBhDIB){ ////////1*5中值濾波 //variablesdefinition LONGi,j,m,n; intintensity[6]; LPBYTElpDIB; LPBYTElpDIBBits; //LockandgetpointerOfDIB lpDIB=(LPBYTE)::GlobalLock((HGLOBAL)hDIB); lpDIBBits=m_clsDIB.FindDIBBits(lpDIB); //IfDIBBitCountequal24,thengiveapromptandexitthisprogram if(m_clsDIB.DIBBitCount(lpDIB)!=8) { //prompt MessageBox("Thisprogramcanonlyprocess8bits'image.","Prompt",MB_ICONINFORMATION|MB_OK); //unlock ::GlobalUnlock((HGLOBAL)hDIB); //exit return; } //letcursorinwaitstatus BeginWaitCursor(); LONGlWidth=m_clsDIB.DIBWidth(lpDIB); LONGlHeight=m_clsDIB.DIBHeight(lpDIB); //getbytesofeachline LONGlLineBytes=WIDTHBYTES(lWidth*8); //accessseverypixel for(i=0;i<lHeight;i++) { for(j=2;j<lLineBytes-2;j++) { intensity[0]=*((BYTE*)lpDIBBits+lLineBytes*i+j-2); intensity[1]=*((BYTE*)lpDIBBits+lLineBytes*i+j-1); intensity[2]=*((BYTE*)lpDIBBits+lLineBytes*i+j); intensity[3]=*((BYTE*)lpDIBBits+lLineBytes*i+j+1); intensity[4]=*((BYTE*)lpDIBBits+lLineBytes*i+j+2); for(m=0;m<3;m++) { for(n=m+1;n<5;n++) { if(intensity[m]>intensity[n]) { intensity[5]=intensity[m]; intensity[m]=intensity[n]; intensity[n]=intensity[5]; } } } //writenewvalue *((BYTE*)lpDIBBits+lLineBytes*i+j)=(BYTE)intensity[2]; } } //unlock ::GlobalUnlock((HGLOBAL)hDIB); //計(jì)算均方根誤差// Acc_Targets(lHeight,lWidth,lpDIBBits); //letcursorinnormalstatus EndWaitCursor(); }voidCDeNoising::Smoothing(HDIBhDIB){ //variablesdefinition LONGi,j,m; intintensity[10],avIntensity; //apointertoBitMapFileHeader LPBYTElpDIB; //apointtostartofBitMapData LPBYTElpDIBBits; //LockandgetpointerOfDIB lpDIB=(LPBYTE)::GlobalLock((HGLOBAL)hDIB); lpDIBBits=m_clsDIB.FindDIBBits(lpDIB); //IfDIBBitCountequal24,thengiveapromptandexitthisprogram if(m_clsDIB.DIBBitCount(lpDIB)!=8) { //prompt MessageBox("Thisprogramcanonlyprocess8bits'image.","Prompt",MB_ICONINFORMATION|MB_OK); ::GlobalUnlock((HGLOBAL)hDIB); return; } //letcursorinwaitstatus BeginWaitCursor(); LONGlWidth=m_clsDIB.DIBWidth(lpDIB); LONGlHeight=m_clsDIB.DIBHeight(lpDIB); LONGlLineBytes=WIDTHBYTES(lWidth*8); //accessseverypixel intensity[9]=0; for(i=1;i<lHeight-1;i++) { for(j=1;j<lLineBytes-1;j++) { intensity[0]=*((BYTE*)lpDIBBits+lLineBytes*(i-1)+j-1); intensity[1]=*((BYTE*)lpDIBBits+lLineBytes*(i-1)+j); intensity[2]=*((BYTE*)lpDIBBits+lLineBytes*(i-1)+j+1); intensity[3]=*((BYTE*)lpDIBBits+lLineBytes*i+j-1); intensity[4]=*((BYTE*)lpDIBBits+lLineBytes*i+j); intensity[5]=*((BYTE*)lpDIBBits+lLineBytes*i+j+1); intensity[6]=*((BYTE*)lpDIBBits+lLineBytes*(i+1)+j-1); intensity[7]=*((BYTE*)lpDIBBits+lLineBytes*(i+1)+j); intensity[8]=*((BYTE*)lpDIBBits+lLineBytes*(i+1)+j+1); for(m=0;m<9;m++) { intensity[9]+=intensity[m]; } avIntensity=intensity[9]/9; intensity[9]=0; //writenewvalue *((BYTE*)lpDIBBits+lLineBytes*i+j)=(BYTE)avIntensity; } } //unlock ::GlobalUnlock((HGLOBAL)hDIB); //計(jì)算均方根誤差// Acc_Targets(lHeight,lWidth,lpDIBBits); //letcursorinnormalstatus EndWaitCursor();}5.4結(jié)果輸出及分析5.4.1結(jié)果輸出圖5.1加入噪聲后的原始圖像圖5.2中值濾波后圖像5.4.2結(jié)果分析中值濾波方法抑制噪聲算法雖然比均值濾波算法略微復(fù)雜,但是對畫面清晰度的保持方面卻比均值濾好很多。但是,適當(dāng)?shù)倪x擇模板的大小于結(jié)構(gòu)形狀也非常重要。如果模板取太多,也可能使圖像的清晰度遭到了一定程度的破壞。

6傅立葉降噪6.1基本概念為了有效地和快速地對圖像進(jìn)行處理和分析,常常需要將原定義在圖像空間的圖像以某種形式轉(zhuǎn)換(正變換)到另外一些空間,并利用在這些空間的特有性質(zhì)方便地進(jìn)行一定的加工,最后再轉(zhuǎn)換回圖像空間(反變換或逆變換)以得到所需要的效果。傅里葉變換就一種重要的常用的變換,它把圖像從圖像空間變換到頻率空間。有限長序列可以通過離散傅里葉變換(DFT)將其頻域也離散化成有限長序列.但其計(jì)算量太大,很難實(shí)時地處理問題,因此引出了快速傅里葉變換(FFT)。1965年,Cooley和Tukey提出了計(jì)算離散傅里葉變換(DFT)的快速算法,將DFT的運(yùn)算量減少了幾個數(shù)量級。FFT在離散傅里葉反變換、線性卷積和線性相關(guān)等方面也有重要應(yīng)用。6.1.1二維傅里葉變換二維傅里葉正、逆變換公式如下:(6.1)(6.2)可以用以表示一幅圖像,而就表示該圖像的頻譜。6.1.2二維離散傅里葉變換對于二維傅里葉變換,其離散形式如公式(6.3)所示:(6.3)逆變換公式如(6.4)所示:(6.4)頻譜公式如(6.5)所示:(6.5)由可傅里葉變換的分離性可知,一個二維傅里葉變換可分解為兩步進(jìn)行,其中每一步都是一個一維傅里葉變換。先對按列進(jìn)行傅里葉變換得到,再對按行進(jìn)行傅里葉變換,便可得到的傅里葉變換結(jié)果。顯然對先按行進(jìn)行離散傅里葉變換,再按列進(jìn)行離散傅里葉變換也是可行的。6.1.3快速傅里葉變換快速傅里葉變換(FFT)是計(jì)算離散傅里葉變換(DFT)的快速算法。FFT的基本思想:將大點(diǎn)數(shù)的DFT分解為若干個小點(diǎn)數(shù)DFT的組合,從而減少運(yùn)算量。因子具有以下兩個特性,可使DFT運(yùn)算量盡量分解為小點(diǎn)數(shù)的DFT運(yùn)算:周期性:對稱性:利用這兩個性質(zhì),可以使DFT運(yùn)算中有些項(xiàng)合并,以減少乘法次數(shù)。6.2相關(guān)原理添加FFT函數(shù)。下面定義的函數(shù)FFT()就可以完成一維離散快速傅里葉變換。它有三個參數(shù):一個是指向時域數(shù)組的指針TD,該數(shù)組保存著要進(jìn)行傅里葉變換的數(shù)值序列,類型為復(fù)數(shù);第二個是指向頻域數(shù)組的指針,用來保存快速傅里葉變換的結(jié)果。參數(shù)為,即為迭代次數(shù)。傅里葉變換的點(diǎn)數(shù)可以由參數(shù)直接求出,只要將1左移位即可。經(jīng)過快速傅里葉變換后,將圖片從時域轉(zhuǎn)換到頻域,則出現(xiàn)出現(xiàn)頻率分布圖像(圖6.2),中心較亮區(qū)域?yàn)榈皖l,周圍區(qū)域?yàn)楦哳l。由于噪聲信息儲存在高頻區(qū)域,所以,經(jīng)低通濾波去掉其高頻信息,保留低頻信息,可隨之去掉噪聲信息。再將低通濾波處理后的圖像經(jīng)快速傅里葉逆變換還原后,即為降噪后的圖像。6.3程序源代碼6.3.1快速傅里葉變換1.在CDIPSView類中,得到快速傅里葉變換響應(yīng)函數(shù)OnTFourier()voidCDIPSView::OnTFourier(){ //TODO:Addyourcommandhandlercodehere CDIPSDoc*pDoc=GetDocument(); CFourierTranFTran; FTran.FT(pDoc->GetHDIB()); Invalidate(); pDoc->SetModifiedFlag(TRUE);}2.函數(shù)FFT()來實(shí)現(xiàn)快速傅里葉變換。參數(shù):complex<double>*TD,指向時域數(shù)組的指針;complex<double>*FD指向頻域數(shù)組的指針;r-2的冪數(shù),即迭代次數(shù)。函數(shù)無返回值。VOIDWINAPIFFT(complex<double>*TD,complex<double>*FD,intr){ LONG count;//傅里葉變換點(diǎn)數(shù) int i,j,k;//循環(huán)變量 int bfsize,p;//中間變量 double angle;//角度 complex<double>*W,*X1,*X2,*X; count=1<<r;//計(jì)算傅里葉變換點(diǎn)數(shù) //分配運(yùn)算所需存儲器 W=newcomplex<double>[count/2]; X1=newcomplex<double>[count]; X2=newcomplex<double>[count]; //計(jì)算加權(quán)系數(shù) for(i=0;i<count/2;i++) { angle=-i*PI*2/count; W[i]=complex<double>(cos(angle),sin(angle)); } //將時域點(diǎn)寫入X1 memcpy(X1,TD,sizeof(complex<double>)*count); //采用蝶形算法進(jìn)行快速傅里葉變換 for(k=0;k<r;k++) { for(j=0;j<1<<k;j++) { bfsize=1<<(r-k); for(i=0;i<bfsize/2;i++) { p=j*bfsize; X2[i+p]=X1[i+p]+X1[i+p+bfsize/2]; X2[i+p+bfsize/2]=(X1[i+p]-X1[i+p+bfsize/2])*W[i*(1<<k)]; } } X=X1; X1=X2; X2=X; } //重新排序 for(j=0;j<count;j++) { p=0; for(i=0;i<r;i++) { if(j&(1<<i)) { p+=1<<(r-i-1); } } FD[j]=X1[p]; } //釋放內(nèi)存 deleteW; deleteX1; deleteX2;}6.3.2快速傅里葉逆變換1.在CDIPSView類中,得到快速傅里葉逆變換響應(yīng)函數(shù)OnTIfourier()voidCDIPSView::OnTIfourier(){ //TODO:Addyourcommandhandlercodehere CDIPSDoc*pDoc=GetDocument(); CFourierTranFTran; FTran.IFT(pDoc->GetHDIB()); Invalidate(); pDoc->SetModifiedFlag(TRUE);}2.函數(shù)IFFT()來實(shí)現(xiàn)實(shí)現(xiàn)快速逆傅里葉變換。參數(shù):complex<double>*TD,指向時域數(shù)組的指針;complex<double>*FD指向頻域數(shù)組的指針;r-2的冪數(shù),即迭代次數(shù)。函數(shù)無返回值。BOOLWINAPIIFFT(complex<double>*FD,complex<double>*TD,intr){ //傅里葉變換點(diǎn)數(shù) LONG count; //循環(huán)變量 int i; complex<double>*X; //計(jì)算傅里葉變換點(diǎn)數(shù) count=1<<r; X=newcomplex<double>[count];memcpy(X,FD,sizeof(complex<double>)*count);//將頻域點(diǎn)寫入X //求共軛 for(i=0;i<count;i++) { X[i]=complex<double>(X[i].real(),-X[i].imag()); } FFT(X,TD,r);//調(diào)用快速傅里葉變換 //求時域點(diǎn)的共軛 for(i=0;i<count;i++) { TD[i]=complex<double>(TD[i].real()/count,-TD[i].imag()/count); } deleteX; return(true);}6.3.3低通濾波有了上面的的FFT()和IFFT()函數(shù),就可以非常方便的進(jìn)行而為離散數(shù)字圖像的傅里葉變換,即低通濾波。Fourier()函數(shù)來對圖像進(jìn)行傅里葉變換。參數(shù):LPSTRlpDIBBits,指向源DIB圖像指針;LONGlWidth,源圖像寬度(象素?cái)?shù));LONGlHeight,源圖像高度(象素?cái)?shù))。返回值:BOOL,成功返回TRUE,否則返回FALSE。BOOLWINAPIFourier(LPSTRlpDIBBits,LONGlWidth,LONGlHeight){ //指向源圖像的指針 unsignedchar* lpSrc; //中間變量 double dTemp; //循環(huán)變量 LONG i; LONG j; //進(jìn)行傅里葉變換的寬度\高度\長度(2的整數(shù)次方) LONG w; LONG h;// LONG FTlong; int wp; int hp;// int FTcount; //圖像每行的字節(jié)數(shù) LONG lLineBytes; //計(jì)算圖像每行的字節(jié)數(shù) lLineBytes=WIDTHBYTES(lWidth*8); //賦初值 w=1; h=1; ftLong=1; wp=0; hp=0; ftCount=0; //計(jì)算進(jìn)行傅里葉變換的長度(2的整數(shù)次方) while(ftLong*2<=lWidth*lHeight) { ftLong*=2; ftCount++; } //分配內(nèi)存 TD=newcomplex<double>[lWidth*lHeight]; FD=newcomplex<double>[lWidth*lHeight]; //行 for(i=0;i<lHeight;i++) { //列 for(j=0;j<lWidth;j++) { //指向DIB第i行,第j個象素的指針 lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(lWidth-1-i)+j; //給時域賦值 TD[j+lWidth*i]=complex<double>(*(lpSrc),0); } }//給時域賦值,為虛部全為0 FFT(TD,FD,ftCount); //行 for(i=0;i<lWidth;i++) { //列 for(j=0;j<lHeight;j++) { //計(jì)算頻譜 dTemp=sqrt(FD[j*lWidth+i].real()*FD[j*lWidth+i].real()+ FD[j*lWidth+i].imag()*FD[j*lWidth+i].imag())/100; //判斷是否超過255 if(dTemp>255) { //對于超過的,直接設(shè)置為255 dTemp=255; } //指向DIB第(i<h/2?i+h/2:i-h/2)行,第(j<w/2?j+w/2:j-w/2)個象素的指針 //此處不直接取i和j,是為了將變換后的原點(diǎn)移到中心 // lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(lHeight-1-i)+j; lpSrc=(unsignedchar*)lpDIBBits+lLineBytes* (lWidth-1-(i<lWidth/2?i+lWidth/2:i-lWidth/2))+ (j<lWidth/2?j+lWidth/2:j-lWidth/2); //更新源圖像 *(lpSrc)=(BYTE)(dTemp); } } //返回 returnTRUE;}6.4結(jié)果輸出及分析6.4.1結(jié)果輸出圖6.1加入椒鹽噪聲后的圖像圖6.2經(jīng)過快速傅里葉變換后的圖像圖6.3經(jīng)過快速傅里葉逆變換后的圖像圖6.4經(jīng)過低通濾波后的圖像6.4.2結(jié)果分析經(jīng)過傅里葉變換,圖像達(dá)到了降噪的效果,但它的計(jì)算量較大,運(yùn)算時間長,在某種程度上限制了它的使用。但快速傅里葉變換解決了這一限制。在運(yùn)算中節(jié)省了大量的計(jì)算時間,達(dá)到了快速運(yùn)算的目的。

7小波降噪7.1基本概念噪聲的能量分布在所有的小波系數(shù)上,而信號由于是有限帶寬的,其能量只分布在一部分小波系數(shù)上。由于信號能量遠(yuǎn)大于噪聲能量,在小波域上表現(xiàn)為含有信號的小波系數(shù)具有較大的幅值(數(shù)目較少),而僅含噪聲的小波系數(shù)的幅值較小(數(shù)目較多),這便提供了一種通過小波系數(shù)的幅值來甄別信號和噪聲的方法:預(yù)先設(shè)置一個閾值,小于該閾值的小波系數(shù)認(rèn)為是僅由噪聲產(chǎn)生,予以去掉;大于該閾值的則認(rèn)為包含了噪聲和信號,予以保留或進(jìn)行后續(xù)處理。由于保留了大部分信號的小波系數(shù),因而可較好地保持圖像的細(xì)節(jié)特征。7.1.1二維離散小波變換設(shè)表示二維圖像,為二維基本小波,則二維連續(xù)小波變換可定義為:(7.1)其中:;a為為伸縮尺度;R2為二維圖像的定義域。在離散情況下,,通常采用Mallat塔式算法進(jìn)行小波的分解和重構(gòu)。由式:(7.2)可通過對其伸縮標(biāo)度銀子a和評議標(biāo)度因子b的取樣而離散化。如果對a和b按如下規(guī)律取樣:;(7.3)其中>1;;m、n,則根據(jù),有:(7.4)這樣離散小波變換可定義為:(7.5)因此離散小波變換式(7.5)也是一種時域分析,它從集中在某個區(qū)間上的基本函數(shù)開始,以規(guī)定步長向左或向右移動基本波形,并用標(biāo)度因子來擴(kuò)張或壓縮以構(gòu)造其函數(shù)系。一系列小波由此而生,這就是“小波”一詞的由來。這里m和n分別稱為頻率范圍指數(shù)和時間步長變化指數(shù)。由于正比于,故高頻時(對應(yīng)于小的m值)高度集中,反之亦然;步長的變化則與n成正比。為了從離散小波變換式(7.5)重構(gòu)函數(shù)信號,算子必須是一有界可逆算子,即對某個:(7.6)對一切成立。其中表示二元平方可和序列矢量空間,范數(shù)。7.2.2Mallat算法Mallat以多分辨分析為基礎(chǔ)提出了著名的快速小波算法——Mallat算法。小波理論獲得突破性進(jìn)展,使得小波分析成為近年來迅速發(fā)展起來的新興學(xué)科,并得到了廣泛的應(yīng)用。Mallat算法通過一組分解濾波器H(低通濾波器LPF)和G(高通濾波器HPF)對信號進(jìn)行濾波,然后對輸出結(jié)果進(jìn)行下二采樣(指隔一取一)來實(shí)現(xiàn)小波分解,分解的結(jié)果是產(chǎn)生長度減半的兩個部分,一個是經(jīng)低通濾波器產(chǎn)生的原始信號的平滑部分,另一個則是經(jīng)高通濾波器產(chǎn)生的原始信號細(xì)節(jié)部分。重構(gòu)時使用一組h和g合成濾波器對小波分解的結(jié)果濾波,再進(jìn)行上二采樣(相鄰兩點(diǎn)間補(bǔ)零)來生成重構(gòu)信號。多級小波分解通過級聯(lián)的方式進(jìn)行,每一級的小波變換都是在前一級分解產(chǎn)生的低頻分量上的繼續(xù),重構(gòu)是分解的逆運(yùn)算。低頻分量上的信息比較豐富,能量集中;高頻分量上的信息分量多為零,細(xì)節(jié)信息豐富,能量較少。7.2相關(guān)原理圖像經(jīng)過二維小波分解后,可以得到四幅子圖像,,和)。它們分別表示在尺度上的水平低通-垂直低通子圖像,水平帶通-垂直低通子圖像,水平低通-垂直帶通子圖像,水平帶通-垂直帶通子圖像??梢詫ψ訄D像再次小波分解,得到尺度上的四幅子帶圖像,類似的可以對圖像再次分解,以此類推,可以得到圖像的多級小波分解,得到不同分辨的子帶圖像。圖7.1是圖像的三級小波分解表示水平低通-垂直低通子圖像,表示水平低通-垂直帶通子圖像,表示水平低通-垂直低通子圖像,水平帶通-垂直帶通子圖像(下標(biāo)表示不同的分辨率)。LL3HL3HL2HL1水平高通-垂直低通LH3HH3LH2HH2LH1水平低通-垂直高通HH1水平高通-垂直高通圖7.1圖像三級小波分解示意圖圖像經(jīng)過小波變換后,能夠獲得良好的空間一頻率多分辨率表示,小波變換具有以下主要特征:(1)不僅保持原圖像的空間特性,而且很好的提取了圖像的高頻信息。在低頻處有很好的頻率特性,在高頻處有很好的空間選擇性;(2)小波分量

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論