版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課程設計任務書</b></p><p> 學生姓名: 專業(yè)班級: </p><p> 指導教師: 工作單位: </p><p> 題 目:
2、 </p><p><b> 初始條件:</b></p><p> 要求完成的主要任務: (包括課程設計工作量及其技術要求,以及說明書撰寫等具體要求)</p><p><b> 時間安排:</b></p><p> 指導教師簽名:
3、 年 月 日</p><p> 系主任(或責任教師)簽名: 年 月 日</p><p><b> 目錄</b></p><p> 摘要…………………………………………………………………………………………2</p><p> 引言………………………
4、……………………………………………………..3</p><p> 1.1基礎知識……………………………………………………………………….3</p><p> 1.2本數字圖像處理界面處理內容介紹………………………………………….4</p><p> 1.2.1啟動界面……………………………………………………………….4</p><p>
5、 1.2.2主界面………………………………………………………………….4</p><p> 第二章 系統(tǒng)分析……………………………………………………………………….4</p><p> 2.1設計要求……………………………………………………………………. 4</p><p> 2.2系統(tǒng)處理流程分析………………………………………………………...5<
6、/p><p> 第三章 系統(tǒng)設計……………………………………………………………………..5</p><p> 3.1系統(tǒng)的設計語言…………………………………………………………….5</p><p> 3.2系統(tǒng)總體結構設計………………………………………………………….5</p><p> 3.2.1 系統(tǒng)總體結構圖…………………………
7、………………………….5</p><p> 3.2.2 系統(tǒng)模塊設計……………………………………………………….6</p><p> 第四章 系統(tǒng)詳細設計………………………………………………………………….7</p><p> 4.1基類的設計………………………………………………………………..7</p><p> 4.2 各模塊的詳
8、細設計………………………………………………………..8</p><p> 4.2.1歡迎界面設計…………………………………………………………8</p><p> 4.2.2主界面設計…………………………………………………………..9</p><p> 第五章 結論與心得體會………………………………………………………………19</p><p&
9、gt; 第六章 參考文獻……………………………………………………………………….20</p><p> 第七章 關鍵代碼…………………………………………………………………………21</p><p> 基于VC++平臺簡單數字圖像處理界面設計</p><p> 摘要:該數字圖像處理界面是基于Microsoft Visual C++ 6.0 MFC多文檔編程的圖
10、像處理界面,實現(xiàn).bmp格式圖像的瀏覽與編輯,導入和導出,圖像特效顯示,邊緣檢測,旋轉和翻轉圖片,圖片增強優(yōu)化,以及打印輸出圖片。是一款功能較簡潔的數字圖像管理界面,實現(xiàn)對.bmp格式圖像的操作。該界面包含兩部分:啟動界面和主界面。</p><p> BMP文件是Windows操作系統(tǒng)所推薦和支持的圖像文件格式,是一種將內存或顯示器的圖像數據不經過壓縮而直接按位存盤的文件格式,一般來說BMP文件分成4個部分:位
11、圖頭文件,位圖信息頭,顏色表,位圖數據.同時BMP文件文件可以分為DIB格式和DDB格式,其中DIB格式是與設備無關的BMP文件,通用性很強.Windows支持一些重要的DIB訪問函數,但都沒有封裝到MFC中,這里我們封裝了一個DIB類,其包含DIB文圖處理所需要的基本成員變量和成員函數,進而以該類為基類派生其他類,實現(xiàn)程序的維護和移植,從而利用面向對象的方式實現(xiàn)圖像的可視化編程。</p><p> 關鍵詞:
12、BMP文件 圖像處理 DIB位圖 界面 </p><p> Abstract:The digital image processing interface is based on Microsoft Visual C + + 6.0 MFC multi-document image processing programming interface, to achieve. Bmp for
13、mat for image browsing and editing, import and export, image effects showed that edge detection, rotate and flip images, pictures enhance the optimization, as well as print output picture. Is a function of the digital im
14、age than the simple management interface, to achieve. Bmp format images of the operation. The interface contains tw</p><p> Key words: BMP file Image processing DIB bitmap Interface</p><p&g
15、t;<b> 1 引言</b></p><p> 數字圖像處理(Digital Image Processing)又稱為計算機圖像處理,它是指將圖像信號轉換成數字信號并利用計算機對其進行處理的過程。數字圖像處理最早出現(xiàn)于20世紀50年代,當時的電子計算機已經發(fā)展到一定水平,人們開始利用計算機來處理圖形和圖像信息。隨著計算機的發(fā)展,數字圖像處理技術也不斷的進步,實現(xiàn)了對圖像圖像增強、復原、
16、編碼、壓縮等,在空間和軍事高科技中扮演越來越重要的角色。</p><p> 隨著數字化與多媒體時代的來臨,數字圖像處理已經成為必備的基礎知識。近幾十年來由于計算機技術的蓬勃發(fā)展,圖像處理技術也得到了空前的發(fā)展和應用。目前,圖像處理技術已經廣泛應用于工業(yè)、軍事、醫(yī)學、交通、農業(yè)、天氣預報、銀行、超市、重要部門的監(jiān)控報警系統(tǒng)、可視電話、網絡傳輸等等領域,成為各個學科學習和研究對象。隨著圖像處理技術的廣泛應用,學習和
17、掌握這門科學顯得格外重要,圖像處理已經成為信息技術相關領域的核心課程。</p><p> 本課題主要實現(xiàn)圖像的一些簡單特效顯示,圖像的旋轉和鏡像、圖像的增強處理,圖像灰度變換,圖像邊緣檢測等。</p><p><b> 1.1基礎知識</b></p><p> 組成數字圖像的基本單位是像素(Pixel),也就是說數字圖像是像素的集合。顯示
18、器在顯示圖像時采用電子槍從左到右掃描一行,為每個像素著色,然后從上倒下掃描整個屏幕的方式,由于人眼的視覺停留,可以顯示出完整的畫面.為了防止閃爍,每秒電子槍要重復掃描幾十次的掃描過程,人眼感受不到因屏幕刷新也產生的閃爍,這種顯示器稱為位映像設備。所謂位映像,是指一個二維的像素矩陣,矩陣的元素值就是像素的灰度值, 而位圖就是采用位映像方法顯示和存儲的圖像。</p><p> 彩色圖像和灰度圖像:灰度圖像是數字圖像
19、最基本形式,可以從黑白照片數字化得到或則通過對彩色圖像去色處理得到,灰度圖像只表示圖像的亮度信息而沒有顏色信息,灰度圖像的每個像素點上只包含一個量化的灰度級(0-255)來表示該點的亮度水平,計算機一般用1個字節(jié)(8個二進制位)來存儲。彩色圖像的數據不僅包含亮度信息,還包含顏色信息,圖像中每一個像素由RGB(紅綠藍)三個分量組成,計算機一般用3個字節(jié)(24位二進制)來存儲像素的顏色信息。</p><p> 圖1
20、.1 BMP圖像文件結構</p><p> 如圖1.1所示BMP文件由文件頭、位圖信息頭、顏色信息和圖形數據四部分組成。在編程時它們以結構體類型在計算機中存儲。</p><p> 1、位圖文件頭:主要包含文件類型(必須是0x424D,即字符串“BM”),文件大小以及文件頭到實際的位圖數據的偏移字節(jié)數; </p><p> 2、位圖信息頭:包含圖象的尺寸信息、
21、每個像素所占位數(bit)、圖像是否壓縮、圖像所用的顏色數等信息, 顏色信息包含圖像所用到的顏色表,顯示圖像時需用到這個顏色表來生成調色板;</p><p> 3、調色板(Palette:調色板實際上是一個數組存有RGB 信息的表; </p><p> 4、位圖數據:對于用到調色板的位圖,圖像數據就是該象素顏在調色板中的索引值。對于24位真彩色圖,圖像數據就是實際的R、G、B三個分量的
22、值。</p><p> 1.2本數字圖像處理界面處理內容介紹</p><p><b> 1.2.1啟動界面</b></p><p> 為了追求該圖像處理的界面的美觀性,在設計主界面前,先設計一個歡迎界面,即以一個經過photoshop處理過的圖像作為對話框,在運行主界面程序前,先顯示該對話框。</p><p>&l
23、t;b> 1.2.2主界面</b></p><p> 該數字圖像處理界面是基于VC++6.0MFC多文檔編程的界面程序,實現(xiàn)數字圖像的簡單查看與編輯操作。主界面主要內容有:</p><p> 圖像文件瀏覽:實現(xiàn)對.bmp格式圖像文件的瀏覽。</p><p> 圖像特效顯示:主要有自上而下掃描顯示,從左至右的滑動顯示和漸進顯示。</p&
24、gt;<p> 視圖-文檔的設置:實現(xiàn)了執(zhí)行操作后新舊圖像在不同視圖中顯示設置。</p><p> 圖像的灰度變換:包括圖像的二值化,彩色圖像轉換灰度圖像,灰度圖像轉換8位圖像。</p><p> 圖像的鏡像與旋轉變換:包括水平鏡像,垂直鏡像,順時針旋轉90度,逆時針旋轉90度,圖像旋轉180度。</p><p> 圖像的增強處理:主要是圖像銳
25、化處理。</p><p> 圖像的邊緣檢測和形態(tài)學處理:包括羅伯茨算子邊緣檢測,圖像輪廓提取
26、 </p><p> 該界面主要實現(xiàn)了.bmp格式圖像的瀏覽、編輯、打印、特效設置、視圖設置、變換等幾大功能。</p><p><b> 2 系統(tǒng)
27、需求分析</b></p><p> 需求分析簡單地說就是分析用戶的需求。需求分析是設計數據庫的起點,需求分析的結果是否準確地反映了用戶的實際要求,將直接影響到后面各個階段的設計,并影響到設計結果是否合理和實用。</p><p><b> 2.1設計要求</b></p><p> 根據設計內容,設計的主要要求有:(1)設計歡迎界
28、面并在程序中實現(xiàn)歡迎界面先于主界面顯示;(2)實現(xiàn)主界面的功能設計: 圖像文件瀏覽(.bmp格式圖像的導入), 圖像特效顯示, 視圖-文檔的設置, 圖像的灰度變換, 圖像的鏡像與旋轉變換, 圖像的增強處理, 圖像的邊緣檢測和形態(tài)學處理。</p><p> 2.2系統(tǒng)處理流程分析</p><p> 通過對系統(tǒng)的組織結構和功能進行分析,畫出業(yè)務流程圖, 它非常易于閱讀和理解,可以幫助我們了
29、解該業(yè)務的具體處理過程,發(fā)現(xiàn)和處理系統(tǒng)的調查工作中的錯誤和疏漏,修改和刪除原系統(tǒng)的不合理部分。</p><p> 通過對系統(tǒng)的需求分析,系統(tǒng)的基本功能已經確定。整個系統(tǒng)各個模塊的業(yè)務流,如圖2.1所示:</p><p><b> 圖2.1業(yè)務流程圖</b></p><p><b> 3 系統(tǒng)設計</b></p&
30、gt;<p> 本階段的主要任務是設計程序的體系結構,確定程序組成模塊,以及各模塊之間的關系。</p><p> 3.1系統(tǒng)的設計語言</p><p> 數字圖像處理系統(tǒng)采用Microsoft Visual C++ 6.0 MFC作為開發(fā)平臺。</p><p> 3.2系統(tǒng)總體結構設計</p><p> 3.2.1 系
31、統(tǒng)總體結構圖</p><p> 數字圖像處理界面的總體結構設計如圖3.1所示:</p><p> 圖 3.1 數字圖像處理界面總體結構設計</p><p> 3.2.2 系統(tǒng)模塊設計</p><p> 模塊設計是對處理流程圖的注釋性書面文件,以幫助程序設計人員進一步了解模塊的功能和設計要求數字圖像處理系統(tǒng)主要分為兩大模塊,即歡迎界面和
32、主界面,其中主界面又分為文件操作模塊,特效顯示模塊,圖像鏡像與旋轉模塊,圖像增強處理模塊,圖像邊緣檢測和形態(tài)學處理模塊。</p><p> 具體的模塊設計如下:</p><p> 1.歡迎界面:該模塊實現(xiàn)以一個經過photoshop處理過的圖像作為對話框,在運行主界面程序前,先顯示該對話框。</p><p><b> 2.主界面:</b>
33、</p><p> (1) 文件操作模塊: 該模塊主要實現(xiàn)圖像的文件操作,包括新建操作,打開操作.保存操作,另存為操作,關閉操作,打印操作等。</p><p> (2) 特效顯示模塊:該模塊實現(xiàn)了圖像在視圖中的顯示方式,包括自上而下掃描顯示,從左至右的滑動顯示和漸進顯示。</p><p> (3) 圖像鏡像與旋轉模塊:該模塊實現(xiàn)了圖像的鏡像變換和圖像旋轉顯示,
34、包括水平鏡像,垂直鏡像,順時針旋轉90度,逆時針旋轉90度,圖像旋轉180度。</p><p> (4) 圖像增強處理模塊:該模塊主要實現(xiàn)了圖像銳化效果。</p><p> (5) 圖像邊緣檢測模塊:該模塊實現(xiàn)了圖像邊緣輪廓檢測, 包括羅伯茨算子邊緣檢測,圖像輪廓提取。</p><p> (6)圖像灰度變換模塊:該模塊實現(xiàn)了彩色圖像變灰度格式,灰度圖像變彩色格
35、式和二值化操作。</p><p><b> 4 系統(tǒng)詳細設計</b></p><p><b> 4.1基類的設計</b></p><p> BMP文件是Windows操作系統(tǒng)所推薦和支持的圖像文件格式,是一種將內存或顯示器的圖像數據不經過壓縮而直接按位存盤的文件格式, 同時BMP文件文件可以分為DIB格式和DDB格式
36、,其中DIB格式是與設備無關的BMP文件,通用性很強。Windows支持一些重要的DIB訪問函數,但都沒有封裝到MFC中,這里我們封裝了一個DIB類,其包含DIB位圖處理所需要的基本成員變量和成員函數,進而以該類為基類派生其他類,實現(xiàn)程序的維護和移植。在這里我們命名這個基類為ImgCenterDib,各種算法的實現(xiàn)都是以ImgCenterDib類為基類派生出來。根據前面預備知識和程序編寫的需要,這里定義ImgCenterDib類代碼如下
37、:</p><p> class ImgCenterDib</p><p> { public:</p><p> unsigned char * m_pImgData; //圖像數據指針</p><p> LPRGBQUAD m_lpColorTable; //圖像顏色表指針</p><p> in
38、t m_nBitCount; //每像素占的位數</p><p><b> private:</b></p><p> LPBYTE m_lpDib; //指向DIB的指針</p><p> HPALETTE m_hPalette; //邏輯調色板句柄</p><p> int m_nColorTableLeng
39、th; //顏色表長度(多少個表項)</p><p> protected:</p><p> int m_imgWidth; //圖像的寬,像素為單位</p><p> int m_imgHeight; //圖像的高,像素為單位</p><p> LPBITMAPINFOHEADER m_lpBmpInfoHead; //圖像信息頭
40、指針</p><p><b> public:</b></p><p> ImgCenterDib();//不帶參數的構造函數</p><p> ImgCenterDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable, </p><p> unsigned c
41、har *pImgData); //帶參數的構造函數</p><p> ~ImgCenterDib();//析構函數</p><p> CSize GetDimensions();//獲取DIB的尺寸(寬高)</p><p> BOOL Read(LPCTSTR lpszPathName); //DIB讀函數</p><p> BOO
42、L Write(LPCTSTR lpszPathName); //DIB寫函數</p><p> BOOL Draw(CDC* pDC, CPoint origin, CSize size); //顯示DIB</p><p> void ReplaceDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable,</p>&
43、lt;p> unsigned char *pImgData); //用新的數據替換DIB</p><p> int ComputeColorTabalLength(int nBitCount); //計算顏色表的長度</p><p><b> private:</b></p><p> void MakePalette();//創(chuàng)
44、建邏輯調色板</p><p> void Empty();//清理空間 };</p><p> 同時將各個模塊函數封裝起來成為一個類,這些類都以ImgCenterDib類共有繼承,在主程序中調用,減少代碼的重復性,提高利用率。派生關系如圖4.1:</p><p> 圖4.1 基類與派生類結構關系圖</p><p> 4.2 各模
45、塊的詳細設計</p><p> 4.2.1歡迎界面設計</p><p> 用photoshop軟件根據內容的需要處理一張圖片,并保存為.bmp格式,然后在Microsoft Visual C++ 6.0中載入該圖片。</p><p> 設計思想:歡迎界面在程序運行時是以圖形式顯現(xiàn)的,這里要封裝一個位圖的類Cbtmap(派生于位圖類CBitmap),獲取圖像的寬
46、,高,創(chuàng)建邏輯調色板等等;之后創(chuàng)建一個啟動窗口類,名為Csplash(派生于窗口基類CWnd),這兩個類均封裝了一些函數,它們之間通過參數傳遞和函數調用,在主程序代碼中聲明Splash類的對象,調用Csplash類中函數從而實現(xiàn)設計目標。</p><p> 啟動窗口類的主要代碼如下:</p><p> class Csplash : public CWnd{ public:
47、160; Csplash();//構造函數 public: void Create( UINT nBitmapID );//調用CreateEx創(chuàng)建窗口 public: virtual ~Csplash();//析構函數 protected: //{{AFX_MSG(CW
48、zdSplash) afx_msg void OnPaint(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: Cbtmap m_bitmap;//私有成員變量};</p><p> 位圖類的主要代碼如下:&l
49、t;/p><p> class Cbtmap : public CBitmap{ public: DECLARE_DYNAMIC(Cbtmap) Cbtmap(); void LoadBitmapEx(UINT nID, BOOL bIconBkgrd ); CPalette *GetPalette(){r
50、eturn m_pPalette;}; public: virtual ~Cbtmap(); int m_Width; int m_Height; private: CPalette *m_pPalette; };</p><p> 在CPicture_sysView:
51、:CPicture_sysView()函數中加入如下代碼:</p><p> Csplash wndSplash; //聲明Splash類的對象wndSplash.Create(IDB_WZDSPLASH); //調用Create()wndSplash.UpdateWindow();Sleep(2000);//定時2秒</p><p> 程序運行截圖如下:(歡迎界面)</
52、p><p> 4.2.2主界面設計</p><p><b> ?。?)文件操作模塊</b></p><p> 文件操作模塊是整個系統(tǒng)中最基本的組成成分,該模塊主要實現(xiàn)圖像的文件操作,包括新建操作,打開操作.保存操作,另存為操作,關閉操作,打印操作。</p><p> 通過對用戶的需求分析得出文件操作模塊的功能結構圖,文
53、件操作模塊的功能結構圖如圖4.2所示: </p><p> 圖 4.2 文件操作模塊功能結構圖</p><p> 在文件操作模塊,新建操作,關閉操作和圖像打印操作可以直接調用系統(tǒng)提供的不需要重載的函數很容易就實現(xiàn),其他操作都需要將文件下的.bmp格式的圖像數據讀進計算機內存中生成DIB, 存放在m_lpDib(指向DIB的指針)所指向的緩沖區(qū)。</p><p>
54、 文件打開操作的偽代碼描述如下所示: 文件的另存為操作偽代碼如下:</p><p><b> 功能截圖如下:</b></p><p><b> 菜單欄:</b></p><p><b> 另存為操作:</b></p><p><b> (2)特效顯示模塊&l
55、t;/b></p><p> 特效顯示模塊實現(xiàn)了圖像在視圖中的顯示方式,包括自上而下掃描顯示,從左至右的滑動顯示和漸進顯示。經過分析圖像特效顯示功能,得出圖像處理的功能模塊圖如圖4.3所示:</p><p> 圖4.3特效顯示模塊功能結構圖</p><p> 特效顯示類SpecialEffectShow是在基類ImgCenterDib基礎上派生出來的,特
56、效顯示類設計代碼如下:</p><p> class SpecialEffectShow : public ImgCenterDib </p><p> { public:</p><p> SpecialEffectShow(CSize size, int nBitCount, </p><p> LPRGBQUAD lpCo
57、lorTable, unsigned char *pImgData); </p><p> //帶參數的構造函數 void Scan(CDC*pDC);//掃描特效顯示</p><p> void Slide(CDC*pDC);//滑動特效顯示</p><p> void FadeIn(CDC * pDC);//漸進特效顯示</p>&l
58、t;p> virtual ~SpecialEffectShow();</p><p> protected:</p><p> SpecialEffectShow();//防止從外部訪問無參數的構造函數</p><p><b> };</b></p><p> 利用類向導,給相應的控件定義消息處理函數,如
59、下表</p><p> 表1 主要的消息處理函數表</p><p> 在picture_sysView.cpp重載消息處理函數,這三個消息處理函數代碼基本相似,共同操作偽代碼如下:</p><p><b> 功能截圖如下:</b></p><p> 掃描顯示:
60、 滑動顯示:</p><p><b> 漸進顯示</b></p><p> (3)圖像灰度變換模塊</p><p> 圖像灰度變換模塊實現(xiàn)了彩色圖像變灰度格式,灰度圖像變彩色格式和二值化操作。經過分析圖像灰度變換功能,得出圖像處理的功能模塊圖如圖4.4所示:</p><p> 圖4.4 灰度變換模塊功能結構圖
61、</p><p> 灰度變換類GrayTrans是在基類ImgCenterDib基礎上派生出來的, 灰度變換類設計代碼如下:</p><p> class GrayTrans:public ImgCenterDib</p><p><b> {</b></p><p><b> public:</
62、b></p><p> int m_nBitCountOut; //輸出圖像每像素位數</p><p> unsigned char * m_pImgDataOut; //輸出圖像位圖數據指針</p><p> LPRGBQUAD m_lpColorTableOut; //輸出圖像顏色表</p><p><b> pr
63、ivate:</b></p><p> int m_imgWidthOut; //圖像的寬,像素為單位</p><p> int m_imgHeightOut; //圖像的高 </p><p> int m_nColorTableLengthOut; //輸出圖像顏色表長度</p><p><b> public
64、:</b></p><p> GrayTrans();//不帶參數的構造函數</p><p> GrayTrans(CSize size, int nBitCount, LPRGBQUAD lpColorTable, </p><p> unsigned char *pImgData); //帶參數的構造函數</p><p>
65、; ~GrayTrans();</p><p> CSize GetDimensions();//以像素為單位返回輸出圖像的寬和高</p><p> void ColorToGray();//彩色變灰度格式</p><p> void GrayToColor();//灰度變彩色格式</p><p> void Binary(int
66、 threshold=128); //二值化</p><p><b> };</b></p><p> 利用類向導,給相應的控件定義消息處理函數,如下表</p><p> 表2 主要的消息處理函數表</p><p> 在picture_sysView.cpp重載消息處理函數,這三個消息處理函數代碼基本相似,共同
67、操作偽代碼如下:</p><p><b> 功能截圖如下:</b></p><p> 彩色變灰度格式: </p><p><b> 灰度變彩色格式:</b></p><p><b> 二值化:</b></p><
68、p> (4)圖像鏡像與旋轉模塊</p><p> 圖像鏡像與旋轉模塊實現(xiàn)了圖像的鏡像變換和圖像旋轉顯示,包括水平鏡像,垂直鏡像,順時針旋轉90度,逆時針旋轉90度,圖像旋轉180度。其功能模塊圖如圖4.5所示:</p><p><b> 圖</b></p><p> 4.5 圖像鏡像與旋轉模塊功能結構圖</p>&
69、lt;p> 鏡像與旋轉類GeometryTrans是在基類ImgCenterDib基礎上派生出來的。該類與灰度變換類GrayTrans有相同的成員變量,其成員函數除CSize GetDimensions()函數外變?yōu)?</p><p> GeometryTrans();</p><p> GeometryTrans(CSize size, int nBitCount, LPRG
70、BQUAD lpColorTable, unsigned char *pImgData); //帶參數的構造函數</p><p> ~GeometryTrans();</p><p> void Move(int offsetX, int offsetY); //平移</p><p> void MirrorHori();//水平鏡像</p>&
71、lt;p> void MirrorVerti();//垂直鏡像</p><p> void Clockwise90();//順時針旋轉90度</p><p> void Anticlockwise90();//逆時針旋轉90度</p><p> void Rotate180();//旋轉180</p><p> 利用類向導,給
72、相應的控件定義消息處理函數,如下表</p><p> 表3 主要的消息處理函數表</p><p> 在picture_sysView.cpp重載消息處理函數,這五個消息處理函數代碼基本相似,共同操作偽代碼如下:</p><p><b> 功能截圖如下:</b></p><p> 水平鏡像:
73、 垂直鏡像:</p><p> 順時針旋轉90度: 逆時針旋轉90度: </p><p><b> 旋轉180度:</b></p><p> (5)圖像增強處理模塊</p><p> 圖像增強處理模塊主要實現(xiàn)了圖像銳化效果,是模糊的圖像變得更加清晰
74、,顏色變得鮮明突出,更適合人眼觀察和識別。</p><p> 圖像增強處理類Pic_Enhance是在基類ImgCenterDib基礎上派生出來的, 圖像增強處理類設計代碼如下:</p><p> class Pic_Enhance:public ImgCenterDib </p><p> { public:</p><p>
75、 int m_nBitCountOut;</p><p> unsigned char * m_pImgDataOut;</p><p> LPRGBQUAD m_lpColorTableOut;</p><p> int m_nColorTableLengthOut;</p><p><b> public:</b&
76、gt;</p><p> Pic_Enhance();</p><p> Pic_Enhance(CSize size, int nBitCount, LPRGBQUAD lpColorTable, unsigned char *pImgData);</p><p> ~Pic_Enhance();</p><p> void Gra
77、dSharp(BYTE bThre); //梯度銳化</p><p><b> };</b></p><p> 利用類向導,給相應的控件定義消息處理函數,如下表</p><p> 表4 主要的消息處理函數表</p><p> 在picture_sysView.cpp重載消息處理函數,偽代碼敘述如下:</p
78、><p><b> 功能截圖如下:</b></p><p> (6) 圖像邊緣檢測模塊</p><p> 圖像邊緣檢測模塊實現(xiàn)了圖像邊緣輪廓檢測, 包括羅伯茨算子邊緣檢測,圖像輪廓提取,其功能模塊圖如圖4.6所示:</p><p> 圖4.6圖像邊緣檢測模塊功能結構圖</p><p> 圖像
79、邊緣檢測類Pic_Segment是在基類ImgCenterDib基礎上派生出來的。該類與灰度變換類GrayTrans有相同的成員變量,其成員函數除CSize GetDimensions()函數相同,其他的成員函數如下:</p><p> Pic_Segment();</p><p> Pic_Segment(CSize size, int nBitCount, LPRGBQUAD lp
80、ColorTable, </p><p> unsigned char *pImgData); //帶參數的構造函數</p><p> ~Pic_Segment();</p><p> void Roberts();//Roberts算</p><p> void ContourExtract();//輪廓提取</p>
81、<p> 利用類向導,給相應的控件定義消息處理函數,如下表</p><p> 表5 主要的消息處理函數表</p><p> 序號 ID號 消息處理函數 函數功能</p><p> 1 ID_Roberts On Roberts 羅伯茨算子</p><p> 2 ID_Outlin
82、e On Outline 輪廓提取</p><p> 在picture_sysView.cpp重載消息處理函數,這2個消息處理函數代碼基本相似,共同操作偽代碼敘述如下:</p><p><b> 功能截圖如下:</b></p><p><b> 羅伯茨算子:</b></p><p>
83、;<b> 輪廓提取:</b></p><p><b> 5 結論與心得體會</b></p><p> 這次課程設計是以Microsoft Visual C++ 6.0 文檔視圖編程為基礎實現(xiàn)的,這就要求對MFC文檔視圖操作有一定的了解和操作編程能力,在做課程設計前,我查閱了該方面相關的書籍,對我完成歡迎界面和主界面的設計有很大的幫助。編程
84、中在不同類之間函數參數和變量的傳遞和函數的調用出了問題,但是理清函數的編譯編譯順序和變量的類型這些問題都逐一解決,同時增強了對工具欄,菜單欄的手動操作能力。</p><p> 另外一點是對.bmp圖像處理的實現(xiàn),數字圖像處理關鍵是算法的設計思想和算法的實現(xiàn),通過這次課程設計,使我了解到了算法設計的重要性(算法設計是編程實現(xiàn)的前提),提高了自己動手編程的能力和汲取一些先進算法的思想,這對以后圖像處理的深入學習大有
85、幫助。</p><p> 該數字圖像界面是基于Microsoft Visual C++ 6.0的MFC多文檔實現(xiàn)的,在界面設計上看起來過于單調,界面設計簡單,但易于操作; Visual C++ 6.0的MFC對話框的編程是界面看起來更加美觀,更接近軟件系統(tǒng),給人不一樣的感覺,提高了工具欄和菜單欄的編程實現(xiàn)難度和設計的復雜度,這是今后學習的方向。</p><p><b> 6.
86、參考文獻</b></p><p> [1] 鄭莉 董淵 張瑞豐, C++語言程序設計(第三版), 清華大學出版社 2003</p><p> [2]David J.Kruglinski(美)等, Visual C++ 6.0技術內幕,北京希望電子出版社,2002</p><p> [3]謝鳳英 趙丹培, Visual C++ 數字圖像處理,電子
87、工業(yè)出版社,2008</p><p> [4]求是科技 張宏林,精通Visual C++ 數字圖像處理典型算法及實現(xiàn),人民郵電出版社,2008</p><p> [5]劉銳寧 宋坤等, Visual C++從入門到精通,清華大學出版社,2008</p><p><b> 關鍵源代碼:</b></p><p>
88、///////////////////////ImgCenterDib.cpp////////////////////////////////////</p><p> ImgCenterDib::ImgCenterDib() //缺省變量的構造函數</p><p> { m_lpDib=NULL;//初始化m_lpDib為空。</p><p> m_lp
89、ColorTable=NULL;//顏色表指針為空</p><p> m_pImgData=NULL; // 圖像數據指針為空</p><p> m_lpBmpInfoHead=NULL; // 圖像信息頭指針為空</p><p> m_hPalette = NULL;//調色板為空</p><p><b> }<
90、/b></p><p> ImgCenterDib::ImgCenterDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable,</p><p> unsigned char *pImgData)</p><p> { if(pImgData==NULL){//沒有位圖數據傳入,DIB為空</p
91、><p> m_lpDib=NULL;</p><p> m_lpColorTable=NULL;</p><p> m_pImgData=NULL; </p><p> m_lpBmpInfoHead=NULL; </p><p> m_hPalette = NULL;</p><p>
92、<b> }</b></p><p><b> else{</b></p><p> m_imgWidth=size.cx;</p><p> m_imgHeight=size.cy;</p><p> m_nBitCount=nBitCount;</p><p>
93、 m_nColorTableLength=ComputeColorTabalLength(nBitCount);//根據每像素位數,計算顏色表長度</p><p> int lineByte=(m_imgWidth*nBitCount/8+3)/4*4;</p><p> int imgBufSize=m_imgHeight*lineByte;//位圖數據緩沖區(qū)的大?。▓D像大小)&l
94、t;/p><p> m_lpDib=new BYTE [sizeof(BITMAPINFOHEADER) + </p><p> sizeof(RGBQUAD) * m_nColorTableLength+imgBufSize];//為m_lpDib一次性分配內存,生成DIB結構</p><p> //填寫B(tài)ITMAPINFOHEADER結構</p>
95、<p> m_lpBmpInfoHead = (LPBITMAPINFOHEADER) m_lpDib;</p><p> m_lpBmpInfoHead->biSize = sizeof(BITMAPINFOHEADER);</p><p> m_lpBmpInfoHead->biWidth = m_imgWidth;</p><p>
96、; m_lpBmpInfoHead->biHeight = m_imgHeight;</p><p> m_lpBmpInfoHead->biPlanes = 1;</p><p> m_lpBmpInfoHead->biBitCount = m_nBitCount;</p><p> m_lpBmpInfoHead->biCompr
97、ession = BI_RGB;</p><p> m_lpBmpInfoHead->biSizeImage = 0;</p><p> m_lpBmpInfoHead->biXPelsPerMeter = 0;</p><p> m_lpBmpInfoHead->biYPelsPerMeter = 0;</p><p&g
98、t; m_lpBmpInfoHead->biClrUsed = m_nColorTableLength;</p><p> m_lpBmpInfoHead->biClrImportant = m_nColorTableLength;</p><p> m_hPalette = NULL;</p><p> if(m_nColorTableLeng
99、th!=0){ //若有顏色表,則將顏色表拷貝進DIB的顏色表位置</p><p> m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof(BITMAPINFOHEADER));</p><p> memcpy(m_lpColorTable,lpColorTable,</p><p> sizeof(RGBQUAD) * m_nC
100、olorTableLength);//顏色表拷貝</p><p> MakePalette();//創(chuàng)建邏輯調色板</p><p><b> }</b></p><p> m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER)+</p><p> sizeof
101、(RGBQUAD) * m_nColorTableLength;//用m_pImgData指向DIB位圖數據起始位置</p><p> memcpy(m_pImgData,pImgData,imgBufSize);//拷貝圖像數據進DIB位圖數據區(qū)</p><p><b> }</b></p><p><b> }</b&
102、gt;</p><p> ImgCenterDib::~ImgCenterDib()//析構函數,釋放資源</p><p> {if(m_lpDib != NULL) </p><p> delete [] m_lpDib; </p><p> if(m_hPalette != NULL)</p><p>
103、::DeleteObject(m_hPalette);//如果有調色板,釋放調色板</p><p><b> }</b></p><p> BOOL ImgCenterDib::Draw(CDC* pDC, CPoint origin, CSize size)//顯示DIB位圖</p><p> { HPALETTE hOldPal=N
104、ULL;//舊的調色板句柄</p><p> if(m_lpDib == NULL) return FALSE;</p><p> if(m_hPalette != NULL)</p><p> {hOldPal=::SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE);}</p><p
105、> pDC->SetStretchBltMode(COLORONCOLOR);//設置位圖伸縮模式</p><p> ::StretchDIBits(pDC->GetSafeHdc(), origin.x, origin.y, size.cx, size.cy,</p><p> 0, 0, m_lpBmpInfoHead->biWidth, m_lpBmpI
106、nfoHead->biHeight,m_pImgData,</p><p> (LPBITMAPINFO) m_lpBmpInfoHead, DIB_RGB_COLORS, SRCCOPY);//將DIB在pDC所指向的設備上進行顯示</p><p> if(hOldPal!=NULL)</p><p> ::SelectPalette(pDC->
107、GetSafeHdc(), hOldPal, TRUE);//恢復舊的調色板</p><p> return TRUE;</p><p><b> }</b></p><p> BOOL ImgCenterDib::Read(LPCTSTR lpszPathName)//讀入bmp位圖</p><p> {
108、CFile file;</p><p> if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite))</p><p> return FALSE;</p><p> BITMAPFILEHEADER bmfh;</p><p> try { Empty(
109、);//清理空間</p><p> int nCount=file.Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));//讀取BITMAPFILEHEADER結構到變量bmfh中</p><p> if(nCount != sizeof(BITMAPFILEHEADER)) {</p><p> throw
110、new CException;}</p><p> if(bmfh.bfType != 0x4d42) {</p><p> throw new CException;</p><p><b> }</b></p><p> if(m_lpDib!=NULL)</p><p> dele
111、te []m_lpDib;</p><p> m_lpDib=new BYTE[file.GetLength() -sizeof(BITMAPFILEHEADER)];</p><p> file.Read(m_lpDib, file.GetLength() -sizeof(BITMAPFILEHEADER));</p><p> m_lpBmpInfoHea
112、d = (LPBITMAPINFOHEADER)m_lpDib;</p><p> m_imgWidth=m_lpBmpInfoHead->biWidth;//為成員變量賦值</p><p> m_imgHeight=m_lpBmpInfoHead->biHeight;</p><p> m_nBitCount=m_lpBmpInfoHead-&g
113、t;biBitCount; </p><p> m_nColorTableLength=</p><p> ComputeColorTabalLength(m_lpBmpInfoHead->biBitCount);//計算顏色表長度</p><p> m_hPalette = NULL;//生成邏輯調色板</p><p> if
114、(m_nColorTableLength!=0){</p><p> m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof(BITMAPINFOHEADER));</p><p> MakePalette();</p><p><b> }</b></p><p> m_pImgDa
115、ta = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER) +</p><p> sizeof(RGBQUAD) * m_nColorTableLength;</p><p><b> }</b></p><p> catch(CException* pe) {</p><p>
116、AfxMessageBox("Read error");</p><p> pe->Delete();</p><p> return FALSE;}</p><p> return TRUE;</p><p><b> }</b></p><p> BOOL
117、ImgCenterDib::Write(LPCTSTR lpszPathName)//DIB數據存盤</p><p> { CFile file;</p><p> if (!file.Open(lpszPathName, CFile::modeCreate | CFile::modeReadWrite </p><p> | CFile::shareEx
118、clusive))</p><p> return FALSE;</p><p> BITMAPFILEHEADER bmfh;//填寫文件頭結構</p><p> bmfh.bfType = 0x4d42; // 'BM'</p><p> bmfh.bfSize = 0;</p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 圖像邊緣檢測系統(tǒng)設計-數字圖像處理_課程設計說明書
- 圖像邊緣檢測系統(tǒng)設計-數字圖像處理_課程設計說明書
- 圖像邊緣檢測系統(tǒng)設計-數字圖像處理_課程設計說明書
- 數字圖像處理課程設計--基于matlab的數字圖像處理
- 數字圖像處理課程設計---數字圖像處理
- 數字圖像處理課程設計--基于matlab的數字圖像處理
- 基于vc課程設計--基于vc++平臺簡單數字圖像處理界面設計
- 數字圖像處理課程設計
- 數字圖像處理課程設計
- 數字圖像處理課程設計
- 數字圖像處理課程設計--數字圖像處理系統(tǒng)
- 圖像處理課程設計--基于matlab的數字圖像處理
- 數字圖像處理課程設計
- 數字圖像處理課程設計
- 數字圖像處理課程設計論文
- 數字圖像處理課程設計 (2)
- 數字圖像處理課程設計1
- 數字圖像處理課程設計--實現(xiàn)簡單的數字圖像處理功能
- 數字信號處理課程設計--基于matlab的數字圖像處理
- 數字圖像處理課程設計--人臉檢測
評論
0/150
提交評論