1 最近鄰插值
1.1 基本原理
假定
- 源圖像的尺寸為
- 經(jīng)最近鄰插值處理后的圖像的尺寸為
由此可以得到縮放倍數(shù)
現(xiàn)取圖像中的一點(diǎn),可以知道對(duì)應(yīng)在圖像中的理論計(jì)算位置為
而上式得出來的在A中的理論位置數(shù)值顯然可能為小數(shù)祈坠,這代表該點(diǎn)在中無實(shí)際對(duì)應(yīng)點(diǎn)害碾,此時(shí)對(duì)其四舍五入,即是把圖像中距離該理論點(diǎn)最近的一個(gè)的點(diǎn)當(dāng)作它赦拘,即為最近鄰插值慌随。
1.2 Code
import numpy as np
import math
def nearest_neighbor(input_signal, zoom_multiples):
'''
最近鄰插值(適用于灰度圖)
:param input_signal: 輸入圖像
:param zoom_multiples: 縮放倍數(shù)
:return: 縮放后的圖像
'''
input_signal_cp = np.copy(input_signal) # 輸入圖像的副本
input_row, input_col = input_signal_cp.shape # 輸入圖像的尺寸(行、列)
# 輸出圖像的尺寸
output_row = int(input_row * zoom_multiples)
output_col = int(input_col * zoom_multiples)
output_signal = np.zeros((output_row, output_col)) # 輸出圖片
for i in range(output_row):
for j in range(output_col):
# 輸出圖片中坐標(biāo) (i躺同,j)對(duì)應(yīng)至輸入圖片中的(m阁猜,n)
m = round(i / output_row * input_row)
n = round(j / output_col * input_col)
# 防止四舍五入后越界
if m >= input_row:
m = input_row - 1
if n >= input_col:
n = input_col - 1
# 插值
output_signal[i, j] = input_signal_cp[m, n]
return output_signal
1.3 對(duì)比
- 放大倍數(shù) = 10
-
放大倍數(shù)=0.5
2 雙線性插值
2.1 基本原理
實(shí)際上,雙線性插值的原理同最近鄰類似蹋艺,首先同樣的步驟根據(jù)放大倍數(shù)與縮放前后的圖像尺寸找到圖像中對(duì)應(yīng)圖像中,然后找到它最近的四個(gè)點(diǎn)捎谨,根據(jù)下列表達(dá)式計(jì)算該點(diǎn)的值民效,即完成雙線性插值。
其中
- 為向下取整
相對(duì)于最近鄰插值簡(jiǎn)單的四舍五入,雙線性插值的處理更為科學(xué)州叠,優(yōu)化了邊緣保護(hù)棵红。
2.2 Code
import numpy as np
import math
def double_linear(input_signal, zoom_multiples):
'''
雙線性插值
:param input_signal: 輸入圖像
:param zoom_multiples: 放大倍數(shù)
:return: 雙線性插值后的圖像
'''
input_signal_cp = np.copy(input_signal) # 輸入圖像的副本
input_row, input_col = input_signal_cp.shape # 輸入圖像的尺寸(行凶赁、列)
# 輸出圖像的尺寸
output_row = int(input_row * zoom_multiples)
output_col = int(input_col * zoom_multiples)
output_signal = np.zeros((output_row, output_col)) # 輸出圖片
for i in range(output_row):
for j in range(output_col):
# 輸出圖片中坐標(biāo) (i咧栗,j)對(duì)應(yīng)至輸入圖片中的最近的四個(gè)點(diǎn)點(diǎn)(x1逆甜,y1)(x2, y2),(x3致板, y3)交煞,(x4,y4)的均值
temp_x = i / output_row * input_row
temp_y = j / output_col * input_col
x1 = int(temp_x)
y1 = int(temp_y)
x2 = x1
y2 = y1 + 1
x3 = x1 + 1
y3 = y1
x4 = x1 + 1
y4 = y1 + 1
u = temp_x - x1
v = temp_y - y1
# 防止越界
if x4 >= input_row:
x4 = input_row - 1
x2 = x4
x1 = x4 - 1
x3 = x4 - 1
if y4 >= input_col:
y4 = input_col - 1
y3 = y4
y1 = y4 - 1
y2 = y4 - 1
# 插值
output_signal[i, j] = (1-u)*(1-v)*int(input_signal_cp[x1, y1]) + (1-u)*v*int(input_signal_cp[x2, y2]) + u*(1-v)*int(input_signal_cp[x3, y3]) + u*v*int(input_signal_cp[x4, y4])
return output_signal
2.3 對(duì)比
-
放大倍數(shù) = 0.5
-
放大倍數(shù) = 10