opencv
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst
interpolation 選項(xiàng) 所用的插值方法
INTER_NEAREST 最近鄰插值
INTER_LINEAR 雙線性插值(默認(rèn)設(shè)置)
INTER_AREA 使用像素區(qū)域關(guān)系進(jìn)行重采樣。 它可能是圖像抽取的首選方法,因?yàn)樗鼤?huì)產(chǎn)生無云紋理的結(jié)果讲婚。 但是當(dāng)圖像縮放時(shí)广恢,它類似于INTER_NEAREST方法昔驱。
INTER_CUBIC 4x4像素鄰域的雙三次插值
INTER_LANCZOS4 8x8像素鄰域的Lanczos插值
最近鄰插值
我們就舉個(gè)簡(jiǎn)單的圖像:33 的256級(jí)灰度圖眠寿。假如圖像的象素矩陣如下圖所示(這個(gè)原始圖把它叫做源圖,Source):
234 38 22
67 44 12
89 65 63
這 個(gè)矩陣中蠢箩,元素坐標(biāo)(x,y)是這樣確定的劳翰,x從左到右敦锌,從0開始,y從上到下佳簸,也是從零開始乙墙,這是圖象處理中最常用的坐標(biāo)系。
如果想把這副圖放大為 44大小的圖像生均,那么該怎么做呢听想?那么第一步肯定想到的是先把44的矩陣先畫出來再說,好了矩陣畫出來了马胧,如下所示汉买,當(dāng)然,矩陣的每個(gè)像素都是未知數(shù)佩脊,等待著我們?nèi)ヌ畛洌ㄟ@個(gè)將要被填充的圖的叫做目標(biāo)圖,Destination):
? ? ? ?
? ? ? ?
? ? ? ?
? ? ? ?
然后要往這個(gè)空的矩陣?yán)锩嫣钪盗送苷常畹闹祻哪睦飦韥砟匦嗌渴菑脑磮D中來,好组题,先填寫目標(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))=>(00.75,00.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),套用公式:
(10.75,00.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)算過程就是這樣的:(10.75,00.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)單的最鄰近插值要好很多。
雙線性內(nèi)插值算法描述如下:
對(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)處的的像素值漫谷,以此類推。
比如蹂析,象剛才的例子舔示,現(xiàn)在假如目標(biāo)圖的象素坐標(biāo)為(1,1)识窿,那么反推得到的對(duì)應(yīng)于源圖的坐標(biāo)是(0.75 , 0.75), 這其實(shí)只是一個(gè)概念上的虛擬象素,實(shí)際在源圖中并不存在這樣一個(gè)象素,那么目標(biāo)圖的象素(1斩郎,1)的取值不能夠由這個(gè)虛擬象素來決定,而只能由源圖的這四個(gè)象素共同決定:(0喻频,0)(0缩宜,1)(1,0)(1甥温,1)锻煌,而由于(0.75,0.75)離(1,1)要更近一些姻蚓,那么(1,1)所起的決定作用更大一些宋梧,這從公式1中的系數(shù)uv=0.75×0.75就可以體現(xiàn)出來,而(0.75,0.75)離(0狰挡,0)最遠(yuǎn)捂龄,所以(0,0)所起的決定作用就要小一些加叁,公式中系數(shù)為(1-u)(1-v)=0.25×0.25也體現(xiàn)出了這一特點(diǎn)倦沧。
2,計(jì)算方法
首先它匕,在X方向上進(jìn)行兩次線性插值計(jì)算展融,然后在Y方向上進(jìn)行一次插值計(jì)算。
在圖像處理的時(shí)候豫柬,我們先根據(jù)
srcX=dstX* (srcWidth/dstWidth) ,
srcY = dstY * (srcHeight/dstHeight)
來計(jì)算目標(biāo)像素在源圖像中的位置告希,這里計(jì)算的srcX和srcY一般都是浮點(diǎn)數(shù)扑浸,比如f(1.2, 3.4)這個(gè)像素點(diǎn)是虛擬存在的,先找到與它臨近的四個(gè)實(shí)際存在的像素點(diǎn)
⊙嗯肌(1喝噪,3) (2,3)
≈该础(1仙逻,4) (2,4)
寫成f(i+u,j+v)的形式涧尿,則u=0.2,v=0.4, i=1, j=3
在沿著X方向差插值時(shí),f(R1)=u(f(Q21)-f(Q11))+f(Q11)
沿著Y方向同理計(jì)算檬贰。
或者姑廉,直接整理一步計(jì)算,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) 翁涤。