寫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...