在寫程式時主要的問題是要怎麼處理邊界問題
想了很久於是用以下的寫法解決
//以下的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
}
沒有留言:
張貼留言