數字圖像處理實驗報告

數字圖像處理實驗報告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,獲得當前打開的圖像指

向圖像數據部分的指針m_DIB.m_pBits,在數組中查出每個像素變化後的灰度值,並將此值賦給指針m_pBits指向的記憶體。刷新視圖。

然後在選單中加上線性拉伸的選單,為該選單的ID添加訊息回響函式,在該函式中創建對話框,並調用文檔類線性拉伸的函式,將對話框的兩個成員變數傳給此函式。

3.局部處理:

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

添加局部處理的選單,為選單設定訊息回響函式,在選單訊息回響函式中調用文檔類的函式,完成對m_DIB的處理。

4.圖像幾何變換:

建立平移對話框,定義兩個成員變數,分別存儲輸入的水平位移和垂直位移。

在文檔類里添加平移函式,申請一塊新記憶體複製原圖像的信息,在函式中將

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

在選單中添加圖像平移選單,並為該選單添加訊息回響函式,在此函式中創建平移對話框,調用文檔類的平移函式,將對話框的成員變數傳入該函式。

建立縮放對話框類,為此類定義兩個成員變數,存儲輸入的水平縮放因子和垂直縮放因子。

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

5.中值濾波:

在文檔類中添加兩個成員函式。一個用來把傳入的指針里的內容排序,一個用來做中值濾波。也要申請一塊新記憶體來複製原圖像的信息,雙重嵌套循環,邊界像素不處理,對每個像素,使用一個大小為9個位元組的數組來存放複製圖像視窗中各像素值,然後將數組首地址傳入排序的函式中,將中間的值賦給當前圖像視窗中心的像素。排序函式我用的是快速排序法。

在選單中添加中值濾波選單項,為其添加訊息回響函式,調用文檔類的中值濾波函式。

6.邊緣檢測:

在文檔類中定義三個函式,分別為Roberts,Prewit,Sobel運算元處理函式,處理時,先申請新記憶體複製原來圖像信息,邊界像素不作處理,對每個像素值,求出其在複製圖像中的梯度,判斷,若梯度值大於150(這個是我自己定的),則將灰度值賦為255,否則置零。

選單中添加邊緣檢測選單,置屬性為Pop—up,添加三個下一級選單,分別為Roberts,Prewit,Sobel,各個選單的訊息回響函式中調用文檔類中各自的處理函式。

7.圖像旋轉:

創建一個對話框輸入旋轉角度,在文檔類中添加成員函式。

先將角度化為弧度值。

計算原圖像四個角點的坐標,以及新圖像四個角點的坐標。

根據新圖像四個角點的坐標,取對角線上兩個點橫坐標差值較大值作為寬度,縱坐標差值較大值作為高度。

根據計算出來的高度和寬度修改檔案信息頭,並且申請記憶體存儲新圖像。

計算每點的像素在原來圖像中的坐標從而獲取其灰度值,寫入新記憶體。

將m_DIB.m_pBits指向該新記憶體。刷新視圖。

添加圖像旋轉選單,在選單回響函式中創建對話框,調用文檔類中旋轉函式,將對話框中獲取的角度傳給旋轉函式。

8.圖像二值化:

在文檔類添加一個成員函式,根據傳人的圖像和閾值返回組間方差和組內方差的比值。

再添加一個成員函式,進行二值化。

在函式中:

計算新BMP檔案的大小,申請一塊新記憶體,存儲新的整個BMP檔案的信息,將點陣圖信息頭中biBitCount置為1,調色板數組只有兩個兩個元素,下標為0的三個灰度值都為0,下標為1的三個灰度值為255。

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

對每個像素,若其原來灰度值小於閾值,賦1,否則賦0。

將m_DIB,m_pBits指向新記憶體的圖像數據部分,m_DIB.m_pBMI指向點陣圖信息頭。

9.圖像直方圖:

為文檔類添加一個int型指針成員變數m_pGray,在構造函式中將該指針賦空,在文檔類中定義了一個函式,統計各個灰度值出現的頻數,申請一個記憶體,存儲在這個記憶體中,並將m_pGray指向它。

創建一個畫直方圖的對話框,添加Picture控制項,在控制項里調用文檔類成員變數,畫直方圖。添加一個滾動條,用來確定閾值,為滾動條添加訊息回響函式,按照滾動條的值進行二值化。

在選單中添加直方圖選單,添加訊息回響函式,在回響函式中創建直方圖對話框對象。

最後,因為我開始做工程的時候沒有把選單設計好,做得有點亂,所以,我又在View里添加WM_CONTEXTMENU訊息回響函式,在函式體內用CMenu類來實現彈出選單。

四、結果分析與評價

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

圖表 1

老師說在轉化的時候後面用一個循環會降低效率,但是實際上只要寬度是4的整數倍,後面的循環就不會做了。所以這個算法效率我覺得還行吧。

(2)線性變化:輸入線性變化範圍10~20,效果見圖2。

圖表 2

用了線性查找表之後,這個算法的效率應該會高很多,但是我的算法里是線性表從0~255都有變化之後的值,實際上,如果圖片的灰度範圍小一些的話,做了很多無用的計算,而且前面已經搜尋過原圖像的最大最小灰度值了,所以線性表的生成循環可以只從最小灰度做到最大灰度。另外,我設計的算法裡,如果最大值和最小值輸反了的話,程式會自動交換他們的值,做這個可能就會多算一些東西了。

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

圖表 3

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

高通濾波:效果見圖4。

圖表 4

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

中值濾波:效果見圖5。

圖表 5

這箇中值濾波的效果我還是比較滿意的,因為排序所以要調用其他函式,我用了快速排序,而且用的是9個數的十字絲視窗,所以速度要比25個數的視窗快一些。平滑的效果出來還可以。

(4)邊緣檢測:

Roberts運算元:效果見圖6。

圖表 6

Prewit運算元:效果見圖7。

圖表 7

Sobel運算元:效果見圖8。

圖表 8

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

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

圖表 9

這個圖像平移量比較大,所以被裁切的也顯得不真實了。主要是因為我的圖像大小和坐標都沒有變化,所以只在原來的圖像坐標範圍內顯示平移後的圖像,實際上,我既可以改變圖像的大小,並且為了節省計算,可以讓循環變數i和j從一個新的值開始做計算,前面的全都賦背景色。

圖像縮放:水平比例0.4,垂直比例0.5,效果見圖10。

圖表 10

在此基礎上旋轉:效果見圖11。

圖表 11

這幾種算法主要的計算量都在for循環內,所以要想最佳化算法的話,必須簡化循環里的計算。不過我的想法差不多跟書上的差不多,還沒有什麼最佳化。也許,這種最佳化的算法需要看很多別人做的好程式才能慢慢自己學會吧。

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

圖表 12

實際上,我用直方圖看的最佳閾值應該在100多左右,而我做的程式閾值好像偏小一些,所以效果不太好,我計算組間方差和組內方差的時候調用了一個函式專門求閾值,可能這裡的計算還是有一點問題。而且在我的函數裡,要256次調用這個函式,又因為計算機是按位元組處理數據的,因此寫圖像數據的時候要用每8個寫到一個數組中,然後通過計算得到位元組類型的值,這些都使得我的算法效率比較低,最後一個問題,我覺得如果使用位運算會快一些,但是前面的問題還沒有想到比較好的解決方法。

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

這個圖像255的像素太多,如果我沒算錯的話,量化應該不是很好吧。

圖表 13

五、實驗總結與體會

這次實驗學到最大的東西,是自己總算有MFC編程的概念了,雖然自己VC++考試的分數還不錯,但是裡面的很多東西,不通過自己的編程時絕對不能真正理解。比如說封裝性,這次用CDib的方便,很好地利用了類的封裝性。另外,比如MFC是基於訊息回響機制的,這就決定了,要利用滑鼠或者選單回響函式去實現功能,而用c語言編寫程式的時候,完全是按主函式的執行緒來的。

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

自學也是很重要的一方面。實際上,在現在來說,用MSDN也不是很難的事了,我們不應該被英文打到,而且現在,隨著對一些專有名詞熟悉了之後,看MSDN也容易一些了,萬一不懂的函式,也可以利用網路查到很多函式功能用法的解釋。

剛開始的時候做的是點陣圖的讀取和顯示,實在是不知從哪裡做起,所以就照著實驗書上敲了前面的部分,但是慢慢地也看懂了代碼的意思。所以後來的基本上都是自己做的了,但是算法還是基本上和書上差不多。不過自己編的時候還是有很多細節的部分沒有注意到,比如說,強制數據類型轉換,我自己編的時候沒有注意這個問題,結果出了很多錯,有些事由於函式調用引起的,有些是由於不等號兩邊數據的匹配問題,還有的是由於指針的移動,直到這個時候,才真正明白實驗書上程式為什麼那么多強制類型轉換,雖然書上很多東西不是盡善盡美,但是對於我這種剛開始學會編程的人還是有很多可以學習的地方的。

如老師所說,算法的效率是很重要的。要提高算法的效率,一個是要簡化計算(不得不說,這需要數學基礎),另外一個就是要避免許多重複的計算。在參考書上的程式里,很多時候,為了避免這種重複的計算(在循環中表現尤其明顯),會把某些數當常數算出來,只要後來加上這個常數就可以,這樣,效率高很多。

另外,對許多出錯的情況,我的程式里也沒有做好。比如,如果打開的不是8點陣圖像,我的程式不會提示錯誤,正常結束,而可能做錯,所以,這也是我應該向別人程式學習的地方。

最後一個,自己選單的布局也是很亂的。要從一開始就布局好。