所以拖這麼久才交。
作業內容總共需要四個,分別是模糊化,銳利化,撒鹽以及中值濾波器
對於.NET在處理這四個部分時,最主要的程式碼就在於
類似BCB的ScanLine,在.NET裡,則是這段程式碼
BitmapData bdata = btarget.LockBits(new Rectangle(0, 0, btarget.Width, btarget.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);/*鎖住存放圖片的記憶體*/
int TotalByteWidth = btarget.Width;/*計算每行的像點所佔據的byte 總數*/
unsafe/*直接利用指標, 更改圖檔的內容*/
{
byte* ptrLine = (byte*)bdata.Scan0;/*像素資料的起始位址*/
for (int y = 0; y < btarget.Height; y++)
for (int x = 0; x < TotalByteWidth; x++)
{
//要處理的部分
}
ptrLine += bdata.Stride - TotalByteWidth; // 跳過剩下的 Padding bytes
}
btarget.UnlockBits(bdata);
ptarget.Refresh();
而在模糊化,銳利化與中值濾波器這三個功能最相似的地方就在於要做矩陣存放圖素,要三條才能重新計算該點的值,模糊化與銳利化是相對的,權重的分配很重要。
【首先讀取一張圖像】
【這是銳利化,效果不明顯請點大圖查看】
【這是模糊化,效果不明顯請點大圖查看】
接下來就是撒鹽與中值濾波器
【灑很多的鹽】
【鹽撒太多導致濾波時很多雜點去不掉】
原本很早就做得差不多了,但是因為結果尚不滿意還在調整中一直還沒交
但是作業繳交期限快到了,還是把結果呈現出來。
這個作業主要目的是Edge Detection,尤其對於影像處理在處理人臉的部份時
銳利化與濾波器變得很重要,而我從GetPixel改為直接修改記憶體位置,
也是一個很有趣的體驗,因為一不小心,就可能導致記憶體損毀當掉了。
沒有留言:
張貼留言