注意以下內容轉載 https://jason-chen-1992.weebly.com/home/nearest-neighbor-and-bilinear-interpolation
一、影像放大 Image Enlargement
在影像處理上,對來源影像(Source Image) 做放大,一直都是很實際也很常見的需求。例如:
假設你今天買了一台4K的螢幕(標準的解析度為:40962160),但是你今天要播放的片源為Full HD(19201080)的,那麼問題就來啦~ 你的螢幕該如何顯示呢? 總不能就螢幕中間一塊有影像其他地方都黑的吧…
如果這樣的話,你還不打爆這螢幕製造商… 的客服電話。
這時候影像放大的技術就派上用場了,但是來源影像比較小張,而輸出需求影像比較大張,自然就會有很多像數點(Pixel)是沒有數值的,需要我們去把數值給補上( 插值 , interpolation )。
至於要怎麼插? 插的好不好? 怎麼插才算好? 這就是一門學問了!
所以也就有很多人是專門在研究 [ 影像放大 - 插值 ] 的演算法。
而我們今天沒打算講那麼深,就簡單跟各位介紹最簡單、最基本的兩種方法:
最近鄰居插值 Nearest neighbor Interpolation
雙線性插值 Bilinear Interpolation
二、?最近鄰居插值 Nearest neighbor Interpolation
最近鄰居法的理念其實很簡單,顧名思義: 今天有一個點的數值不知道該填多少進去,去找離你最近的鄰居看它是多少你就填多少就對了!
就像你考試的時候有一題不知道答案是多少,看看隔壁的寫多少照填就對了xD
下面再提一個例子給各位看,假設我要把一張22的圖 Enlargement 2倍變成 44:
用最近鄰居法來插值雖然很簡單,但是可以想像效果不是那麼好,特別是當你放大倍率相當大的時候會產生類似馬賽克那樣一格一格的現象,在人類的視覺這是相當不好的!
所以接下來要介紹的方法就能改善這一現象。
三、雙線性插值 Bilinear Interpolation
至於雙線性插值,相比於最近鄰居只參考一個點;
它參考了周邊的四個點,並依據到各點的距離做為權重來決定要填入多少。
就像你考試的時候要作弊,你看了周邊的四個同學的答案是多少,再考量你信任他們的程度來填你的答案。
參考下圖,具體可表達為:
欲求的點:P(x,y)
四鄰點:Q11(x1,y1)、Q12(x1,y2)、Q21(x2,y1)、Q22(x2,y2)
設距離:a’ = x2 - x1 、b’ = y2 - y1、a = x - x1 、b= y - y1
P(x,y) = ( (a’-a)(b’-b)Q11 + a(b’-b)Q21 + b(a’-a)Q12 + abQ22 ) / ( a’ * b’ )
這邊有一點要注意的是,NN 的方法比較簡單可以直接 source-to-target mapping 到 Result,而Bilinear 應該就沒辦法這麼做,基本上我們會使用 inverse mapping 的方式,參考下圖。