2021-02-07 Python scipy ndimage.zoom()函數(shù)

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è)原圖size=(width_s,height_s),
目標(biāo)圖片size=(width_d,height_d)
設(shè)size之比為P_x,P_y,則:

P_x=width_s \div width_d
P_y=height_s\div height_d

設(shè)原圖坐標(biāo)上的像素點(diǎn)pixel=(src_x,src_y),
目標(biāo)圖片坐標(biāo)上的像素的為pixel=(dst_x,dst_y)

最鄰近插值算法(當(dāng)參數(shù)order=0時(shí))

1.計(jì)算目標(biāo)圖片的坐標(biāo)點(diǎn)對應(yīng)原圖中哪個(gè)坐標(biāo)點(diǎn),公式為:

dst_x=P_x \times src_x
dst_y=P_y \times src_y

2.根據(jù)dst_x,dst_y的值四舍五入為整數(shù),填充到目標(biāo)圖片的相應(yīng)位置。

用圖片表示最鄰近插值算法的例子如下:

pic=ndimage.zoom(pic,2,order=0)
原圖片

轉(zhuǎn)換后的圖片

由上圖可以看到,經(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)(此步與最鄰近插值算法相同),公式為:

dst_x=P_x \times src_x
dst_y=P_y \times src_y

2.由于點(diǎn) (dst_x,dst_y)是個(gè)浮點(diǎn)數(shù)坐標(biāo),無法用整型的灰度值或RGB值來表示,因此雙線性插值算法通過尋找距離這個(gè)對應(yīng)坐標(biāo)最近的四個(gè)像素點(diǎn),來計(jì)算該點(diǎn)的值(灰度值或者RGB值)。
設(shè)分解后的坐標(biāo)為:

Q_1=(x_1,y_1),Q_2=(x_1,y_2),Q_3=(x_2,y_1),Q_4=(x_2,y_2)

首先,在x方向上進(jìn)行線性插值,f(x,y)代表該點(diǎn)的像素值。

f(R_1)=\frac{x_2-dst_x}{x_2-x_1} \times f(Q_1)+\frac{dst_x-x_1}{x_2-x_1} \times f(Q_3)
f(R_2)=\frac{x_2-dst_x}{x_2-x_1} \times f(Q_2)+\frac{dst_x-x_1}{x_2-x_1} \times f(Q_4)

然后,在y方向上進(jìn)行線性插值:

f(dst_x,dst_y)=\frac{y_2-dst_y}{y_2-y_1} \times f(R_1)+\frac{dst_y-y_1}{y_2-y_1} \times f(R_2)

得到的f(dst_x,dst_y)就是該點(diǎn)經(jīng)過處理后的像素值,填充到目標(biāo)圖片的相應(yīng)位置。

用圖片表示雙線性插值算法的例子如下

ndimage.zoom(pic,2,order=0)
原圖片
轉(zhuǎn)換后的圖片

可見,雙線性插值算法的鋸齒感要少于最鄰近插值法。

用數(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)
原圖片
轉(zhuǎn)換后的圖片

可見,三次插值法處理后的圖片幾乎沒有鋸齒感

用數(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]]
"""
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容