這是之前做過的一個關於實現Hybrid Image的小項目,有錯誤及不足的地方還請批評指正~
怎麼理解圖像的高低頻?
圖像的低頻部分可以理解爲“輪廓”,比如人臉的臉型。
圖像的高頻部分可以理解爲“細節”,比如人臉的皺紋、斑點等。
因此,我們常說,對圖像做模糊處理後得到了圖像的低頻部分,對圖像做銳化處理會讓圖像的高頻信息更多。(看到這裏,玩過攝影的朋友是不是想到了人像處理中常用的“高低頻磨皮”~)
爲什麼放大縮小圖片會看到不同的結果?
在瞭解了圖像高低頻的定義後,我們就不難理解爲什麼遠近看混合圖像會感覺效果不同。
當我們放大混合圖像時,可以清楚地看到高頻信息,於是人眼更傾向於識別這部分的信息。相反地,當我們縮小圖片時,高頻信息就不那麼容易被觀察到了,這時候我們我們就更傾向於識別低頻的部分。
這裏我做了一張哈利波特和伏地魔的混疊圖像。可以看到,當圖像放大時我們看到的是哈利波特,而當圖片縮小時,我們會認爲這張圖片是描述伏地魔的。
如何實現混合圖像的效果?
實現的總體思路很簡單——將只有低頻信息的圖片和只有高頻信息的圖像疊加在一起。具體步驟如下:
- 取第一張圖片:
a. 準備好低頻的濾波器(常用高斯模糊)
b. 將圖像轉爲矩陣,分層(如JPG圖像會分成RGB三層)處理。其中,第一二列表示圖像的橫縱座標,第三列存儲不同的層的index(如JPG有0-2,PNG有0-3(其中第四層(3)存的是透明度));舉個栗子,[;, ;, 0] 指的是R層的數據點
c. 每一個維度的圖片分別與高斯濾波器做卷積 - 取第二張圖片:
a. 準備好低頻的濾波器(常用高斯模糊)
b. 將圖像轉爲矩陣
c. 每一個維度的圖片分別與高斯濾波器做卷積
d. 用原圖矩陣減去卷機後的矩陣,得到高頻圖矩陣 - 將兩個處理後的圖像矩陣相加,得到混合圖像
如何用代碼實現?
https://github.com/MinisculeDust/Hybrid-Image