2012年11月15日 星期四

98360915 資工四甲 周立祥

  本次作業主要在於實作平滑化(Averaging)、銳化(Laplacian)、中值濾波器(Median)等三種濾波器,以下原圖引用於Facebook俞老行軍團粉絲頁,作者:俞蘇。


平滑化(Averaging)
顧名思義是將圖片柔化,而柔化後的圖片將不再如此銳利,會讓人感覺圖片上蒙上一層面紗般的朦朧感,調整好適當數值,搭配亮度以及色溫調整即可達到美肌效果。本次只展現平滑化,使用之window size為3x3,而在3x3的mask中,中央的pixel則是希望被替換之pixel。以下共使用兩種mask:

第一種:
圖一

  依照圖一所示,周遭八個加上自己本身共九個pixel,給予每個pixel相對應的權重(在此皆為1),再將所有pixel乘上對應之權重並加總除以權重加總,例圖一則為sum / 9,而平均後的數值便為欲取代中央的數值。下圖是以圖一作為mask之平滑化:


第二種:
圖二

  依照圖二所示,一樣給予對應之pixel權重,在此加總後是除以16,而此mask相對於圖一之mask所計算出之圖片較為清晰,原因在於中央(也就是自己本身)之pixel權重大於周遭其他pixel之權重。下圖是以圖二作為mask之平滑化:


  由於圖片過小看不出差異性,可將圖片下載後再行比對,放大後可看出經由圖一運算後的圖片較為模糊,而經由圖二運算後的圖片較為清晰些。

註:
  看數字(62)的部分較為明顯。

銳化(Laplacian)
  顧名思義是將圖片變得更清晰,而銳化後的圖片將不再感覺到原先那樣的模糊,銳化最明顯的部份在於顏色反差極大的部份,例如一個物體的邊線,若調整好適當數值,銳化後的圖片會讓人感覺較為清晰,但假設數值過大,將會造成圖片太過死硬。本次展現之銳化同樣是使用3x3的window size。以下共使用兩種mask:

第一種:
圖三

  依照圖三所示給予每個pixel相對應的權重,再將所有pixel乘上對應之權重並加總後的數值便為欲取代中央的數值。下圖是以圖三作為mask之銳化:


第二種:
圖四

  依照圖四所示,一樣給予對應之pixel權重,之後加總後便為欲取代中央的數值,但此mask相對於圖三之mask所計算出的圖片銳化度較小,原因在於考慮的pixel數變少,在此為四個角之pixel皆不納入考量。下圖是以圖四作為mask之銳化:


  在此一樣由於圖片過小看不太出差異性,可將圖片下載後再行比對,放大後可看出經由圖三運算後的圖片銳化較明顯,而經由圖四運算後的圖片銳化較不明顯些。

中值濾波器(Median)
  此filter如同前面兩種一樣,是利用某一大小之window size作為mask,中央之數值一樣為希望被替換之數值,然而這次的作法是將周遭與自己本身排序後取出中位數作為替換之數值,這樣的filter可以用來過濾一些雜訊,但經由此filter過濾後的圖片依然會失去原先的清晰度(意即較為模糊)。下圖是原圖加入雜訊後:


  加入這樣黑白小點之雜訊後,經由此filter可將雜訊點替換成周遭其他pixel之color,原因在於黑點(0)、白點(255)的關係,排序後黑點及白點會被置放於最左及最右,因此取出中位數後即可稍微將影像還原些,其理論在於周遭之pixel幾乎與自己本身相近所得出。下圖是經由過濾後之圖片:


感想:
  由於同樣是使用C#實作,而C#在讀取圖片記憶體的方式較為不便,他只可取得圖片第一個byte的地址,其後要靠自己加入相對的數值做指標的移動,而換行依然要注意經由Memory Alignment後多出的padding byte,因此稍微計算錯誤則會導致整個圖片變得非常詭異,另外,本次處理有對圖片邊框做處理,圖片四角則是2x2之mask,邊的部份為2x3之mask。

沒有留言:

張貼留言