數位影像處理教學程式 萬能電子系 周建興
開發環境介紹 使用軟體 Borland C++ Builder 6.0以上版本 個人電腦一台 程式網址 http://140.115.51.174/students/ister/others/image/Imag e_Program.htm 請下載Image4c.rar,並解壓縮執行
程式畫面 點擊projext1.exe執行檔
軟體功能簡介 開啟影像檔程式請看 File -->Open Image 儲存影像檔程式請看 File -->Save Image 量化程式(Quantization) 32 Color -> 量化成32色 8 Color -> 量化成8色 2 Color -> 量化成2色
練習開啟與儲存影像檔案
練習用程式轉成2色影像
空間頻域之影像處理方法 Darker -> 變暗 Lighter -> 變亮 Inverse -> 反相 空間頻域之影像處理方法 Darker -> 變暗 Lighter -> 變亮 Inverse -> 反相 Histogram Equalization - > 長條圖等化 Thresholding -> 取閥值做二值化處理 (修改數值會有 不同的結果) Thresholding AutoSelecting -> 程式自行選取適當的閥 值做二值化處理 (可用H.bmp這張圖測試)
練習將影像變暗
練習將影像做反相
反相影像
練習長條圖等化
濾波器處理方法 (Filter) Lowpass Filter -> 低通濾波器 Highpass Filter - > 高通濾波器 Medium Filter -> 中值濾波器 (可用Lena-noise.bmp這 張圖測試) Sobel Filter -> 找Edue(邊緣) (修改數值會有不同的結 果)
開啟被刮傷的影像
使用低通濾波器(模糊化)
使用中值濾波器處理受損影像
開啟H.bmp檔案
使用高通濾波器顯示邊界
使用SOBEL濾波器找邊界
描述方法 (Representation) Thinning -> 細化 (可用H.bmp先取閥值後 在對這張圖 做細化 還原原始檔案 -> 點選"還原原始檔案"的按鈕 即可 還原成原始影像 )
程式中的參數說明 Image_Width 開啟影像的寬度 Image_Height 開啟影像的高度 Data[][] 儲存開啟影像與用來進行運算的陣列,此陣 列為二維陣列 Data[Image_Width][Image_Height] 第一維的大小是Image_Width 第二維的大小是 Image_Height
副函式說明如下 GetBitmap( ) 將影像的資料讀進預先宣告的Data[][]陣列 SetBitmap( ) Retrieve( ) 將Data[][]陣列中的資料還原回原始影像中的資料
練習用Borland C++ 2009修改程式 先用BCB打開專案檔
作業一:寫一個反相功能的程式 開啟後,請先點Run執行程式一次。 然後關閉執行的程式
作業一 點選unit.cpp
作業一 點Design, 打開程式的Form
作業一 點Main Menu1
作業一 點main menu空白處,來新增一個新的功能,在左邊 caption處取名為作業1
作業一 按下ENTER後,點作業1就會連結到可以寫程式的 地方
作業一 反相的原理,便是黑變白,白變黑 公式為 (假定為256色灰階影像) 反相後的數值 = 255-目前灰階值 影像的寬度會儲存在Image_Width 而影像的高度會儲存在Image_Height 因此利用兩個for迴圈,將每個像素的影像值予以更 改
作業一 程式範例 for(int i = 0; i < Image_Width; i++) for(int j = 0; j < Image_Height; j++) Data[i][j] = 255 - Data[i][j]; SetBitmap(); SetBitmap是在像素值都被修改後,用來顯示影像的 函示。
作業一 寫好的程式碼 然後按Run(F9)執行程式
作業一 程式若沒有寫錯,執行的介面會出現一個新的作業 (1)按鍵。 開啟一張影像作測試
程式執行結果
作業二:寫一個簡易的變亮處理 同樣的步驟,先做出作業二的按鈕
作業二:寫一個簡易的變亮處理 簡易的變亮方法,就是增加每個像素的灰階影像數 值。 例如:變量後數值=原始灰階值+40 但是要注意影像數值不可超過255 因此要用IF判斷式,將大於255的數值改為255
作業二:寫一個簡易的變亮處理 程式範例 for(int i = 0; i < Image_Width; i++) for(int j = 0; j < Image_Height; j++)\ { Data[i][j] = Data[i][j]+40; if(Data[i][j] >255) Data[i][j] = 255; } SetBitmap();
作業二:寫一個簡易的變亮處理 點擊作業二後,輸入程式碼。 然後執行程式。
作業二:寫一個簡易的變亮處理
執行結果
作業討論 如果增加40改為增加20或80,會有什麼不同? 作業三:請製作一個簡易的變暗處理程式。 (提示:將影像灰階值變小,並大於0) 請自行練習作業三。
作業四:做影像左右翻轉(鏡射) 將影像左右不同位置像素的灰階值,做 調換。
作業四: int temp = a; a=b; b=temp; 重點一: 交換程式:假設a=5, b=3 。a,b兩個變數要交換 程式: int temp = a; a=b; b=temp; temp的功用是暫時儲存a的數值,等到b的值給a 後,便可將暫存於temp值,儲存給b。
作業四: 重點二:如果矩陣中有十個數值要兩兩交換, 則只需要交換五次即可。(也就是一半的次數)
作業四: 先點右邊Standard,在TButton點一下 然後在Design上點一下新增一個按鈕
作業四: 將按鈕更名為作業四,並點擊後撰寫程式。
作業四: 程式碼 Image_Width要改成Image_Width/2
作業五:垂直翻轉 迴圈中,調換的是垂直方向的數值,也就是 j 要變 動。 Image_Height要改成Image_Height/2
作業六:旋轉180度 提示:要各執行水平翻轉,與垂直翻轉各一次。