調(diào)整圖像大小的三種插值算法總結(jié)
點(diǎn)擊下方卡片,關(guān)注“新機(jī)器視覺”公眾號
重磅干貨,第一時(shí)間送達(dá)
插值是一種在已知數(shù)據(jù)點(diǎn)的離散集合范圍內(nèi)構(gòu)造新數(shù)據(jù)點(diǎn)的方法。我們對自變量的中間值插值(或估計(jì))該函數(shù)的值。
有各種各樣的插值。讓我們關(guān)注其中的三個(gè)
近鄰插值
這種類型的插值是最基本的。我們簡單地將最近的像素插值到當(dāng)前像素。假設(shè),我們從0開始索引像素的值。下面2x2圖像的像素如下:{' 10 ':(0,0),' 20 ':(1,0),' 30 ':(0,1),' 40 ':(1,1)}

然后我們將此圖像投射到4x4圖像上,我們需要找到像素。我們發(fā)現(xiàn)未知像素位于(-0.5,-0.5),(-0.5,0.5)等等…
現(xiàn)在比較已知像素的值和最近的未知像素的值。之后,將最接近的值P(-0.5,-0.5)賦值為10,即像素在(0,0)處的值。
結(jié)果如下-

正如我們所看到的,我們得到一個(gè)4x4圖像,每個(gè)像素看起來比原始圖像更大。由于這種方法只是簡單地尋找最近的鄰居,并一次計(jì)算一個(gè)像素,它需要最少的處理時(shí)間。
為了在openCV中使用這種類型的插值來調(diào)整圖像的大小,我們在cv2中使用了cv2.INTER_NEAREST插值標(biāo)志
?import numpy as np
?import cv2
?from matplotlib import pyplot as plt
?
?img = cv2.imread("cube.png", -1);
?h, w, c = img.shape;
?
?img_n = cv2.resize(img, (w//2, h//2), interpolation = cv2.INTER_NEAREST);
?img_n = cv2.resize(img_n, (w, h), interpolation = cv2.INTER_NEAREST);此代碼片段輸出如下結(jié)果-

這種形式的插值只會讓每個(gè)像素更大,當(dāng)我們想要調(diào)整圖像的大小時(shí),這通常是有用的,而這些圖像沒有像條形碼那樣復(fù)雜的細(xì)節(jié)。
雙線性插值
在雙線性插值中,我們?nèi)∥粗袼氐?個(gè)最近的已知鄰域(2x2鄰域)的值,然后取這些值的平均值來分配未知像素。
讓我們首先了解如何在一個(gè)簡單的示例中工作。假設(shè)我們隨機(jī)取一個(gè)點(diǎn)(0。75,0。25)在四個(gè)點(diǎn)-的中間
(0,0)、(0,1),(1,0)、(1,1)。
我們首先用線性插值法求點(diǎn)A(0.75, 0)和點(diǎn)B(0.75, 1)的值。線性插值基本上是對兩點(diǎn)之間的一個(gè)點(diǎn)進(jìn)行近似根據(jù)兩點(diǎn)之間的距離來縮放這個(gè)點(diǎn)。
然后我們在點(diǎn)A和點(diǎn)B上使用線性插值得到所需的像素值(0.75,0.25)。
既然我們已經(jīng)理解了這些值是如何得到的,那么讓我們把它放到一個(gè)2x2圖像的環(huán)境中,這個(gè)圖像已經(jīng)進(jìn)行了最近的近鄰插值。
考慮將2x2圖像投影到4x4圖像上,但只有角落像素保留這些值。剩下的像素在技術(shù)上處于四個(gè)像素的中間,然后通過使用一個(gè)比例來根據(jù)更接近的像素分配權(quán)重來計(jì)算。
例如,考慮像素(0,0)為10,像素(0,3)為20。像素(0,1)將通過取(0.75 * 10)+(0.25 * 20)得到12.5來計(jì)算。同樣,在調(diào)整大小的同時(shí)對圖像進(jìn)行線性插值,效果如下:

雙線性插值比近鄰插值具有更長的處理時(shí)間,因?yàn)樗枰?個(gè)像素值來計(jì)算被插值的像素。然而,它提供了一個(gè)更平滑的輸出。
為了在openCV中使用這種類型的插值來調(diào)整圖像的大小,我們在cv2中使用了cv2.INTER_LINEAR插值。導(dǎo)入上面最近鄰插值方法下給出的相同庫,使用cv2讀取圖像,然后使用cv2.INTER_LINEAR插值。
?img_b = cv2.resize(img, (w//2, h//2), interpolation = cv2.INTER_LINEAR);
?
?img_b = cv2.resize(img_b, (w, h), interpolation = cv2.INTER_LINEAR);
雙立方插值
在雙立方插值中,我們將待插值的像素周圍的16個(gè)像素(4x4鄰域)與雙線性插值中考慮的4個(gè)像素(2x2鄰域)相比。
考慮4x4曲面,我們可以用這個(gè)公式找到插值像素的值:

插值問題包括確定16個(gè)系數(shù)a??。這些系數(shù)可以由像素矩陣和單個(gè)像素的偏導(dǎo)數(shù)得到的p(x, y)值確定。
在計(jì)算系數(shù)后,我們將它們與已知像素的權(quán)重相乘,然后插值未知像素。讓我們使用和上面兩個(gè)例子一樣的輸入2x2圖像。通過雙立方插值,得到如下結(jié)果:

現(xiàn)在,為了用cv2執(zhí)行這個(gè)插值,我們將再次調(diào)用resize函數(shù),但這次是用cv2.INTER_CUBIC。同樣,在導(dǎo)入所有必要的庫并使用cv2.imread()讀取圖像之后運(yùn)行代碼
?img_c = cv2.resize(img, (w//2, h//2), interpolation = cv2.INTER_CUBIC);
?
?img_c = cv2.resize(img_b, (w, h), interpolation = cv2.INTER_CUBIC);與前兩種方法相比,這產(chǎn)生了明顯更清晰的圖像,并平衡了處理時(shí)間和輸出質(zhì)量。在許多編輯程序、打印機(jī)驅(qū)動程序和相機(jī)中都是用這種插值算法作為標(biāo)準(zhǔn)。
因此,我們可以看到不同的插值技術(shù)有不同的用例。因此,了解在調(diào)整圖像大小時(shí)最有用的插值類型非常重要。
作者:Annmay Sharma
原文地址:https://annmay10.medium.com/resizing-images-using-various-interpolation-techniques-4b99800999f2
deephub翻譯組
來源:DeepHub IMBA
本文僅做學(xué)術(shù)分享,如有侵權(quán),請聯(lián)系刪文。
