opencv的雙立方插值

2021-10-25 08:24:49 字數 2425 閱讀 2301

寫opencv的時候用到了resize函式,

看到乙個引數inter_cubic

cv::interpolationflags::inter_cubic
這個引數就是表示使用雙立方插值的方式對影象進行縮放。

然後就去查了一下雙立方插值演算法。

然後說一下雙立方插值怎麼計算的:

1、先給出一張影象src(原影象),大小假設為(m,n)

輸出影象定義為dst

輸出影象的大小定義為size size(m,n)

2、輸出影象的dst(i,j)的值怎麼計算呢?

首先我們判斷一下縮放後的dst(i,j)在原圖src中位置在哪?

可以按照計算方式:

float row = i*m/m;

float col = j*n/n;

這裡計算出來的位置為(row,col),也就是dst(i,j)在原圖中的位置的值是src(row,col),也就是dst(i,j) = src(row,col);

2、但是row,col都是浮點數,那怎麼計算src(row,col)這個值呢?

好吧,這個圖1很多地方都有了,這裡借用一下。圖中暫且可以把p點認為是點(row,col),那這裡就是要計算p點的值,

p點的值怎麼計算呢,這裡是取p點周圍的16個畫素,類似於下圖1,

然後p點的值(影響因子w_ij乘以a_ij,然後求和):

3、這裡上面已經可以計算src(row,col)了,也就可以得到dst(i,j),因為dst(i,j)=src(row,col),

但是上面出現了乙個

這裡w_ij就是上面說的影響因子,圖一中4*4影象每個畫素對應乙個影響因子,總共16個,怎麼計算這16個影響因子。

這裡要引入乙個函式,bicubic函式,影響因子的計算就是基於這個函式:

通過獲取每行(列)畫素對應的x就可以獲取w_ij了。

4、所以x(y)的值要怎麼計算呢?

這裡現獲得x_i(行),y_j(列),然後獲得w_i,w_j,最後w_ij=w_i*w_j.

//行

x_0 = (1+u);

x_1 = (u);

x_2 = (1-u);

x_3 = (2-u);

//列y_0 = (1+v);

y_1 = (v);

y_2 = (1-v);

y_3 = (2-v);

//u = row - (int)row

//v = col - (int)col

w_i = w(x_i);//行影響因子

w_j = w(y_j);//列影響因子

w_ij = w_i*w_j;

到這裡,就已經獲得了所有需要的東西,就可以計算了。

#include #include #include using namespace cv;

//雙立方插值函式

float bicubic(float x)

void getimpactfactors(float rowu,float colv,vector& rowimfac,vector& colimfac,int starti,int startj)

//計算列係數因子

這裡要說一點,opencv裡面a取的是-0.75,我這裡取的是0.25,

這裡我試驗過幾次,我的a值取-0.5或者-0.75的時候,會出現問題,會有一些豎向的痕跡,

a值取0.25或者0.5的時候就沒有問題。

除此之外,如果a值取-0.5或者-0.75,並且影象size(col,row)以相同比例縮放,也不會出現豎向的痕跡。

總的來說不是太複雜,,,,

不過還有很多需要學習的地方,

雙圓弧插值演算法(二)

雙圓弧插值演算法 二 找到中心 找到連線點後,就可以求解圓心。我們定義乙個向量,n1,垂直於t1。這最終是乙個與 c1 p1 平行的標準化向量。從p1到c1的方向。綜合起來,我們得到了c1的解。通過檢查上述方程中的分母,我們可以看出,如果p1到pm的向量與t1共線,它將為零。圓的中心基本上被推到無窮...

OpenCV 雙線性插值法

定義 又稱雙線性內插。在數學上,雙線性插值是有兩個變數的插值函式的線性插值擴充套件,其核心思想是在兩個方向上分別進行一次線性插值。對於乙個目的畫素,設定座標通過反向變換得到的浮點座標為 i u,j v 其中i j均為浮點座標的整數部分,u v為浮點座標的小數部分,是取值 0,1 區間的浮點數 則這個...

插值查詢的問題

對於插值查詢的效率很高,但是我發現乙個問題,就是在不連續的情況下,找 arrarr之間的數時應該是返回 1,但是出現了堆疊溢位異常 以下是 public static void main string args int i insertvalue arr,0,arr.length 1,50 syst...