計算機視覺(五)雙三次插值(Bicubic Interpolation)算法介紹及opencv和matlab的代碼實現及區別

超分辨率基礎_插值算法簡介

1.插值算法

數學的數值分析領域中,內插或稱插值(英語:interpolation)是一種通過已知的、離散的數據點,在範圍內推求新數據點的過程或方法。常見的三種插值算法爲最近鄰插值、雙線性插值和雙三次插值。

一組離散數據點在一個外延的插值。曲線中實際已知數據點是紅色的;連接它們的藍色曲線即爲插值。

2.最近鄰插值算法

最鄰插值算法(Nearest Neighbor interpolation)是最簡單的一種插值算法,當圖片放大時,缺少的像素通過直接使用與之最近原有像素生成,原理就是選取距離插入的像素點(x+u, y+v)【注:x,y爲整數, u,v爲小數】最近的一個像素點,用它的像素點的灰度值代替插入的像素點。

i+u, j+v爲待求像素座標,如果 i+u, j+v落在A區,即 u<0.5,v<0.5,則將左上角像素的灰度值賦給待求像素,同理落在B區則賦予右上角的像素灰度值,落在C區則賦予左下角像素的灰度值,落在D區則賦予右下角像素的灰度值。

最近鄰插值法計算量較小,但可能會造成生的圖像灰度上的不連續,在變化地方可能出現明顯鋸齒狀。

3.雙線性插值算法


在數學上,雙線性插值是有兩個變量的插值函數的線形插值擴展,其核心思想是在兩個方向分別進行一次線性插值。

 

 

以上是一維的,接下來看看二維中的雙線性插值

首先在x方向上面線性插值,得到R2、R1

 

然後以R2,R1在y方向上面再次線性插值

 

如果選擇一個座標系統使得 f 的四個已知點座標分別爲 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那麼插值公式就可以化簡爲

用矩陣表示

 

雙線性內插法的計算比最鄰近點法複雜,計算量較大但沒有灰度不連續的缺點,結果基本令人滿意。它具有低通濾波性質,使高頻分量受損,圖像輪廓可能會有一點模糊。

4.雙三次插值算法(bicubic interpolation)

在數值分析這個數學分支中,雙三次插值(英語:Bicubic interpolation)是二維空間中最常用的插值方法。在這種方法中,函數 f 在點 (x, y) 的值可以通過矩形網格中最近的十六個採樣點的加權平均得到,在這裏需要使用兩個多項式插值三次函數,每個方向使用一個

雙三次插值計算公式

 

那麼這個a(i, j)便是介紹裏面所說的加權係數了,所以關鍵是要把它求解出來。

求解加權係數的公式如下

相關論文

在這裏插入圖片描述


有適當的邊界條件(boundary condition)和約束插值內核(constrains on the interpolation kernel)的時候,立方卷積是更好方式,並給出了這個式子:

在這裏插入圖片描述

當a=-0.5時比較合適

在這裏插入圖片描述

在這裏插入圖片描述


keys說rifman和bernstein給了他用這個模型的勇氣,

在這裏插入圖片描述

bernstein說是riffman提出用sinx/x近似,啊哈就算這是源頭吧。。但是還差個pi

在這裏插入圖片描述

 

在這裏插入圖片描述

keys又說hou那他得到了啓發,嗯,搜了一下果然。。難道說這個歐米茄就是pi?

在這裏插入圖片描述

在這裏插入圖片描述

額,它不是。那大概認爲大家都覺得乘上pi比較合適吧。
效果是這樣的。

雙三次曲線插值方法計算量較大,但後的圖像效果最好。

5.代碼實現

opencv

import cv2 as cv

img = cv.imread('automobile.png')

# 放大圖像,雙三次插值
enlarge = cv.resize(img, (0, 0), fx=4, fy=4, interpolation=cv.INTER_CUBIC)
  
cv.imshow("Image", enlarge)

cv.waitKey (0)  

cv.destroyAllWindows() 

matlab 

import cv2
from matplotlib import pyplot as plt

img = cv2.imread('yosemeti.jpg',0)
plt.imshow(img,cmap='gray', interpolation='bicubic')
plt.show()

6.區別

opencv和matlab的bicubic算法有什麼區別?

 

來自Matlab的文檔:

'bicubic':雙立方插值(默認值);輸出像素值是最近的4乘4鄰域中像素的加權平均值。

來自OpenCV的文檔:

INTER_CUBIC - 4x4像素鄰域的雙三次插值。

 

所以對此的唯一解釋是他們使用不同的加權策略來獲得平均值。

來自Matlab imresize.m source,您可以找到內核常量A (請參閱維基百科上的雙立方插值)設置爲 -0.5 ,而在OpenCV中設置爲 -0.75 (請參閱imgproc/src/imgwarp.cpp,函數interpolateCubic()在github上)。這爲卷積提供了不同的內核形狀,因此最終插值圖像的結果會略有不同。

參考

https://blog.csdn.net/nandina179/article/details/85330552

https://www.jianshu.com/p/8118e708b766

opencv和matlab的bicubic算法有什麼區別?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章