97骚碰,毛片大片免费看,亚洲第一天堂,99re思思,色好看在线视频播放,久久成人免费大片,国产又爽又色在线观看

數字圖像處理實(shí)驗報告

時(shí)間:2024-10-12 09:18:10 報告 我要投稿

數字圖像處理實(shí)驗報告

  數字圖像處理實(shí)驗報告1

  一. 實(shí)驗內容:

數字圖像處理實(shí)驗報告

  主要是圖像的幾何變換的編程實(shí)現,具體包括圖像的讀取、改寫(xiě),圖像平移,圖像的鏡像,圖像的轉置,比例縮放,旋轉變換等.

  具體要求如下:

  1.編程實(shí)現圖像平移,要求平移后的圖像大小不變;

  2.編程實(shí)現圖像的鏡像;

  3.編程實(shí)現圖像的轉置;

  4.編程實(shí)現圖像的比例縮放,要求分別用雙線(xiàn)性插值和最近鄰插值兩種方法來(lái)實(shí)

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

  5.編程實(shí)現以任意角度對圖像進(jìn)行旋轉變換,要求分別用雙線(xiàn)性插值和最近鄰插

  值兩種方法來(lái)實(shí)現,并比較兩種方法的旋轉效果.

  二.實(shí)驗目的和意義:

  本實(shí)驗的目的是使學(xué)生熟悉并掌握圖像處理編程環(huán)境,掌握圖像平移、鏡像、轉置和旋轉等幾何變換的方法,并能通過(guò)程序設計實(shí)現圖像文件的讀、寫(xiě)操作,及圖像平移、鏡像、轉置和旋轉等幾何變換的程序實(shí)現.

  三.實(shí)驗原理與主要框架:

  3.1 實(shí)驗所用編程環(huán)境:

  Visual C++(簡(jiǎn)稱(chēng)VC)是微軟公司提供的基于C/C++的應用程序集成開(kāi)發(fā)工具.VC擁有豐富的功能和大量的擴展庫,使用它能有效的創(chuàng )建高性能的Windows應用程序和Web應用程序.

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

  VC豐富的功能和大量的擴展庫,類(lèi)的重用特性以及它對函數庫、DLL庫的.支持能使程序更好的模塊化,并且通過(guò)向導程序大大簡(jiǎn)化了庫資源的使用和應用程序的開(kāi)發(fā),正由于VC具有明顯的優(yōu)勢,因而我選擇了它來(lái)作為數字圖像幾何變換的開(kāi)發(fā)工具.

  在本程序的開(kāi)發(fā)過(guò)程中,VC的核心知識、消息映射機制、對話(huà)框控件編程等都得到了生動(dòng)的體現和靈活的應用.

  3.2 實(shí)驗處理的對象: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個(gè)表項

  16色DIB有16個(gè)表項或更少

  256色DIB有256個(gè)表項或更少

  真彩色DIB沒(méi)有調色板

  每個(gè)表項長(cháng)度為4字節(32位)

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

  每一行的字節數必須是4的整數

  倍BITMAPINFOHEADER 位圖信息頭 Palette 調色板 DIB Pixels DIB圖像數據

  1. BMP文件組成

  BMP文件由文件頭、位圖信息頭、顏色信息和圖形數據四部分組成.

  2. BMP文件頭

  BMP文件頭數據結構含有BMP文件的類(lèi)型(必須為BMP)、文件大小(以字節為單位)、位圖文件保留字(必須為0)和位圖起始位置(以相對于位圖

  文件頭的偏移量表示)等信息.

  3. 位圖信息頭

  BMP位圖信息頭數據用于說(shuō)明位圖的尺寸(寬度,高度等都是以像素為單位,大小

  以字節為單位, 水平和垂直分辨率以每米像素數為單位) ,目標設備的級別,每個(gè)像素所需的位數, 位圖壓縮類(lèi)型(必須是 0)等信息.

  4. 顏色表

  顏色表用于說(shuō)明位圖中的顏色,它有若干個(gè)表項,每一個(gè)表項是一個(gè)RGBQUAD

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

  位圖信息頭和顏色表組成位圖信息

  5. 位圖數據

  位圖數據記錄了位圖的每一個(gè)像素值,記錄順序是在掃描行內是從左到右,掃描

  行之間是從下到上.

  Windows規定一個(gè)掃描行所占的字節數必須是 4的倍數(即以long為單位),不足的以0填充.

  3.3 BMP(BIT MAP )位圖的顯示:

 、僖话泔@示方法:

  1. 申請內存空間用于存放位圖文件

  2. 位圖文件讀入所申請內存空間中

  3. 在函數中用創(chuàng )建顯示用位圖, 用函數創(chuàng )建兼容DC,用函數選擇顯示刪除位圖

  但以上方法的缺點(diǎn)是: 1)顯示速度慢; 2) 內存占用大; 3) 位圖在縮小顯示時(shí)圖形失真大,(可通過(guò)安裝字體平滑軟件來(lái)解決); 4) 在低顏色位數的設備上(如256顯示模式)顯示高顏色位數的圖形(如真彩色)圖形失真嚴重.

 、贐MP位圖縮放顯示 :

  用視頻函數來(lái)顯示位圖,內存占用少,速度快,而且還可以對圖形進(jìn)行淡化(Dithering )處理.淡化處理是一種圖形算法,可以用來(lái)在一個(gè)支持比圖像所用顏色要少的設備上顯示彩色圖像.BMP位圖顯示方法如下:

  1. 打開(kāi)視頻函數,一般放在在構造函數中

  2. 申請內存空間用于存放位圖文件

  3. 位圖文件讀入所申請內存空間中

  4. 在 函數中 顯示位圖

  5. 關(guān)閉視頻函數 ,一般放在在析構函數中

  以上方法的優(yōu)點(diǎn)是: 1)顯示速度快; 2) 內存占用少; 3) 縮放顯示時(shí)圖形失真小,4) 在低顏色位數的設備上顯示高顏色位數的圖形圖形時(shí)失真小; 5) 通過(guò)直接處理位圖數據,可以制作簡(jiǎn)單動(dòng)畫(huà).

  3.4 程序中用到的訪(fǎng)問(wèn)函數

  Windows支持一些重要的DIB訪(fǎng)問(wèn)函數,但是這些函數都還沒(méi)有被封裝到MFC中,這些函數主要有:

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

  示時(shí)不進(jìn)行縮放處理.

  2. StretchDIBits函數:該函數可以縮放顯示DIB于顯示器和打印機上.

  3. GetDIBits函數:還函數利用申請到的內存,由GDI位圖來(lái)構造DIB.通過(guò)該函數,

  可以對DIB的格式進(jìn)行控制,可以指定每個(gè)像素顏色的位數,而且可以指定是否進(jìn)行壓縮.

  4. CreateDIBitmap函數:利用該函數可以從DIB出發(fā)來(lái)創(chuàng )建GDI位圖.

  5. CreateDIBSection函數:該函數能創(chuàng )建一種特殊的DIB,稱(chēng)為DIB項,然后返回

  一個(gè)GDI位圖句柄.

  6. LoadImage函數:該函數可以直接從磁盤(pán)文件中讀入一個(gè)位圖,并返回一個(gè)DIB

  句柄.

  7. DrawDibDraw函數:Windows提供了窗口視頻(VFW)組件,Visual C++支持該

  組件.VFW中的DrawDibDraw函數是一個(gè)可以替代StretchDIBits的函數.它的最主要的優(yōu)點(diǎn)是可以使用抖動(dòng)顏色,并且提高顯示DIB的速度,缺點(diǎn)是必須將VFW代碼連接到進(jìn)程中.

  3.5 圖像的幾何變換

  圖像的幾何變換,通常包括圖像的平移、圖像的鏡像變換、圖像的轉置、圖像的縮放和圖像的旋轉等.

  數字圖像處理實(shí)驗報告2

  一、實(shí)驗的目的和意義

  實(shí)驗目的:本實(shí)驗內容旨在讓學(xué)生通過(guò)用VC等高級語(yǔ)言編寫(xiě)數字圖像處理的一些基本算法程序,來(lái)鞏固和掌握圖像處理技術(shù)的基本技能,提高實(shí)際動(dòng)手能力,并通過(guò)實(shí)際編程了解圖像處理軟件的實(shí)現的基本原理。為學(xué)生進(jìn)一步學(xué)習數字攝影測量、遙感和地理信息系統等專(zhuān)業(yè)課程以及應用圖像處理解決實(shí)際問(wèn)題奠定基礎。

  二、實(shí)驗原理和方法

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

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

  BMP格式:BMP文件數據區按圖像上下行到上行、左列列到右列順序存儲到數據區。BMP文件由文件頭、信息頭、顏色表、數據區四個(gè)部分組成。

  做Raw格式文件到BMP格式文件的轉化,先要為BMP格式文件申請四部分的內存:文件頭,位圖信息頭,顏色表,圖象數據,然后根據輸入值以及Raw文件信息,BMP格式文件信息計算出這幾部分的值,賦給他們,寫(xiě)到BMP文件中去。

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

  灰度變化是點(diǎn)運算,將原圖象的每個(gè)像素的灰度值改成線(xiàn)性變化之后的灰度即可。

  灰度的線(xiàn)性變換就是指圖像的中所有點(diǎn)的灰度按照線(xiàn)性灰度變換函數進(jìn)行變換;叶茸儞Q方程如下:

  該方程為線(xiàn)性方程。式中參數 為輸入圖像的像素的灰度值,參數 為輸出圖像的

  灰度值。

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

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

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

  如果算出來(lái)的值大于255,則讓它等于255,小于0則讓其等于0。

  (3) 局部處理(3*3高通濾波,3*3低通濾波):

  局部處理在處理某一像素時(shí),利用與該像素相鄰的一組像素,經(jīng)過(guò)某種變換得到處理后圖像中某一點(diǎn)的像素值。目標像素的鄰域一般是由像素組成的二維矩陣,該矩陣的大小為奇數,目標像素位于該矩陣的中央,即目標像素就是區域的中心像素。經(jīng)過(guò)處理后,目標像素的值為經(jīng)過(guò)特定算法計算后所得的結果。

  實(shí)際上都是利用卷積來(lái)實(shí)現的,卷積往往用一個(gè)矩陣表示,將矩陣的中心對齊某個(gè)像素,矩陣中的值乘到相應的像素中去,然后將所有乘積加起來(lái)就得到中心像素的灰度值。邊界像素不做處理,仍為原來(lái)的灰度值。求出的像素灰度值若超過(guò)[0~255],則向離其最近的屬于該范圍的像素值靠攏。

  3*3低通濾波的算子見(jiàn)表1。

  3*3高通濾波的算子見(jiàn)表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) 圖象幾何處理(圖象平移,圖象縮放):

  對于圖像平移來(lái)說(shuō),若平移量是(tx,ty),像素在原圖像中的坐標為(x0,y0),則變化后的坐標為(x1,y1),x1=x0+tx,y1=y0+ty。平移只需改變像素的灰度值,不必改變位圖信息頭和調色板內容。

  對于圖像縮放,假設放大因子為ratio,縮放的變換矩陣為:

  圖像信息頭中新圖像的寬度和高度都變?yōu)樵瓉?lái)寬度和高度分別與水平垂直比例的乘積,圖像大小變?yōu)樾聦挾?變?yōu)?的整數倍)與新高度的乘積。

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

  中值濾波也屬于局部處理的一種,將窗口中的各個(gè)像素排序之后排序,取中值賦給模板中心的像素,所以窗口中個(gè)數一般是基數。

  我用的中值濾波窗口是十字絲的9個(gè)數的窗口。

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

  邊緣檢測有三種算子:Roberts,Prewit,Sobel。三種算子都是做一階差分的,通過(guò)算子算出各個(gè)像素的梯度值,將水平梯度的絕對值和垂直梯度的絕對值相加,若此梯度值大于某個(gè)閾值,則將其灰度值賦為255,否則賦為0。

  (7) 圖象旋轉:

  圖像旋轉一般是以圖像中心為中心順時(shí)針旋轉,利用圖像的四個(gè)角點(diǎn)求出圖像旋轉后的大小。

  先計算以圖像中心為原點(diǎn)坐標系下原圖像四個(gè)角點(diǎn)的坐標值,按照旋轉矩陣計算其旋轉之后的坐標值,根據四個(gè)角點(diǎn)的新坐標值計算出最大寬度和高度作為新圖像的寬度和高度值,按照計算值修改位圖信息頭,申請一塊新內存,存儲旋轉后圖像的灰度值。

  旋轉矩陣如下:

  同樣要求各個(gè)像素在原圖像中的坐標,先將新圖像的坐標系平移到圖像中心,做逆時(shí)針旋轉,然后再平移到屏幕左上角,然后將原圖像對應坐標的值賦給新圖像。

  (8) 圖象二值化:

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

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

  搜尋到閾值之后,灰度值小于閾值的像素賦0,其他的賦1,修改文件信息頭,調色板,申請新內存。

  (9) 圖象直方圖:

  統計各灰度值出現的頻數,以及像素的總個(gè)數,用頻數除以總個(gè)數作為頻率,以灰度值作為橫坐標,頻率作為縱坐標繪圖。

  三、實(shí)驗過(guò)程和步驟

  首先要建立一個(gè)基于MFC的多文檔工程,將視圖基類(lèi)改為滾動(dòng)視圖,以自己的學(xué)號命名。

  我用的是書(shū)上給的CDib類(lèi),類(lèi)里面有獲取BMP寬度,高度的函數,有指向位圖信息頭的指針,指向圖象數據的指針,因此我在文檔類(lèi)(Doc類(lèi))里定義了一個(gè)CDib類(lèi)的對象,打開(kāi)以及保存文件的時(shí)候利用這個(gè)對象去調用CDib里讀取與存儲文件的函數,并且可以利用這個(gè)對象的兩個(gè)指針對打開(kāi)的圖象進(jìn)行各種操作。

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

  首先建立一個(gè)RawToBMP的對話(huà)框,在上面加上四個(gè)編輯框(一個(gè)輸入打開(kāi)文件的路徑一個(gè)輸入保存文件的路徑,另兩個(gè)),兩個(gè)按鈕,以及默認的確認,取消按鈕。利用類(lèi)向導插入此對話(huà)框類(lèi),并且為前兩個(gè)編輯框定義CString的`兩個(gè)變量,用來(lái)存儲打開(kāi)與保存文件的路徑。同時(shí)為兩個(gè)瀏覽按鈕添加消息響應函數,在消息函數里創(chuàng )建CFileDialog對象,利用此對象的函數將兩個(gè)路徑值賦給前兩個(gè)編輯框的成員變量。再為OK鍵添加消息響應函數,分別定義BMP格式文件前三部分數據變量,計算出各變量的值,并且利用一個(gè)CFile對象獲取Raw圖象的數據,利用另一個(gè)CFile對象將數據存儲到所輸入的路徑的文件中去,CFile對象的Read函數會(huì )自動(dòng)創(chuàng )建一個(gè)文件。

  然后在菜單上新建一個(gè)菜單,為菜單添加消息響應函數,在其消息響應函數里創(chuàng )建RowToBMP對話(huà)框。這樣點(diǎn)擊菜單后就會(huì )彈出一個(gè)對話(huà)框,按確定鍵之后就可以讀取Raw文件并且存儲BMP文件,完成整個(gè)消息循環(huán)。

  2.灰度圖象的線(xiàn)性拉伸:

  創(chuàng )建一個(gè)對話(huà)框來(lái)輸入變化后的灰度值,為對話(huà)框的兩個(gè)編輯框定義成員變量,在文檔類(lèi)中添加處理函數,按照對話(huà)框輸入值計算出fA與fB,做一個(gè)循環(huán),將0到255的灰度值,計算出拉伸后的灰度值(超限情況特殊處理),存放在下標為此值的一個(gè)數組中,然后利用文檔類(lèi)的中定義的CDib類(lèi)的成員變量m_DIB,獲得當前打開(kāi)的圖像指向圖像數據部分的指針m_DIB.m_pBits,在數組中查出每個(gè)像素變化后的灰度值,并將此值賦給指針m_pBits指向的內存。刷新視圖。

  然后在菜單中加上線(xiàn)性拉伸的菜單,為該菜單的ID添加消息響應函數,在該函數中創(chuàng )建對話(huà)框,并調用文檔類(lèi)線(xiàn)性拉伸的函數,將對話(huà)框的兩個(gè)成員變量傳給此函數。

  3.局部處理:

  在文檔類(lèi)里添加低通濾波和高通濾波的成員函數,在函數中使用m_DIB對象中指向圖像數據部分的指針m_pBits,首先申請一個(gè)新內存,將原來(lái)圖像的灰度值存儲起來(lái),然后定義9個(gè)BYTE類(lèi)型的指針,利用雙重嵌套循環(huán),在循環(huán)中每次用這9個(gè)指針指向復制圖像對應模板中的9個(gè)數,然后按照模板中的數值計算出中心像素的灰度值,判斷是否超過(guò)范圍,如果超過(guò)范圍則做相應的處理,否則將此值直接賦給m_pBits中對應的中心像素。循環(huán)之后刷新視圖。

  添加局部處理的菜單,為菜單設置消息響應函數,在菜單消息響應函數中調用文檔類(lèi)的函數,完成對m_DIB的處理。

  4.圖像幾何變換:

  建立平移對話(huà)框,定義兩個(gè)成員變量,分別存儲輸入的水平位移和垂直位移。

  在文檔類(lèi)里添加平移函數,申請一塊新內存復制原圖像的信息,在函數中將

  外層循環(huán)變量i視為縱坐標,內層循環(huán)變量j視為橫坐標,通過(guò)雙重循環(huán),對每個(gè)像素,求出其在原圖像中的坐標(i0,j0),將復制圖像中的對應(i0,j0)的像素灰度值賦給m_DIB.m_pBits指針中的圖像。如果在原圖像中找不到該像素,置為背景色。刷新視圖。

  在菜單中添加圖像平移菜單,并為該菜單添加消息響應函數,在此函數中創(chuàng )建平移對話(huà)框,調用文檔類(lèi)的平移函數,將對話(huà)框的成員變量傳入該函數。

  建立縮放對話(huà)框類(lèi),為此類(lèi)定義兩個(gè)成員變量,存儲輸入的水平縮放因子和垂直縮放因子。

  再在文檔類(lèi)中添加縮放函數,利用m_DIB.m_pBMI(指向位圖信息頭的指針),修改位圖信息頭中的寬度,高度,圖像大小。計算出新圖像的大小,申請一塊新內存存儲新圖像,同平移函數一樣,計算出每個(gè)像素在原圖像中的坐標,i0=i/PRatio,j0=j/VRatio,PRatio與VRatio分別為水平縮放因子和垂直縮放因子。將原圖像中對應坐標的灰度值賦給新內存,然后將m_DIB.m_pBits(指向圖像數據的指針)指向新內存,刷新視圖。

  5.中值濾波:

  在文檔類(lèi)中添加兩個(gè)成員函數。一個(gè)用來(lái)把傳入的指針里的內容排序,一個(gè)用來(lái)做中值濾波。也要申請一塊新內存來(lái)復制原圖像的信息,雙重嵌套循環(huán),邊界像素不處理,對每個(gè)像素,使用一個(gè)大小為9個(gè)字節的數組來(lái)存放復制圖像窗口中各像素值,然后將數組首地址傳入排序的函數中,將中間的值賦給當前圖像窗口中心的像素。排序函數我用的是快速排序法。

  在菜單中添加中值濾波菜單項,為其添加消息響應函數,調用文檔類(lèi)的中值濾波函數。

  6.邊緣檢測:

  在文檔類(lèi)中定義三個(gè)函數,分別為Roberts,Prewit,Sobel算子處理函數,處理時(shí),先申請新內存復制原來(lái)圖像信息,邊界像素不作處理,對每個(gè)像素值,求出其在復制圖像中的梯度,判斷,若梯度值大于150(這個(gè)是我自己定的),則將灰度值賦為255,否則置零。

  菜單中添加邊緣檢測菜單,置屬性為Pop—up,添加三個(gè)下一級菜單,分別為Roberts,Prewit,Sobel,各個(gè)菜單的消息響應函數中調用文檔類(lèi)中各自的處理函數。

  7.圖像旋轉:

  創(chuàng )建一個(gè)對話(huà)框輸入旋轉角度,在文檔類(lèi)中添加成員函數。

  先將角度化為弧度值。

  計算原圖像四個(gè)角點(diǎn)的坐標,以及新圖像四個(gè)角點(diǎn)的坐標。

  根據新圖像四個(gè)角點(diǎn)的坐標,取對角線(xiàn)上兩個(gè)點(diǎn)橫坐標差值較大值作為寬度,縱坐標差值較大值作為高度。

  根據計算出來(lái)的高度和寬度修改文件信息頭,并且申請內存存儲新圖像。

  計算每點(diǎn)的像素在原來(lái)圖像中的坐標從而獲取其灰度值,寫(xiě)入新內存。

  將m_DIB.m_pBits指向該新內存。刷新視圖。

  添加圖像旋轉菜單,在菜單響應函數中創(chuàng )建對話(huà)框,調用文檔類(lèi)中旋轉函數,將對話(huà)框中獲取的角度傳給旋轉函數。

  8.圖像二值化:

  在文檔類(lèi)添加一個(gè)成員函數,根據傳人的圖像和閾值返回組間方差和組內方差的比值。

  再添加一個(gè)成員函數,進(jìn)行二值化。

  在函數中:

  計算新BMP文件的大小,申請一塊新內存,存儲新的整個(gè)BMP文件的信息,將位圖信息頭中biBitCount置為1,調色板數組只有兩個(gè)兩個(gè)元素,下標為0的三個(gè)灰度值都為0,下標為1的三個(gè)灰度值為255。

  從最大灰度值到最小灰度值之間搜尋上述函數返回值最大的值,作為閾值。

  對每個(gè)像素,若其原來(lái)灰度值小于閾值,賦1,否則賦0。

  將m_DIB,m_pBits指向新內存的圖像數據部分,m_DIB.m_pBMI指向位圖信息頭。

  9.圖像直方圖:

  為文檔類(lèi)添加一個(gè)int型指針成員變量m_pGray,在構造函數中將該指針賦空,在文檔類(lèi)中定義了一個(gè)函數,統計各個(gè)灰度值出現的頻數,申請一個(gè)內存,存儲在這個(gè)內存中,并將m_pGray指向它。

  創(chuàng )建一個(gè)畫(huà)直方圖的對話(huà)框,添加Picture控件,在控件里調用文檔類(lèi)成員變量,畫(huà)直方圖。添加一個(gè)滾動(dòng)條,用來(lái)確定閾值,為滾動(dòng)條添加消息響應函數,按照滾動(dòng)條的值進(jìn)行二值化。

  在菜單中添加直方圖菜單,添加消息響應函數,在響應函數中創(chuàng )建直方圖對話(huà)框對象。

  最后,因為我開(kāi)始做工程的時(shí)候沒(méi)有把菜單設計好,做得有點(diǎn)亂,所以,我又在View里添加WM_CONTEXTMENU消息響應函數,在函數體內用CMenu類(lèi)來(lái)實(shí)現彈出菜單。

  四、結果分析與評價(jià)

  (1)Raw格式到BMP格式的轉換:效果見(jiàn)圖1。

  圖表 1

  老師說(shuō)在轉化的時(shí)候后面用一個(gè)循環(huán)會(huì )降低效率,但是實(shí)際上只要寬度是4的整數倍,后面的循環(huán)就不會(huì )做了。所以這個(gè)算法效率我覺(jué)得還行吧。

  (2)線(xiàn)性變化:輸入線(xiàn)性變化范圍10~20,效果見(jiàn)圖2。

  圖表 2

  用了線(xiàn)性查找表之后,這個(gè)算法的效率應該會(huì )高很多,但是我的算法里是線(xiàn)性表從0~255都有變化之后的值,實(shí)際上,如果圖片的灰度范圍小一些的話(huà),做了很多無(wú)用的計算,而且前面已經(jīng)搜尋過(guò)原圖像的最大最小灰度值了,所以線(xiàn)性表的生成循環(huán)可以只從最小灰度做到最大灰度。另外,我設計的算法里,如果最大值和最小值輸反了的話(huà),程序會(huì )自動(dòng)交換他們的值,做這個(gè)可能就會(huì )多算一些東西了。

  (3)低通濾波:效果見(jiàn)圖3。

  圖表 3

  取的是8鄰域內的平均值,效果不是很好。

  高通濾波:效果見(jiàn)圖4。

  圖表 4

  基本上我覺(jué)得邊緣還是有突出了吧。

  中值濾波:效果見(jiàn)圖5。

  圖表 5

  這個(gè)中值濾波的效果我還是比較滿(mǎn)意的,因為排序所以要調用其他函數,我用了快速排序,而且用的是9個(gè)數的十字絲窗口,所以速度要比25個(gè)數的窗口快一些。平滑的效果出來(lái)還可以。

  (4)邊緣檢測:

  Roberts算子:效果見(jiàn)圖6。

  圖表 6

  Prewit算子:效果見(jiàn)圖7。

  圖表 7

  Sobel算子:效果見(jiàn)圖8。

  圖表 8

  由于Prewit算子和Sobel算子都用了8個(gè)數去做,所以效果要好一些,相比之下,Sobel算子對這幅圖又要效果好些,應該是對4鄰域賦予了更大權的緣故。但是后兩種算法計算量也要大一些。

  (5)圖像平移:效果見(jiàn)圖9。

  圖表 9

  這個(gè)圖像平移量比較大,所以被裁切的也顯得不真實(shí)了。主要是因為我的圖像大小和坐標都沒(méi)有變化,所以只在原來(lái)的圖像坐標范圍內顯示平移后的圖像,實(shí)際上,我既可以改變圖像的大小,并且為了節省計算,可以讓循環(huán)變量i和j從一個(gè)新的值開(kāi)始做計算,前面的全都賦背景色。

  圖像縮放:水平比例0.4,垂直比例0.5,效果見(jiàn)圖10。

  圖表 10

  在此基礎上旋轉:效果見(jiàn)圖11。

  圖表 11

  這幾種算法主要的計算量都在for循環(huán)內,所以要想優(yōu)化算法的話(huà),必須簡(jiǎn)化循環(huán)里的計算。不過(guò)我的想法差不多跟書(shū)上的差不多,還沒(méi)有什么優(yōu)化。也許,這種優(yōu)化的算法需要看很多別人做的好程序才能慢慢自己學(xué)會(huì )吧。

  (6)二值化(判斷分析法):效果見(jiàn)圖12。

  圖表 12

  實(shí)際上,我用直方圖看的最佳閾值應該在100多左右,而我做的程序閾值好像偏小一些,所以效果不太好,我計算組間方差和組內方差的時(shí)候調用了一個(gè)函數專(zhuān)門(mén)求閾值,可能這里的計算還是有一點(diǎn)問(wèn)題。而且在我的函數里,要256次調用這個(gè)函數,又因為計算機是按字節處理數據的,因此寫(xiě)圖像數據的時(shí)候要用每8個(gè)寫(xiě)到一個(gè)數組中,然后通過(guò)計算得到字節類(lèi)型的值,這些都使得我的算法效率比較低,最后一個(gè)問(wèn)題,我覺(jué)得如果使用位運算會(huì )快一些,但是前面的問(wèn)題還沒(méi)有想到比較好的解決方法。

  (7)直方圖:效果見(jiàn)圖13。

  這個(gè)圖像255的像素太多,如果我沒(méi)算錯的話(huà),量化應該不是很好吧。

  圖表 13

  五、實(shí)驗總結與體會(huì )

  這次實(shí)驗學(xué)到最大的東西,是自己總算有MFC編程的概念了,雖然自己VC++考試的分數還不錯,但是里面的很多東西,不通過(guò)自己的編程時(shí)絕對不能真正理解。比如說(shuō)封裝性,這次用CDib的方便,很好地利用了類(lèi)的封裝性。另外,比如MFC是基于消息響應機制的,這就決定了,要利用鼠標或者菜單響應函數去實(shí)現功能,而用c語(yǔ)言編寫(xiě)程序的時(shí)候,完全是按主函數的線(xiàn)程來(lái)的。

  另外,我也學(xué)會(huì )了調試的真正含義。以前都只知道那幾個(gè)按鍵是做什么用的,調試的真正目的,是根據自己的算法來(lái)檢驗程序計算的各個(gè)值是否符合,從而可以很快速方便地查到自己的錯誤。

  自學(xué)也是很重要的一方面。實(shí)際上,在現在來(lái)說(shuō),用MSDN也不是很難的事了,我們不應該被英文打到,而且現在,隨著(zhù)對一些專(zhuān)有名詞熟悉了之后,看MSDN也容易一些了,萬(wàn)一不懂的函數,也可以利用網(wǎng)絡(luò )查到很多函數功能用法的解釋。

  剛開(kāi)始的時(shí)候做的是位圖的讀取和顯示,實(shí)在是不知從哪里做起,所以就照著(zhù)實(shí)驗書(shū)上敲了前面的部分,但是慢慢地也看懂了代碼的意思。所以后來(lái)的基本上都是自己做的了,但是算法還是基本上和書(shū)上差不多。不過(guò)自己編的時(shí)候還是有很多細節的部分沒(méi)有注意到,比如說(shuō),強制數據類(lèi)型轉換,我自己編的時(shí)候沒(méi)有注意這個(gè)問(wèn)題,結果出了很多錯,有些事由于函數調用引起的,有些是由于不等號兩邊數據的匹配問(wèn)題,還有的是由于指針的移動(dòng),直到這個(gè)時(shí)候,才真正明白實(shí)驗書(shū)上程序為什么那么多強制類(lèi)型轉換,雖然書(shū)上很多東西不是盡善盡美,但是對于我這種剛開(kāi)始學(xué)會(huì )編程的人還是有很多可以學(xué)習的地方的。

  如老師所說(shuō),算法的效率是很重要的。要提高算法的效率,一個(gè)是要簡(jiǎn)化計算(不得不說(shuō),這需要數學(xué)基礎),另外一個(gè)就是要避免許多重復的計算。在參考書(shū)上的程序里,很多時(shí)候,為了避免這種重復的計算(在循環(huán)中表現尤其明顯),會(huì )把某些數當常數算出來(lái),只要后來(lái)加上這個(gè)常數就可以,這樣,效率高很多。

  另外,對許多出錯的情況,我的程序里也沒(méi)有做好。比如,如果打開(kāi)的不是8位圖像,我的程序不會(huì )提示錯誤,正常結束,而可能做錯,所以,這也是我應該向別人程序學(xué)習的地方。

  最后一個(gè),自己菜單的布局也是很亂的。要從一開(kāi)始就布局好。

【數字圖像處理實(shí)驗報告】相關(guān)文章:

實(shí)驗報告范文03-15

實(shí)驗報告總結02-15

大學(xué)實(shí)驗報告03-08

示波器實(shí)驗報告04-22

生物實(shí)驗報告03-31

科技實(shí)驗報告05-25

實(shí)驗報告優(yōu)秀03-28

什么是實(shí)驗報告以及實(shí)驗報告應該怎么寫(xiě)11-16

實(shí)驗報告 范本02-02

龙泉市| 南乐县| 岢岚县| 江门市| 大埔区| 栾城县| 布拖县| 庄河市| 贵阳市| 长沙县| 遂平县| 十堰市| 柞水县| 万源市| 白银市| 微博| 陆川县| 广东省| 井冈山市| 黄山市| 宜城市| 毕节市| 长治县| 谢通门县| 镇坪县| 孝义市| 香河县| 忻州市| 怀来县| 荥经县| 晋州市| 万荣县| 武穴市| 长垣县| 潼南县| 南木林县| 兴安县| 温宿县| 丘北县| 谢通门县| 隆安县|