<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在對二維資料進行 resize / mapping / 座標轉換等操作時,經常會將原本的整數座標變換為小數座標,對於非整數的座標值一種直觀有效的插值方式為雙線性插值。
雙線性插值,又稱為雙線性內插。在數學上,雙線性插值是有兩個變數的插值函數的線性插值擴充套件,其核心思想是在兩個方向分別進行一次線性插值。
雙線性插值作為數值分析中的一種插值演演算法,廣泛應用在訊號處理,數位影像和視訊處理等方面。
假設我們出現了需要在四個相鄰正方形整數點(A,B,C,D)座標中間(正方形範圍內)選擇一個點(a,b)取近似值的情形。
此時我們已知的是四個點的數值VA,VB,VC,VD,給定小數座標E(a,b),0≤a,b≤1,如何插值求解E點的數值呢,解決類似問題的方法統稱為插值,上圖展示公式為雙線性插值的計算方法。
一種最簡便的方法為最近鄰法,直接取與當前點距離最近的點的值作為插值結果:
其中 roundroundround 為四捨五入的取整操作,方法簡便速度極快,但往往不夠精細
雙三次插值是用原影象中16(4*4)個點計算新影象中1個點,效果比較好,但是計算代價過大。
使用一個點進行插值過於粗暴,16個點又過於繁瑣,那就使用EEE點周圍4個點的數值來近似求解,這是一種平衡了計算代價和插值效果的折中方案,也是各大變換庫的預設插值操作。
通過觀察上述動圖(可以動手挪一挪)可以清晰地看到,雙線性插值本質就是把四個角落的數值按照正方形面積的比例線性加權後的結果。
好吧一句話已經把數學的核心部分講完了
那麼既然理解了本質,數學公式就好寫了:
在實現時當然 for 迴圈大法可以解決一切問題,但總歸是不太優雅,我們嘗試使用 numpy 操作完成雙線性插值
假設原始影象 image
,變換後的小數座標 X 矩陣 x_grid
,Y 矩陣 y_grid
,那麼可以使用如下的 bilinear_by_meshgrid
函數快速雙線性插值,已經處理好了邊界,可以放心使用。
def bilinear_by_meshgrid(image, x_grid, y_grid): # Ia, Wd Ic, Wb # (floor_x, floor_y) (ceil_x, floor_y) # # (x, y) # # Ib , Wc Id, Wa # (floor_x, ceil_y) (ceil_x, ceil_y) # assert image.shape == x_grid.shape == y_grid.shape assert image.ndim == 2 H, W = image.shape[:2] floor_x_grid = np.floor(x_grid).astype('int32') floor_y_grid = np.floor(y_grid).astype('int32') ceil_x_grid = floor_x_grid + 1 ceil_y_grid = floor_y_grid + 1 if np.max(ceil_x_grid) > W -1 or np.max(ceil_y_grid) > H -1 or np.min(floor_x_grid) < 0 or np.min(floor_y_grid) < 0: print("Warning: index value out of original matrix, a crop operation will be applied.") floor_x_grid = np.clip(floor_x_grid, 0, W-1).astype('int32') ceil_x_grid = np.clip(ceil_x_grid, 0, W-1).astype('int32') floor_y_grid = np.clip(floor_y_grid, 0, H-1).astype('int32') ceil_y_grid = np.clip(ceil_y_grid, 0, H-1).astype('int32') Ia = image[ floor_y_grid, floor_x_grid ] Ib = image[ ceil_y_grid, floor_x_grid ] Ic = image[ floor_y_grid, ceil_x_grid ] Id = image[ ceil_y_grid, ceil_x_grid ] wa = (ceil_x_grid - x_grid) * (ceil_y_grid - y_grid) wb = (ceil_x_grid - x_grid) * (y_grid - floor_y_grid) wc = (x_grid - floor_x_grid) * (ceil_y_grid - y_grid) wd = (x_grid - floor_x_grid) * (y_grid - floor_y_grid) assert np.min(wa) >=0 and np.min(wb) >=0 and np.min(wc) >=0 and np.min(wd) >=0 W = wa + wb + wc + wd assert np.sum(W[:, -1]) + np.sum(W[-1, :]) == 0 wa[:-1, -1] = ceil_y_grid[:-1, -1] - y_grid[:-1, -1] wb[:-1, -1] = y_grid[:-1, -1] - floor_y_grid[:-1, -1] wb[-1, :-1] = ceil_x_grid[-1, :-1] - x_grid[-1, :-1] wd[-1, :-1] = x_grid[-1, :-1] - floor_x_grid[-1, :-1] wd[-1, -1] = 1 W = wa + wb + wc + wd assert np.max(W) == np.min(W) == 1 res_image = wa*Ia + wb*Ib + wc*Ic + wd*Id return res_image
該函數整合在我自己的python庫 mtutils
中,可以通過:
pip install mtutils
直接安裝,之後可以直接參照:
from mtutils import bilinear_by_meshgrid
以上就是基於Python實現二維影象雙線性插值的詳細內容,更多關於Python雙線性插值的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45