2013年12月3日 星期二

HW3

這次的作業是實作空間濾波器,分別是平滑化(模糊化Blur) 、銳化(Sharpen)和中值濾波器(Median Filter)

平滑化(模糊化Blur) 

主要是將影像中不相干的細節減少,將影像中相鄰(九宮格)的像素值給予權重1之後加起來除以9放回原來的像素值(如下圖顯示),要注意的是影像四周相鄰的像素值不是九宮格,所以在做迴圈運算的時候要將影像的寬和高減一。

執行結果,Original Image與 New Image 的差異,New Image 看起來較模糊,尤其是花蕊的部分,這是針對影像四周做處理。


主要程式碼
for(i=1;i<iImageWidth-1;i++)
{
for(k=0;k<3;k++)
{
//9宮格內得數值加起來放入sum
sum=bPtrImageRow0[(i-1)*3+k]+bPtrImageRow0[i*3+k]+bPtrImageRow0[(i+1)*3+k]
+bPtrImageRow1[(i-1)*3+k]+bPtrImageRow1[i*3+k]+bPtrImageRow1[(i+1)*3+k]
+bPtrImageRow2[(i-1)*3+k]+bPtrImageRow2[i*3+k]+bPtrImageRow2[(i+1)*3+k];
//將sum平均做/9動作  
bPtrResultImageRow[i*3+k]=(unsigned char)(sum/9);
}
}


也有些人認為九宮格內,重要的像素點為前後左右四個點,所以給予較高的權重值,將最上圖黃色部分權重值增加為2,所以中心點權重值就為4,加總之後要除以16。以下為給予較高權重值的執行結果。


主要程式碼

for(i=1;i<iImageWidth-1;i++)
{
for(k=0;k<3;k++)
{
//認為前後左右的參考價值比斜對角的還有價值,所以前後左右權重為2,中心點為4,相加放入 //sum
sum=bPtrImageRow0[(i-1)*3+k]+2*bPtrImageRow0[i*3+k]+bPtrImageRow0[(i+1)*3+k]
+2*bPtrImageRow1[(i-1)*3+k]+4*bPtrImageRow1[i*3+k]+2*bPtrImageRow1[(i+1)*3+k]
+bPtrImageRow2[(i-1)*3+k]+2*bPtrImageRow2[i*3+k]+bPtrImageRow2[(i+1)*3+k];
//權重算出來為16,所以sum/16做平均動作
bPtrResultImageRow[i*3+k]=(unsigned char)(sum/16);
}
}
================================================================

銳化(Sharpen)

主要在凸顯強度上的變化,給予前後左右權重值為 -1,而中心點權重值為5(如下圖顯示),然後加總。要注意的是像素值最大為255最小為0,所以我們必須要設定高於255像素值為255低於0像素值為0。


主要程式碼
for(i=1;i<iImageWidth-1;i++)
{
for(k=0;k<3;k++)
{
//給予前後左右-1的權重,中心點為5的權重,相加放入sum
sum=-1*bPtrImageRow0[i*3+k]
-bPtrImageRow1[(i-1)*3+k]+5*bPtrImageRow1[i*3+k]-bPtrImageRow1[(i+1)*3+k]
-bPtrImageRow2[i*3+k];
//計算sum是否超過255,如果超過要=255,如果小於0,要=0
if(sum>255)
                 sum=255;
if(sum<0)
sum=0;
bPtrResultImageRow[i*3+k]=(unsigned char)(sum);
}
}

執行結果,在不同顏色的交界處感覺有白色的邊框,讓整個影像看起來比較銳利。


還有讓影像更銳利的做法就是將周圍(九宮格)權重值給予-1,而中心點權重值為9(如下圖顯示)。


執行結果,因為加上對角-1的權重值,所以整個影像看起來更為銳利。


主要程式碼
for(i=1;i<iImageWidth-1;i++)
{
for(k=0;k<3;k++)
{
//認為9個點的權重為-1,而中心點權重為9,相放入sum
sum=-1*bPtrImageRow0[(i-1)*3+k]-bPtrImageRow0[i*3+k]-bPtrImageRow0[(i+1)*3+k]
-bPtrImageRow1[(i-1)*3+k]+9*bPtrImageRow1[i*3+k]-bPtrImageRow1[(i+1)*3+k]
-bPtrImageRow2[(i-1)*3+k]-bPtrImageRow0[i*3+k]-bPtrImageRow0[(i+1)*3+k];
//一樣判斷是否超過255或小於0
if(sum>255)
sum=255;
if(sum<0)
sum=0;

bPtrResultImageRow[i*3+k]=(unsigned char)(sum);
}
}
================================================================

胡椒塩(Pepper and Salt)

亂數產生0到100的數值,在影像中產生出黑點與白點。
以下為實作情況 : 
上圖為開啟檔案所使用的影像

上圖為灑上胡椒鹽的影像,有黑點也有白點

主要程式碼
for (i=0; i<iImageWidth; i++)
{
  //亂數產生0到100的變數
iRandomNumber = random(100);
//變數小於10,影像的像素值為黑色    
if (iRandomNumber < 10)    
{
bPtrImageRow[3*i] = 0;
bPtrImageRow[3*i+1] = 0;
bPtrImageRow[3*i+2] = 0;
}
//變數值小於20,影像的像素值為白色
else if (iRandomNumber < 20)
{
bPtrImageRow[3*i] = 255;
bPtrImageRow[3*i+1] = 255;
bPtrImageRow[3*i+2] = 255;
}
}

================================================================

中值濾波器(Median Filter)

濾波器主要內容就是消除影像雜訊,實作方法就是將周圍(九宮格)的像素值取出來後作排序,再將中間的值(第5個值)放回原像素點。
執行結果,原本影像要用花朵,因為執行的結果看不太出來,所以使用這張影像來做影像處理。

上個步驟是將影像灑上胡椒鹽,而濾波器這個步驟是將影像的雜訊去除掉。


主要程式碼
for(j=1;j<iImageHeight-1;j++)
 {
bPtrImageRow0=(Byte *)Image7->Picture->Bitmap->ScanLine[j-1];
bPtrImageRow1=(Byte *)Image7->Picture->Bitmap->ScanLine[j];
bPtrImageRow2=(Byte *)Image7->Picture->Bitmap->ScanLine[j+1];
bPtrResultImageRow=(Byte *)Image8->Picture->Bitmap->ScanLine[j];
for(i=1;i<iImageWidth-1;i++)
{
ucNeighbors[0]=bPtrImageRow0[(i-1)*3];
ucNeighbors[1]=bPtrImageRow0[i*3];
ucNeighbors[2]=bPtrImageRow0[(i+1)*3];
ucNeighbors[3]=bPtrImageRow1[(i-1)*3];
ucNeighbors[4]=bPtrImageRow1[i*3];
ucNeighbors[5]=bPtrImageRow1[(i+1)*3];
ucNeighbors[6]=bPtrImageRow2[(i-1)*3];
ucNeighbors[7]=bPtrImageRow2[i*3];
ucNeighbors[8]=bPtrImageRow2[(i+1)*3];
ucMedian=MedianFinding(ucNeighbors);
bPtrResultImageRow[i*3]=ucMedian;

         ucNeighbors[0]=bPtrImageRow0[(i-1)*3+1];
ucNeighbors[1]=bPtrImageRow0[i*3+1];
ucNeighbors[2]=bPtrImageRow0[(i+1)*3+1];
  ucNeighbors[3]=bPtrImageRow1[(i-1)*3+1];
ucNeighbors[4]=bPtrImageRow1[i*3+1];
ucNeighbors[5]=bPtrImageRow1[(i+1)*3+1];
ucNeighbors[6]=bPtrImageRow2[(i-1)*3+1];
ucNeighbors[7]=bPtrImageRow2[i*3+1];
ucNeighbors[8]=bPtrImageRow2[(i+1)*3+1];
ucMedian=MedianFinding(ucNeighbors);
bPtrResultImageRow[i*3+1]=ucMedian;
}
}

================================================================

心得
這次作業都是利用二為陣列去做處理,第一部分的作業,我有使用兩種權重去處理影像,一種為像素值的八方權重為1,另一種為四方權重為2對角的權重為1,但出來的結果似乎差異不大。第二部分的銳化執行出來的結果可以很明顯的知道與原來的影像不同,我一樣也使用兩種權重值去處理銳化的部分,兩種結果差很多,不像影像的平滑化處理。最後是中值濾波器,以這次的作業來說是比較困難的部分,因為要找出像素點的九宮格去做大小排列,選出中間值當此影像像素點的值。

沒有留言:

張貼留言