數字影象處理實驗報告

數字影象處理實驗報告

  數字影象處理實驗報告1

  一. 實驗內容:

  主要是影象的幾何變換的程式設計實現,具體包括影象的讀取、改寫,影象平移,影象的映象,影象的轉置,比例縮放,旋轉變換等.

  具體要求如下:

  1.程式設計實現影象平移,要求平移後的影象大小不變;

  2.程式設計實現影象的映象;

  3.程式設計實現影象的轉置;

  4.程式設計實現影象的比例縮放,要求分別用雙線性插值和最近鄰插值兩種方法來實

  現,並比較兩種方法的縮放效果;

  5.程式設計實現以任意角度對影象進行旋轉變換,要求分別用雙線性插值和最近鄰插

  值兩種方法來實現,並比較兩種方法的旋轉效果.

  二.實驗目的和意義:

  本實驗的目的是使學生熟悉並掌握影象處理程式設計環境,掌握影象平移、映象、轉置和旋轉等幾何變換的方法,並能透過程式設計實現影象檔案的讀、寫操作,及影象平移、映象、轉置和旋轉等幾何變換的程式實現.

  三.實驗原理與主要框架:

  3.1 實驗所用程式設計環境:

  Visual C++(簡稱VC)是微軟公司提供的基於C/C++的應用程式整合開發工具.VC擁有豐富的功能和大量的擴充套件庫,使用它能有效的建立高效能的Windows應用程式和Web應用程式.

  VC除了提供高效的C/C++編譯器外,還提供了大量的可重用類和元件,包括著名的微軟基礎類庫(MFC)和活動模板類庫(ATL),因此它是軟體開發人員不可多得的開發工具.

  VC豐富的功能和大量的擴充套件庫,類的重用特性以及它對函式庫、DLL庫的支援能使程式更好的模組化,並且透過嚮導程式大大簡化了庫資源的使用和應用程式的開發,正由於VC具有明顯的優勢,因而我選擇了它來作為數字影象幾何變換的開發工具.

  在本程式的開發過程中,VC的核心知識、訊息對映機制、對話方塊控制元件程式設計等都得到了生動的體現和靈活的應用.

  3.2 實驗處理的物件:256色的BMP(BIT MAP )格式影象

  BMP(BIT MAP )點陣圖的檔案結構:

  具體組成圖: BITMAPFILEHEADER

  點陣圖檔案頭

  (只用於BMP檔案) bfType=”BM” bfSize bfReserved1

  bfReserved2

  bfOffBits

  biSize

  biWidth

  biHeight

  biPlanes

  biBitCount

  biCompression

  biSizeImage

  biXPelsPerMeter

  biYPelsPerMeter

  biClrUsed

  biClrImportant

  單色DIB有2個表項

  16色DIB有16個表項或更少

  256色DIB有256個表項或更少

  真彩色DIB沒有調色盤

  每個表項長度為4位元組(32位)

  畫素按照每行每列的順序排列

  每一行的位元組數必須是4的整數

  倍BITMAPINFOHEADER 點陣圖資訊頭 Palette 調色盤 DIB Pixels DIB影象資料

  1. BMP檔案組成

  BMP檔案由檔案頭、點陣圖資訊頭、顏色資訊和圖形資料四部分組成.

  2. BMP檔案頭

  BMP檔案頭資料結構含有BMP檔案的型別(必須為BMP)、檔案大小(以位元組為單位)、點陣圖檔案保留字(必須為0)和點陣圖起始位置(以相對於點陣圖

  檔案頭的偏移量表示)等資訊.

  3. 點陣圖資訊頭

  BMP點陣圖資訊頭資料用於說明點陣圖的尺寸(寬度,高度等都是以畫素為單位,大小

  以位元組為單位, 水平和垂直解析度以每米畫素數為單位) ,目標裝置的級別,每個畫素所需的位數, 點陣圖壓縮型別(必須是 0)等資訊.

  4. 顏色表

  顏色表用於說明點陣圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD

  型別的結構,定義一種顏色.具體包含藍色、紅色、綠色的亮度(值範圍為0-255)

  點陣圖資訊頭和顏色表組成點陣圖資訊

  5. 點陣圖資料

  點陣圖資料記錄了點陣圖的每一個畫素值,記錄順序是在掃描行內是從左到右,掃描

  行之間是從下到上.

  Windows規定一個掃描行所佔的位元組數必須是 4的倍數(即以long為單位),不足的以0填充.

  3.3 BMP(BIT MAP )點陣圖的顯示:

  ①一般顯示方法:

  1. 申請記憶體空間用於存放點陣圖檔案

  2. 點陣圖檔案讀入所申請記憶體空間中

  3. 在函式中用建立顯示用點陣圖, 用函式建立相容DC,用函式選擇顯示刪除點陣圖

  但以上方法的缺點是: 1)顯示速度慢; 2) 記憶體佔用大; 3) 點陣圖在縮小顯示時圖形失真大,(可透過安裝字型平滑軟體來解決); 4) 在低顏色位數的裝置上(如256顯示模式)顯示高顏色位數的圖形(如真彩色)圖形失真嚴重.

  ②BMP點陣圖縮放顯示 :

  用影片函式來顯示點陣圖,記憶體佔用少,速度快,而且還可以對圖形進行淡化(Dithering )處理.淡化處理是一種圖形演算法,可以用來在一個支援比影象所用顏色要少的裝置上顯示彩色影象.BMP點陣圖顯示方法如下:

  1. 開啟影片函式,一般放在在建構函式中

  2. 申請記憶體空間用於存放點陣圖檔案

  3. 點陣圖檔案讀入所申請記憶體空間中

  4. 在 函式中 顯示點陣圖

  5. 關閉影片函式 ,一般放在在解構函式中

  以上方法的優點是: 1)顯示速度快; 2) 記憶體佔用少; 3) 縮放顯示時圖形失真小,4) 在低顏色位數的裝置上顯示高顏色位數的圖形圖形時失真小; 5) 透過直接處理點陣圖資料,可以製作簡單動畫.

  3.4 程式中用到的訪問函式

  Windows支援一些重要的DIB訪問函式,但是這些函式都還沒有被封裝到MFC中,這些函式主要有:

  1. SetDIBitsToDevice函式:該函式可以直接在顯示器或印表機上顯示DIB. 在顯

  示時不進行縮放處理.

  2. StretchDIBits函式:該函式可以縮放顯示DIB於顯示器和印表機上.

  3. GetDIBits函式:還函式利用申請到的記憶體,由GDI點陣圖來構造DIB.透過該函式,

  可以對DIB的格式進行控制,可以指定每個畫素顏色的位數,而且可以指定是否進行壓縮.

  4. CreateDIBitmap函式:利用該函式可以從DIB出發來建立GDI點陣圖.

  5. CreateDIBSection函式:該函式能建立一種特殊的DIB,稱為DIB項,然後返回

  一個GDI點陣圖控制代碼.

  6. LoadImage函式:該函式可以直接從磁碟檔案中讀入一個位圖,並返回一個DIB

  控制代碼.

  7. DrawDibDraw函式:Windows提供了視窗影片(VFW)元件,Visual C++支援該

  元件.VFW中的DrawDibDraw函式是一個可以替代StretchDIBits的函式.它的最主要的優點是可以使用抖動顏色,並且提高顯示DIB的速度,缺點是必須將VFW程式碼連線到程序中.

  3.5 影象的幾何變換

  影象的幾何變換,通常包括影象的平移、影象的映象變換、影象的轉置、影象的縮放和影象的旋轉等.

  數字影象處理實驗報告2

  一、實驗的目的和意義

  實驗目的:本實驗內容旨在讓學生透過用VC等高階語言編寫數字影象處理的一些基本演算法程式,來鞏固和掌握影象處理技術的基本技能,提高實際動手能力,並透過實際程式設計瞭解影象處理軟體的實現的基本原理。為學生進一步學習數字攝影測量、遙感和地理資訊系統等專業課程以及應用影象處理解決實際問題奠定基礎。

  二、實驗原理和方法

  (1) Raw格式到BMP格式的轉換:

  Raw格式:Raw格式檔案是按照數字影象組成的二維矩陣,將畫素按行列號順序儲存在檔案中。這種檔案只含有影象畫素資料,不含有資訊頭,因此,在讀影象時,需要根據檔案大小,計算影象所包含的行列號,或者需要事先知道影象大小(矩陣大小)。RAW檔案按影象上行到下行、左列到右列順序儲存。

  BMP格式:BMP檔案資料區按影象上下行到上行、左列列到右列順序儲存到資料區。BMP檔案由檔案頭、資訊頭、顏色表、資料區四個部分組成。

  做Raw格式檔案到BMP格式檔案的轉化,先要為BMP格式檔案申請四部分的記憶體:檔案頭,點陣圖資訊頭,顏色表,圖象資料,然後根據輸入值以及Raw檔案資訊,BMP格式檔案資訊計算出這幾部分的值,賦給他們,寫到BMP檔案中去。

  (2) 灰度圖象的線性拉伸:

  灰度變化是點運算,將原圖象的每個畫素的灰度值改成線性變化之後的灰度即可。

  灰度的線性變換就是指影象的中所有點的灰度按照線性灰度變換函式進行變換。灰度變換方程如下:

  該方程為線性方程。式中引數 為輸入影象的畫素的灰度值,引數 為輸出影象的

  灰度值。

  設原圖象的灰度範圍為[a,b],變化之後的範圍為[a’,b’],則:

  fA=(b’-a’)/(b-a)

  fB=-(b’-a’)/(b-a)*a+a’

  如果算出來的值大於255,則讓它等於255,小於0則讓其等於0。

  (3) 區域性處理(3*3高通濾波,3*3低通濾波):

  區域性處理在處理某一畫素時,利用與該畫素相鄰的一組畫素,經過某種變換得到處理後圖像中某一點的畫素值。目標畫素的鄰域一般是由畫素組成的二維矩陣,該矩陣的大小為奇數,目標畫素位於該矩陣的中央,即目標畫素就是區域的中心畫素。經過處理後,目標畫素的值為經過特定演算法計算後所得的結果。

  實際上都是利用卷積來實現的,卷積往往用一個矩陣表示,將矩陣的中心對齊某個畫素,矩陣中的值乘到相應的畫素中去,然後將所有乘積加起來就得到中心畫素的灰度值。邊界畫素不做處理,仍為原來的灰度值。求出的畫素灰度值若超過[0~255],則向離其最近的屬於該範圍的畫素值靠攏。

  3*3低通濾波的運算元見表1。

  3*3高通濾波的運算元見表2。

  表格 1

  1/9

  1/9

  1/9

  1/9

  1/9

  1/9

  1/9

  1/9

  1/9

  表格 2

  -1

  -1

  -1

  -1

  9

  -1

  -1

  -1

  -1

  (4) 圖象幾何處理(圖象平移,圖象縮放):

  對於影象平移來說,若平移量是(tx,ty),畫素在原影象中的座標為(x0,y0),則變化後的座標為(x1,y1),x1=x0+tx,y1=y0+ty。平移只需改變畫素的灰度值,不必改變點陣圖資訊頭和調色盤內容。

  對於影象縮放,假設放大因子為ratio,縮放的變換矩陣為:

  影象資訊頭中新影象的寬度和高度都變為原來寬度和高度分別與水平垂直比例的乘積,影象大小變為新寬度(變為4的整數倍)與新高度的乘積。

  (5) 灰度圖象中值濾波:

  中值濾波也屬於區域性處理的一種,將視窗中的各個畫素排序之後排序,取中值賦給模板中心的畫素,所以視窗中個數一般是基數。

  我用的中值濾波視窗是十字絲的9個數的視窗。

  (6) 灰度圖象邊緣檢測:

  邊緣檢測有三種運算元:Roberts,Prewit,Sobel。三種運算元都是做一階差分的,透過運算元算出各個畫素的梯度值,將水平梯度的絕對值和垂直梯度的絕對值相加,若此梯度值大於某個閾值,則將其灰度值賦為255,否則賦為0。

  (7) 圖象旋轉:

  影象旋轉一般是以影象中心為中心順時針旋轉,利用影象的四個角點求出影象旋轉後的大小。

  先計算以影象中心為原點座標系下原影象四個角點的座標值,按照旋轉矩陣計算其旋轉之後的座標值,根據四個角點的新座標值計算出最大寬度和高度作為新影象的寬度和高度值,按照計算值修改點陣圖資訊頭,申請一塊新記憶體,儲存旋轉後圖像的灰度值。

  旋轉矩陣如下:

  同樣要求各個畫素在原影象中的座標,先將新影象的座標系平移到影象中心,做逆時針旋轉,然後再平移到螢幕左上角,然後將原影象對應座標的值賦給新影象。

  (8) 圖象二值化:

  判斷分析法:假定影象的灰度區間為[0,L-1],則選擇一閾值T 將影象的畫素分為兩組。

  為最大值所對應的T,就是所求判斷分析法的分割閾值。

  搜尋到閾值之後,灰度值小於閾值的畫素賦0,其他的賦1,修改檔案資訊頭,調色盤,申請新記憶體。

  (9) 圖象直方圖:

  統計各灰度值出現的頻數,以及畫素的總個數,用頻數除以總個數作為頻率,以灰度值作為橫座標,頻率作為縱座標繪圖。

  三、實驗過程和步驟

  首先要建立一個基於MFC的多文件工程,將檢視基類改為滾動檢視,以自己的學號命名。

  我用的是書上給的CDib類,類裡面有獲取BMP寬度,高度的函式,有指向點陣圖資訊頭的指標,指向圖象資料的指標,因此我在文件類(Doc類)裡定義了一個CDib類的物件,開啟以及儲存檔案的時候利用這個物件去呼叫CDib裡讀取與儲存檔案的函式,並且可以利用這個物件的兩個指標對開啟的圖象進行各種操作。

  1.Raw格式到BMP格式的轉換:

  首先建立一個RawToBMP的對話方塊,在上面加上四個編輯框(一個輸入開啟檔案的路徑一個輸入儲存檔案的路徑,另兩個),兩個按鈕,以及預設的確認,取消按鈕。利用類嚮導插入此對話方塊類,並且為前兩個編輯框定義CString的兩個變數,用來儲存開啟與儲存檔案的路徑。同時為兩個瀏覽按鈕新增訊息響應函式,在訊息函數里建立CFileDialog物件,利用此物件的函式將兩個路徑值賦給前兩個編輯框的成員變數。再為OK鍵新增訊息響應函式,分別定義BMP格式檔案前三部分資料變數,計算出各變數的值,並且利用一個CFile物件獲取Raw圖象的資料,利用另一個CFile物件將資料儲存到所輸入的路徑的檔案中去,CFile物件的Read函式會自動建立一個檔案。

  然後在選單上新建一個選單,為選單新增訊息響應函式,在其訊息響應函數里建立RowToBMP對話方塊。這樣點選選單後就會彈出一個對話方塊,按確定鍵之後就可以讀取Raw檔案並且儲存BMP檔案,完成整個訊息迴圈。

  2.灰度圖象的線性拉伸:

  建立一個對話方塊來輸入變化後的灰度值,為對話方塊的兩個編輯框定義成員變數,在文件類中新增處理函式,按照對話方塊輸入值計算出fA與fB,做一個迴圈,將0到255的灰度值,計算出拉伸後的灰度值(超限情況特殊處理),存放在下標為此值的一個數組中,然後利用文件類的中定義的CDib類的成員變數m_DIB,獲得當前開啟的影象指

最近訪問