最近邻插值、双线性插值、双三次插值
?
1.最近鄰插值
越是簡(jiǎn)單的模型越適合用來舉例子,我們就舉個(gè)簡(jiǎn)單的圖像:3X3 的256級(jí)灰度圖,也就是高為3個(gè)象素,寬也是3個(gè)象素的圖像,每個(gè)象素的取值可以是 0-255,代表該像素的亮度,255代表最亮,也就是白色,0代表最暗,即黑色。假如圖像的象素矩陣如下圖所示(這個(gè)原始圖把它叫做源圖,Source):
234?? 38??? 22
67???? 44??? 12
89???? 65??? 63
這個(gè)矩陣中,元素坐標(biāo)(x,y)是這樣確定的,x從左到右,從0開始,y從上到下,也是從零開始,這是圖象處理中最常用的坐標(biāo)系,就是這樣一個(gè)坐標(biāo):
? ---------------------->X
? |
? |
? |
? |
? |
∨Y
如果想把這副圖放大為 4X4大小的圖像,那么該怎么做呢?那么第一步肯定想到的是先把4X4的矩陣先畫出來再說,好了矩陣畫出來了,如下所示,當(dāng)然,矩陣的每個(gè)像素都是未知數(shù),等待著我們?nèi)ヌ畛?#xff08;這個(gè)將要被填充的圖的叫做目標(biāo)圖,Destination):
???????? ???????? ??????? ?
???????? ???????? ??????? ?
???????? ???????? ??????? ?
???????? ???????? ??????? ??
???????????????
??????? 然后要往這個(gè)空的矩陣?yán)锩嫣钪盗?#xff0c;要填的值從哪里來來呢?是從源圖中來,好,先填寫目標(biāo)圖最左上角的象素,坐標(biāo)為(0,0),那么該坐標(biāo)對(duì)應(yīng)源圖中的坐標(biāo)可以由如下公式得出:??????????????????????????????????????
srcX=dstX* (srcWidth/dstWidth) , srcY = dstY * (srcHeight/dstHeight)
好了,套用公式,就可以找到對(duì)應(yīng)的原圖的坐標(biāo)了(0*(3/4),0*(3/4))=>(0*0.75,0*0.75)=>(0,0)
,找到了源圖的對(duì)應(yīng)坐標(biāo),就可以把源圖中坐標(biāo)為(0,0)處的234象素值填進(jìn)去目標(biāo)圖的(0,0)這個(gè)位置了。
接下來,如法炮制,尋找目標(biāo)圖中坐標(biāo)為(1,0)的象素對(duì)應(yīng)源圖中的坐標(biāo),套用公式:
(1*0.75,0*0.75)=>(0.75,0)
結(jié)果發(fā)現(xiàn),得到的坐標(biāo)里面竟然有小數(shù),這可怎么辦?計(jì)算機(jī)里的圖像可是數(shù)字圖像,象素就是最小單位了,象素的坐標(biāo)都是整數(shù),從來沒有小數(shù)坐標(biāo)。這時(shí)候采用的一種策略就是采用四舍五入的方法(也可以采用直接舍掉小數(shù)位的方法),把非整數(shù)坐標(biāo)轉(zhuǎn)換成整數(shù),好,那么按照四舍五入的方法就得到坐標(biāo)(1,0),完整的運(yùn)算過程就是這樣的:
(1*0.75,0*0.75)=>(0.75,0)=>(1,0)
那么就可以再填一個(gè)象素到目標(biāo)矩陣中了,同樣是把源圖中坐標(biāo)為(1,0)處的像素值38填入目標(biāo)圖中的坐標(biāo)。
?????????
依次填完每個(gè)象素,一幅放大后的圖像就誕生了,像素矩陣如下所示:
234??? 38???? 22???? 22??
67????? 44???? 12???? 12??
89????? 65???? 63???? 63??
89????? 65???? 63???? 63??
這種放大圖像的方法叫做最臨近插值算法,這是一種最基本、最簡(jiǎn)單的圖像縮放算法,效果也是最不好的,放大后的圖像有很嚴(yán)重的馬賽克,縮小后的圖像有很嚴(yán)重的失真;效果不好的根源就是其簡(jiǎn)單的最臨近插值方法引入了嚴(yán)重的圖像失真,比如,當(dāng)由目標(biāo)圖的坐標(biāo)反推得到的源圖的的坐標(biāo)是一個(gè)浮點(diǎn)數(shù)的時(shí)候,采用了四舍五入的方法,直接采用了和這個(gè)浮點(diǎn)數(shù)最接近的象素的值,這種方法是很不科學(xué)的,當(dāng)推得坐標(biāo)值為 0.75的時(shí)候,不應(yīng)該就簡(jiǎn)單的取為1,既然是0.75,比1要小0.25 ,比0要大0.75 ,那么目標(biāo)象素值其實(shí)應(yīng)該根據(jù)這個(gè)源圖中虛擬的點(diǎn)四周的四個(gè)真實(shí)的點(diǎn)來按照一定的規(guī)律計(jì)算出來的,這樣才能達(dá)到更好的縮放效果。雙線型內(nèi)插值算法就是一種比較好的圖像縮放算法,它充分的利用了源圖中虛擬點(diǎn)四周的四個(gè)真實(shí)存在的像素值來共同決定目標(biāo)圖中的一個(gè)像素值,因此縮放效果比簡(jiǎn)單的最鄰近插值要好很多。
?
2.雙線性插值
根據(jù)于待求點(diǎn)P最近4個(gè)點(diǎn)的像素值,計(jì)算出P點(diǎn)的像素值。
1)簡(jiǎn)單理解
對(duì)于一個(gè)目的像素,設(shè)置坐標(biāo)通過反向變換得到的浮點(diǎn)坐標(biāo)為(i+u,j+v) (其中i、j均為浮點(diǎn)坐標(biāo)的整數(shù)部分,u、v為浮點(diǎn)坐標(biāo)的小數(shù)部分,是取值[0,1)區(qū)間的浮點(diǎn)數(shù)),則這個(gè)像素得值 f(i+u,j+v) 可由原圖像中坐標(biāo)為 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所對(duì)應(yīng)的周圍四個(gè)像素的值決定,即:
f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)
其中f(i,j)表示源圖像(i,j)處的的像素值,以此類推。
2)一般性
如上圖,已知Q12,Q22,Q11,Q21,但是要插值的點(diǎn)為P點(diǎn),這就要用雙線性插值了,首先在x軸方向上,對(duì)R1和R2兩個(gè)點(diǎn)進(jìn)行插值,這個(gè)很簡(jiǎn)單,然后根據(jù)R1和R2對(duì)P點(diǎn)進(jìn)行插值,這就是所謂的雙線性插值。說明:下式中f(*)為*點(diǎn)處像素值。
首先在?x?方向進(jìn)行線性插值,得到:
然后在?y?方向進(jìn)行線性插值,得到:
也即點(diǎn)P處像素值:
?
3.雙三次插值
假設(shè)源圖像A大小為m*n,縮放K倍后的目標(biāo)圖像B的大小為M*N,即K=M/m。A的每一個(gè)像素點(diǎn)是已知的,B是未知的,我們想要求出目標(biāo)圖像B中每一像素點(diǎn)(X,Y)的值,必須先找出像素(X,Y)在源圖像A中對(duì)應(yīng)的像素(x,y),再根據(jù)源圖像A距離像素(x,y)最近的16個(gè)像素點(diǎn)作為計(jì)算目標(biāo)圖像B(X,Y)處像素值的參數(shù),利用BiCubic基函數(shù)求出16個(gè)像素點(diǎn)的權(quán)重,圖B像素(x,y)的值就等于16個(gè)像素點(diǎn)的加權(quán)疊加。
根據(jù)比例關(guān)系x/X=m/M=1/K,我們可以得到B(X,Y)在A上的對(duì)應(yīng)坐標(biāo)為A(x,y)=A(X*(m/M),Y*(n/N))=A(X/K,Y/K)。如圖所示P點(diǎn)就是目標(biāo)圖像B在(X,Y)處對(duì)應(yīng)于源圖像A中的位置,P的坐標(biāo)位置會(huì)出現(xiàn)小數(shù)部分,所以我們假設(shè) P的坐標(biāo)為P(x+u,y+v),其中x,y分別表示整數(shù)部分,u,v分別表示小數(shù)部分(藍(lán)點(diǎn)到a11方格中紅點(diǎn)的距離)。那么我們就可以得到如圖所示的最近16個(gè)像素的位置,在這里用a(i,j)(i,j=0,1,2,3)來表示,如上圖。
?
?我們要做的就是求出BiCubic函數(shù)中的參數(shù)x,從而獲得上面所說的16個(gè)像素所對(duì)應(yīng)的權(quán)重W(x)。BiCubic基函數(shù)是一維的,而像素是二維的,所以我們將像素點(diǎn)的行與列分開計(jì)算。BiCubic函數(shù)中的參數(shù)x表示該像素點(diǎn)到P點(diǎn)的距離,例如a00距離P(x+u,y+v)的距離為(1+u,1+v),因此a00的橫坐標(biāo)權(quán)重i_0=W(1+u),縱坐標(biāo)權(quán)重j_0=W(1+v),a00對(duì)B(X,Y)的貢獻(xiàn)值為:(a00像素值)* i_0* j_0。因此,a0X的橫坐標(biāo)權(quán)重分別為W(1+u),W(u),W(1-u),W(2-u);ay0的縱坐標(biāo)權(quán)重分別為W(1+v),W(v),W(1-v),W(2-v);B(X,Y)像素值為:
對(duì)待插值的像素點(diǎn)(x,y)(x和y可以為浮點(diǎn)數(shù)),取其附近的4x4鄰域點(diǎn)(xi,yj), i,j = 0,1,2,3。按如下公式進(jìn)行插值計(jì)算:
?
總結(jié)
以上是生活随笔為你收集整理的最近邻插值、双线性插值、双三次插值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ITK读取RGB图像像素值
- 下一篇: 'fopen' This functio