210 likes | 374 Views
影像處理 實作 (4). 2008/03/19. 實作內容. TabControl 控制項 ContextMenuScript 控制項 Color Image Processing 彩色影像轉灰階影像 彩色模型之轉換( RGB 與 HSI 互轉) 利用直方圖均衡化強化彩色影像. 程式介面. 請新增一個 Windows Form 專案,並在表單上放在以下控制項: OpenFileDialog MenuScript TabControl 在 TabControl 中的第一個 TabPage 加入一個 PictureBox ContextMenuScript.
E N D
影像處理 實作(4) 2008/03/19
實作內容 • TabControl控制項 • ContextMenuScript控制項 • Color Image Processing • 彩色影像轉灰階影像 • 彩色模型之轉換(RGB與HSI互轉) • 利用直方圖均衡化強化彩色影像
程式介面 • 請新增一個Windows Form專案,並在表單上放在以下控制項: • OpenFileDialog • MenuScript • TabControl • 在TabControl中的第一個TabPage加入一個PictureBox • ContextMenuScript
程式介面 • 請為控制項設定屬性: • OpenFileDialog • Filter:bmp檔 | *.bmp | Jpeg檔 | *.jpg | 所有檔案 | *.* • MenuScript • 輸入主選單與子選單如下 • File • Open… • Quit • Tool • Convert to Gray Level • Histogram Equalization • ContextMenuScript • 輸入以下選項 • Close Page
TabControl • 多分頁控制項 • 每一個TabControl中可能包含多個分頁(TabPage) • 每個TabPage都是一個容器,用以裝載其他控制項 • 點選時請注意,點選分頁標籤才能選擇TabControl控制項;點選中央區域,則會點選到TabPage。 • 屬性設定 • 請移除預設的第二個分頁(在分頁標籤上右按滑鼠→刪除) • 在TabControl中的第一個TabPage加入一個PictureBox • TabPage的Text屬性設定為「New Page」。 • TabPage的AutoScroll屬性設定為「true」。 • 將此分頁中的PictureBox置在該分頁的最左上方。 • 將該PictureBox的SizeMode屬性設定為「AutoSize」。 • 本程式將原圖開啟於第一個分頁中,處理過後的影像自動開啟於其他的分頁裡。
引用命名空間 • 請新增加以下命名空間 • using System.Drawing.Imaging; • 和Bitmap型態有關 • using System.IO; • 和Path型態有關 • Path類別用以擷取檔案路徑字串中的資訊
成員變數 • 請宣告以下成員變數 • 使用者按下「Open…」後,開啟開檔對話盒以載入影像至此成員變數中。
載入圖片 • 請為MenuScript的「Open…」選項加入事件處理 • TabControl中的TabPages成員用以記錄所有的分頁 • TabPages的型態為TabPage[](TabPage的陣列)。 • 利用索引的方式來存取其中的某一個分頁。 • TabPage其Dispose()用以刪除該分頁的內容。 • TabCount紀錄分頁的個數 • 利用Path中GetFileName函式可以用來擷取路徑字串中檔名的部分。
彩色影像轉灰階影像 • 影像的灰度由0至255。 • 基本上,將RGB三個channel設定為同樣的數值,即可將顏色轉變為灰階。 • 取得灰度有許多方法: • 只取R值(或只取G或B值)。 • 根據HSI色彩模型,I值可提供亮度資訊: I = (R + G + B) / 3; • YIQ色彩模型 • 用於工業彩色電視廣播中 • Y分量提供單色電視機的相容性 Y = 0.299R + 0.587G + 0.114B
彩色影像轉灰階影像 • 請於「Convert to GrayLevel」中加入事件處理
ContextMenuScript控制項 • 彈出式選單 • 用來設定在控制項右按滑鼠時,所出現的功能選單。 • 每個表單控制項都有一個ContextMenuScript屬性用來指定其ContextMenuScript。 • 請在ContextMenuScript的「Close Page」輸入以下事件處理程式: • 此行程式碼的意義在於用以關閉目前顯示的分頁。
色彩模型的轉換 • 請加入以下的成員函式以實作RGB轉HSI • 在參數宣告前面加上「ref」,代表該引數以參考的方式來傳遞,所以該引數的內容將可被此函式來更動。
色彩模型的轉換 • 請仿照ColortoHSI(),實作以下成員函式: private Color HSItoColor(int H, double S, int I) • 將顏色由HSI轉成Color型態(RGB模型) • 注意: • Math.Cos()所接受的參數為「弧度」,因此角度必須先除以180/Pi來轉換。
色彩模型的轉換—測試 • 請於MenuScript的「Histogram Equalization」選項中加入以下程式碼,用以測試上述成員函式的正確性:
色彩模型的轉換—測試 • 注意: • 如執行時發現顏色轉換錯誤,請檢查程式碼是否輸入正確(弧度與角度是否轉換無誤?) • 可自行用小畫家應用程式繪製純紅、純綠與純藍的影像,來驗證你的執行結果。
彩色影像的直方圖均衡化 • 修改第二週的程式碼,將直方圖均衡化的程式變成一個成員函式。 • 其接受一個二維的數字陣列作為參數,並回傳均衡化的結果(同樣也為一個二維數字陣列)
彩色影像的直方圖均衡化 • 請修改MenuScript的「Histogram Equalization」事件處理函式。 • 在輸出影像前,先對Intensity陣列進行直方圖均衡化的處理。 • 回傳直方圖均衡化的結果,以Intensity接收。