當前位置:首頁 » 操作系統 » 立方插值演算法

立方插值演算法

發布時間: 2023-08-22 13:28:09

『壹』 什麼是插值

「插值」最初是電腦的術語,現在引用到數碼圖像的處理上。即圖像放大時,像素也相應地增加,增加的過程就是「插值」程序自動選擇信息較好的像素作為增加的像素,而並非只使用臨近的像素,所以在放大圖像時,圖像看上去會比較平滑、干凈。不過需要說明的是插值並不能增加圖像信息。通俗地講插值的效果實際就是給一杯香濃的咖啡兌了一些白開水。 ★ 常見的插值方法及其原理 1. 最臨近像素插值:圖像出現了馬賽克和鋸齒等明顯走樣的原因。不過最臨近插值法的優點就是速度快。 2. 線性插值(Linear):線性插值速度稍微要慢一點,但效果要好不少。所以線性插值是個不錯的折中辦法。 3. 其他插值方法:立方插值,樣條插值等等,它們的目的是試圖讓插值的曲線顯得更平滑,為了達到這個目的,它們不得不利用到周圍若干范圍內的點,不過計算量顯然要比前兩種大許多。 在以上的基礎上,有的軟體還發展了更復雜的改進的插值方式譬如S-SPline、Turbo Photo等。它們的目的就是使邊緣的表現更完美。 ★ 評斷插值結果的好壞 第一個標准:走樣現象的輕重。放大圖像的時候,要看邊緣是否產生了鋸齒,縮小圖像的時候,看看是否有干擾條紋,邊緣是否平順。第二個標准:邊緣是否清晰?同樣貼兩個例子,左邊是差的演算法,右邊是好的演算法(如圖1)。第三個標准:過渡帶的層次感細節感怎麼樣?貼兩個例子,左邊是差的演算法,右邊是好的演算法(如圖2)。 插值的今生 ★ 是否有必要 購買插值數碼相機 看了上面的原理介紹,相信大家應該已經了解了插值實際上就是一種技術,它能給我們的照片信息提供一些美化和提高,但是這樣的技術提升是有限制的,使用320×240解析度的相機是不可能代替百萬像素的數碼相機的,雖然我們可以使用Photoshop將解析度為320×240的照片放大成1280×960,但它的照片真實信息仍然只有320×240。其餘增加的可都是「白開水」。]

『貳』 圖像雙三次插值演算法原理及python實現

一. 圖像雙三次插值演算法原理:

        假設源圖像 A 大小為 m*n ,縮放後的目標圖像 B 的大小為 M*N 。那麼根據比例我們可以得到 B(X,Y) 在 A 上的對應坐標為 A(x,y) = A( X*(m/M), Y*(n/N) ) 。在雙線性插值法中,我們選取 A(x,y) 的最近四個點。而在雙立方插值法中,我們選取的是最近的16個像素點作為計算目標圖像 B(X,Y) 處像素值的參數。如圖所示:

        如圖所示 P 點就是目標圖像 B 在 (X,Y) 處對應於源圖像中的位置,P 的坐標位置會出現小數部分,所以我們假設 P 的坐標為 P(x+u,y+v),其中 x,y 分別表示整數部分,u,v 分別表示小數部分。那麼我們就可以得到如圖所示的最近 16 個像素的位置,在這里用 a(i,j)(i,j=0,1,2,3) 來表示。 

        雙立方插值的目的就是通過找到一種關系,或者說系數,可以把這 16 個像素對於 P 處像素值的影響因子找出來,從而根據這個影響因子來獲得目標圖像對應點的像素值,達到圖像縮放的目的。 

        BiCubic基函數形式如下:

二. python實現雙三次插值演算法

from PIL import Image

import numpy as np

import math

# 產生16個像素點不同的權重

def BiBubic(x):

    x=abs(x)

    if x<=1:

        return 1-2*(x**2)+(x**3)

    elif x<2:

        return 4-8*x+5*(x**2)-(x**3)

    else:

        return 0

# 雙三次插值演算法

# dstH為目標圖像的高,dstW為目標圖像的寬

def BiCubic_interpolation(img,dstH,dstW):

    scrH,scrW,_=img.shape

    #img=np.pad(img,((1,3),(1,3),(0,0)),'constant')

    retimg=np.zeros((dstH,dstW,3),dtype=np.uint8)

    for i in range(dstH):

        for j in range(dstW):

            scrx=i*(scrH/dstH)

            scry=j*(scrW/dstW)

            x=math.floor(scrx)

            y=math.floor(scry)

            u=scrx-x

            v=scry-y

            tmp=0

            for ii in range(-1,2):

                for jj in range(-1,2):

                    if x+ii<0 or y+jj<0 or x+ii>=scrH or y+jj>=scrW:

                        continue

                    tmp+=img[x+ii,y+jj]*BiBubic(ii-u)*BiBubic(jj-v)

            retimg[i,j]=np.clip(tmp,0,255)

    return retimg

im_path='../paojie.jpg'

image=np.array(Image.open(im_path))

image2=BiCubic_interpolation(image,image.shape[0]*2,image.shape[1]*2)

image2=Image.fromarray(image2.astype('uint8')).convert('RGB')

image2.save('BiCubic_interpolation.jpg')

三. 實驗結果:

四. 參考內容:

         https://www.cnblogs.com/wojianxin/p/12516762.html

         https://blog.csdn.net/Ibelievesunshine/article/details/104942406

『叄』 Matlab中插值函數

MATLAB中的插值函數為interp1,其調用格式為: yi= interp1(x,y,xi,'method') 其中x,y為插值點,yi為在被插值點xi處的插值結果;x,y為向量, 'method'表示採用的插值方法,MATLAB提供的插值方法有幾種: 'method'是最鄰近插值, 'linear'線性插值; 'spline'三次樣條插值; 'cubic'立方插值.預設時表示線性插值。 注意:所有的插值方法都要求x是單調的,並且xi不能夠超過x的范圍。 例:在一 天24小時內,從零點開始每間隔2小時測得的環境溫度數據分別為 12,9,9,10,18 ,24,28,27,25,20,18,15,13 問題:推測中午12點(即13點)時的溫度. 功能 一維數據插值(表格查找)。該命令對數據點之間計算內插值。它找出一元函數f(x)在中間點的數值。其中函數f(x)由所給數據決定。 x:原始數據點 Y:原始數據點 xi:插值點 Yi:插值點 (1)yi = interp1(x,y,xi,method) 用指定的演算法計算插值: 』nearest』:最近鄰點插值,直接完成計算; 』linear』:線性插值(預設方式),直接完成計算; 』spline』:三次樣條函數插值。 』cubic』:該方法保留單調性與數據的外形; 功能 二維數據內插值 (1)ZI = interp2(X,Y,Z,XI,YI,method) 返回矩陣ZI,其元素包含對應於參量XI 與YI(可以是向量、或同型矩陣) 的元素, 即Zi(i,j) ←[Xi(i,j),yi(i,j)]。用戶可以輸入行向量和列向量Xi 與Yi,此時,輸出向量Zi 與矩陣meshgrid(xi,yi)是同型的。 (2)ZI = interp2(Z,XI,YI) 預設地,X=1:n、Y=1:m,其中[m,n]=size(Z)。再按第一種情形進行計算。 用指定的演算法method 計算二維插值: 』linear』:雙線性插值演算法(預設演算法); 』nearest』:最臨近插值; 』spline』:三次樣條插值; 』cubic』:雙三次插值。 (4)VI = interp3(X,Y,Z,V,XI,YI,ZI,method) 找出由參量X,Y,Z決定的三元函數V=V(X,Y,Z)在點(XI,YI,ZI)的值。 %用指定的演算法method 作插值計算: 『linear』:線性插值(預設演算法); 『cubic』:三次插值; 『spline』:三次樣條插值; 『nearest』:最鄰近插值。 功能 數據格點 (1)ZI = griddata(x,y,z,XI,YI,method) 用二元函數z=f(x,y)的曲面擬合有不規則的數據向量x,y,z。griddata 將返回曲面z 在點(XI,YI)處的插值。曲面總是經過這些數據點(x,y,z)的輸入參量(XI,YI)通常是規則的格點(像用命令meshgrid 生成的一樣)。 用指定的演算法method 計算: 『linear』:基於三角形的線性插值(預設演算法); 『cubic』: 基於三角形的三次插值; 『nearest』:最鄰近插值法; 『v4』:MATLAB 4 中的griddata 演算法。 功能 三次樣條數據插值 格式 (1)yy = spline(x,y,xx) 功能 生成用於畫三維圖形的矩陣數據 格式 [X,Y] = meshgrid(x,y) 將由向量x,y(可以是不同方向的)指定的區域[min(x),max(x) , min(y) , max(y)] 用直線x=x(i),y=y(j) ( i=1,2,…,length(x) ,j=1,2,…,length(y))進行劃分。這樣,得到了length(x)*length(y)個點, 這些點的橫坐標用矩陣X 表示,X 的每個行向量與向量x 相同;這些點的縱坐標用矩陣Y 表示,Y 的每個列向量與向量y 相同。其中X,Y可用於計算二元函數z=f(x,y)與三維圖形中xy 平面矩形定義域的劃分或曲面作圖。 [X,Y] = meshgrid(x) %等價於[X,Y]=meshgrid(x,x)。 [X,Y,Z] = meshgrid(x,y,z) %生成三維陣列X,Y,Z,用於計算三元函數v=f(x,y,z)或三維容積圖。
熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:645
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:936
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:632
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:821
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:731
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1066
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:299
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:160
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:852
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:763