ndimage.zoom(input,zoom,output=None,order,mode='constant',cval=0.0,prefilter=True)函數(shù)
此函數(shù)將輸入的圖片從一個(gè)顏色域轉(zhuǎn)換到另一個(gè)。
參數(shù)
input: 以數(shù)組形式輸入圖片
zoom:浮點(diǎn)數(shù)或數(shù)組。如果是一個(gè)浮點(diǎn)數(shù),對每一個(gè)軸放縮相同的倍數(shù)。如果是一個(gè)數(shù)組,則對每一個(gè)軸分配一個(gè)值。
output:輸出,默認(rèn)為None
order:整型(范圍0-5)樣條插值的順序,默認(rèn)為3。詳見后續(xù)
return
mode:字符串,包括{‘reflect’, ‘constant’, ‘nearest’, ‘mirror’, ‘wrap’},輸入的數(shù)組如何擴(kuò)展邊界,默認(rèn)為 ‘constant'(具體參考官方文檔插值的邊界處理)
cval:浮點(diǎn)數(shù),當(dāng)插值的邊界處理模式為’constant‘時(shí)發(fā)揮作用。默認(rèn)為0.0
prefilter:bool,input輸入的數(shù)組是否經(jīng)過一個(gè)預(yù)樣條濾波器,默認(rèn)為True
測試
設(shè)原圖,
目標(biāo)圖片
設(shè)之比為
,
,則:
設(shè)原圖坐標(biāo)上的像素點(diǎn),
目標(biāo)圖片坐標(biāo)上的像素的為
最鄰近插值算法(當(dāng)參數(shù)order=0時(shí))
1.計(jì)算目標(biāo)圖片的坐標(biāo)點(diǎn)對應(yīng)原圖中哪個(gè)坐標(biāo)點(diǎn),公式為:
2.根據(jù)dst_x,dst_y的值四舍五入為整數(shù),填充到目標(biāo)圖片的相應(yīng)位置。
用圖片表示最鄰近插值算法的例子如下:
pic=ndimage.zoom(pic,2,order=0)


由上圖可以看到,經(jīng)過轉(zhuǎn)換后的圖片出現(xiàn)了鋸齒感。
用數(shù)組表示最鄰近插值算法的例子如下:
n1=np.array([
[1,2],
[3,4]
])
print(n1)
"""
[[1 2]
[3 4]]
"""
n1=ndimage.zoom(n1,2,order=0)
print(n1)
"""
[[1 1 2 2]
[1 1 2 2]
[3 3 4 4]
[3 3 4 4]]
"""
雙線性插值算法(當(dāng)參數(shù)order=1時(shí))
1.計(jì)算目標(biāo)圖片的坐標(biāo)點(diǎn)對應(yīng)原圖中哪個(gè)坐標(biāo)點(diǎn)(此步與最鄰近插值算法相同),公式為:
2.由于點(diǎn) 是個(gè)浮點(diǎn)數(shù)坐標(biāo),無法用整型的灰度值或RGB值來表示,因此雙線性插值算法通過尋找距離這個(gè)對應(yīng)坐標(biāo)最近的四個(gè)像素點(diǎn),來計(jì)算該點(diǎn)的值(灰度值或者RGB值)。
設(shè)分解后的坐標(biāo)為:
首先,在x方向上進(jìn)行線性插值,代表該點(diǎn)的像素值。
然后,在y方向上進(jìn)行線性插值:
得到的就是該點(diǎn)經(jīng)過處理后的像素值,填充到目標(biāo)圖片的相應(yīng)位置。
用圖片表示雙線性插值算法的例子如下
ndimage.zoom(pic,2,order=0)


可見,雙線性插值算法的鋸齒感要少于最鄰近插值法。
用數(shù)組表示雙線性插值算法的例子如下
n1=np.array([
[1,2,3],
[4,5,6],
[7,8,9],
])
print(n1)
"""
[[1 2 3]
[4 5 6]
[7 8 9]]
"""
n1=ndimage.zoom(n1,2,order=1)
print(n1)
"""
[[1 1 2 2 3 3]
[2 3 3 3 4 4]
[3 4 4 5 5 5]
[5 5 5 6 6 7]
[6 6 7 7 7 8]
[7 7 8 8 9 9]]
"""
三次插值法(order=3)
三次插值法(cubic interpolation method)是一種多項(xiàng)式插值法,逐次以三次曲線φ(t)=a0+a1t+a2t2+a3t3的極小點(diǎn)逼近尋求函數(shù)f(t)的極小點(diǎn)的一種方法.(摘自百度百科)
用圖片表示三次插值算法的例子如下
ndimage.zoom(pic,2,order=2)


可見,三次插值法處理后的圖片幾乎沒有鋸齒感
用數(shù)組表示三次插值算法的例子如下
n1=np.array([
[1,2,3],
[4,5,6],
[7,8,9],
])
print(n1)
"""
[[1 2 3]
[4 5 6]
[7 8 9]]
"""
n3=ndimage.zoom(n1,2,order=2)
print(n3)
"""
[[1 1 2 2 3 3]
[2 2 2 3 3 4]
[3 3 4 4 5 5]
[5 5 6 6 7 7]
[6 7 7 8 8 8]
[7 7 8 8 9 9]]
"""