這次的作業是空間濾波器的實作,要能由程式自行判斷處理灰階或彩色影像,而且使用者可以輸入濾波器的值。
由於老師有公佈了範例程式碼,所以灰階圖片的空間濾波很快的就可以出來,卡比較久的地方是在彩色濾波器的部分。原本以為跟上個作業一樣直接把值拿出來處理就好,但突然想起上個作業是做灰階圖片的處理,不過經由上次的經驗,知道24bit的圖片每一列的像素排列為B1G1R1B2G2R2...,所以把原本灰階圖片的一個陣列的處理改為RGB三個陣列分別去做,如下所示:
1. 首先讓三個指標陣列都讀取影像的同一列起始位置
bPtrResultImage_B = (Byte *)Image2->Picture->Bitmap->ScanLine[i];
...
2. 接著,跑濾波器(套用原理)
如果我們要處理某點的B值位於j = 3,那麼G值就會在j = 4,而R值就會在j = 5,而要抓某點左邊那點的B值時就要在j = 3 - 3 = 0這格去抓,同理,如果需要右邊那格的B值,就要在j = 3 + 3 = 6這格去抓(因為BGR的排列...),其餘依此類推。
濾波器原理的部分就要看一下課本啦。以下為我的實作結果:
灰階圖片實作↓
彩色圖片實作↓
這邊再貼上原圖和儲存後的結果會比較清楚,如下:
灰階原圖↓
灰階圖片濾波後↓
彩色原圖↓
彩色圖片濾波後↓
PS.濾波後的圖片會出現一個白色外框,我想應該是因為最外圈的值有部分的鄰近值無法參考,所以最多只能做到圖片外框往內1格的部分。
沒有留言:
張貼留言