2015年12月20日 星期日

02360475 傅清毓 HW04

第一個是銳化濾波的效果圖
    

在寫程式時主要的問題是要怎麼處理邊界問題
想了很久於是用以下的寫法解決
//以下的4個變數在算高跟寬的邊界
int hl = ((i-1)<0) ? i : (i-1) ;                     //如果高-1 小於0的話 就不減1
int hr = ((i+1)==imageHeight)?i:(i+1);   //高+1如果等於寬的話也不+1
int wl = ((j-1)<0)?j:(j-1);                         //寬以此類推
int wr = ((j+1)==imageWidth)?j:(j+1);
for(int k = 0; k < 3; k++)
{
        sum = 0;
        maskSum=0;
        for(int h = hl; h <= hr; h++)
               for(int w = wl; w <= wr; w++)
               {
                           sum+=imageRow[h][w*3+k]*mask[h-i+1][w-j+1];
                           //mask是遮罩的權重
                           //用目前要處理的座標-中心點座標+1就可以得到對應的權重
                           maskSum+=mask[h-i+1][w-j+1];
               }
        //最後這邊在判定他有沒有大於255或小於0
        imageRow2[j*3+k] = (sum/maskSum>255)?255: (sum/maskSum<0)?0:sum/maskSum;
                             
}
這樣子就解決掉邊界的問題了


這一個是平滑化的效果圖 可以看到影像有變平順一點 或者可以說模糊一點
 

程式碼跟上面幾乎一樣
所以就沒PO
因為只是改變遮罩的權重
比較不一樣的地方是它不會有小於0跟大於255的問題


最後這兩張圖分別是先做10%跟20%的雜訊後作中值濾波的效果


    
程式碼也是差不多
如下
for(int k = 0; k < 3; k++)
{
       for(int a =0;a<9;a++)
       px[a]=256;                                      //px為儲存9個值的地方 一開始設為256是為了之後運算
       count =0;
       for(int h = hl; h <= hr; h++)
       for(int w = wl; w <= wr; w++)
       {
                 count++;                                                                 //計算共有幾個值
                 px[(h-i+1)*3+(w-j+1)] = imageRow[h][w*3+k];  //把像數值存入px裡面

       }
       sort(px,px+9);                                               //用內建的方法從小到大排序
       imageRow2[j*3+k] = px[(count+1)/2];      
      //因為有用count算有幾個 所以中位數就是(count+1)/2
                     
 }


沒有留言:

張貼留言