磨皮是很多人喜聞樂見的功能,尤其女人。
那麼,手機,或者說計算機,
是如何通過計算實現磨皮的呢?我們首先來看,照片是如何存儲在計算機中的。
圖像的存儲
我們所見的圖像,在電腦中實際上是一個數字陣列,即矩陣。
圖片有寬度(width)和高度(height),而矩陣有行(row)和列(column),正好一個蘿蔔一個坑地對應。
舉一個通俗的例子。
假設圖片分辨率為4×4,那麼,圖片“/”,可在電腦中表示為:
255在顯示器上將被顯示為純白,0為純黑。
介於0到255之間的,將被顯示為不同程度的“灰色”,因此,這圖被稱為“灰度圖”。
為什麼是0到255呢?
這是因為,我們使用一個字節,也就是8bit二進制(0000 0000到1111 1111)來存儲每個像素點,它可以表示256種不同的灰度。
當然,也有用10bits或12bits或16bits的場景,比如一些醫療成像器械。如果用16bits,可以表示65536種灰顏色,顏色分辨得更精準。
彩色圖像由RGB(紅、綠、藍)三色組成,原理一樣。
這樣一來,對圖像的操作,就可以轉換成對矩陣的操作,實際上,圖像處理軟件正是這麼做的。
有了圖像矩陣,如何進行磨皮的操作呢?
平均與模糊
磨皮,實際上就是將該模糊的區域模糊化,這樣就能消除皺紋、痘痘等等細節。
那麼,如何將圖片模糊?
在生活中,我們可能遇到過這種情況:
稱體重時,反覆稱三四次,再求個平均,以確保秤沒問題,是自己真變肥了。
為什麼平均呢?
因為,誤差會產生“干擾”,會使數據“波動”,“平均”可使數據更“平滑”。
“平滑”,就是圖像中的“模糊”。
如果我們將圖像矩陣中的每一個點與其周圍進行“平均”,那麼照片就變平滑了。
比如,上面的4×4矩陣:
我們可以將藍色方框中的像素點與周圍的點進行平均:
藍色點 = (255×7 + 0 + 0) / 9 = 198
然後,我們“從左到右、從上到下”一格一格地移動紅色的窗口,將每一點都重新進行平均計算(邊緣補零),就會發現:
原本純黑的地方,向白色靠攏了;原本純白的地方,向黑色靠攏了。
黑白的界限不再“涇渭分明”,而變成“逐漸過渡”。
這個紅色方框所構成的3×3矩陣,就是一個“濾波器”,該矩陣的各個元素都是1,上面的算法就是矩陣的“卷積”。
如果我們對這張測試圖片進行類似的“平滑”操作:
則效果如下:
這樣,圖片就被模糊了。
又比如,經典的lena圖:
平均一下?
非常顯然,尖銳的地方,比如帽子上的羽毛,被模糊(平滑)了。
如果我們僅對面部進行模糊,就是一種“磨皮”的效果。
當然,這裡僅採用了“平權平均”,為了追求更好的效果,實際程序員往往會使用“加權平均”。
至於如何選取合適的“加權係數”,這就是數字圖像處理中“卷積與濾波器”的內容,而且,圖像不僅能進行平均,還能進行傅里葉變換等其它操作,在此點到為止,不予展開。
科技的日新月異使我們突然意識到:
1.照片拍得太清晰,並不一定受歡迎,
2.磨皮不僅可以用砂紙,還能用矩陣。
閱讀更多 王珂 的文章