欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python實(shí)現(xiàn)二維圖像雙線性插值

 更新時(shí)間:2022年06月11日 14:36:11   作者:為為為什么  
雙線性插值,又稱為雙線性內(nèi)插。在數(shù)學(xué)上,雙線性插值是有兩個(gè)變量的插值函數(shù)的線性插值擴(kuò)展,其核心思想是在兩個(gè)方向分別進(jìn)行一次線性插值。本文將用Python實(shí)現(xiàn)二維圖像雙線性插值,感興趣的可以了解下

在對(duì)二維數(shù)據(jù)進(jìn)行 resize / mapping / 坐標(biāo)轉(zhuǎn)換等操作時(shí),經(jīng)常會(huì)將原本的整數(shù)坐標(biāo)變換為小數(shù)坐標(biāo),對(duì)于非整數(shù)的坐標(biāo)值一種直觀有效的插值方式為雙線性插值。

插值簡介

雙線性插值,又稱為雙線性內(nèi)插。在數(shù)學(xué)上,雙線性插值是有兩個(gè)變量的插值函數(shù)的線性插值擴(kuò)展,其核心思想是在兩個(gè)方向分別進(jìn)行一次線性插值。

雙線性插值作為數(shù)值分析中的一種插值算法,廣泛應(yīng)用在信號(hào)處理,數(shù)字圖像和視頻處理等方面。

假設(shè)我們出現(xiàn)了需要在四個(gè)相鄰正方形整數(shù)點(diǎn)(A,B,C,D)坐標(biāo)中間(正方形范圍內(nèi))選擇一個(gè)點(diǎn)(a,b)取近似值的情形。

此時(shí)我們已知的是四個(gè)點(diǎn)的數(shù)值VA?,VB?,VC?,VD?,給定小數(shù)坐標(biāo)E(a,b),0≤a,b≤1,如何插值求解E點(diǎn)的數(shù)值呢,解決類似問題的方法統(tǒng)稱為插值,上圖展示公式為雙線性插值的計(jì)算方法。

最近鄰法 (Nearest Interpolation)

一種最簡便的方法為最近鄰法,直接取與當(dāng)前點(diǎn)距離最近的點(diǎn)的值作為插值結(jié)果:

其中 roundroundround 為四舍五入的取整操作,方法簡便速度極快,但往往不夠精細(xì)

雙三次插值 (Bicubic interpolation)

雙三次插值是用原圖像中16(4*4)個(gè)點(diǎn)計(jì)算新圖像中1個(gè)點(diǎn),效果比較好,但是計(jì)算代價(jià)過大。

雙線性插值 (Bilinear Interpolation)

使用一個(gè)點(diǎn)進(jìn)行插值過于粗暴,16個(gè)點(diǎn)又過于繁瑣,那就使用EEE?點(diǎn)周圍4個(gè)點(diǎn)的數(shù)值來近似求解,這是一種平衡了計(jì)算代價(jià)和插值效果的折中方案,也是各大變換庫的默認(rèn)插值操作。

雙線性插值

通過觀察上述動(dòng)圖(可以動(dòng)手挪一挪)可以清晰地看到,雙線性插值本質(zhì)就是把四個(gè)角落的數(shù)值按照正方形面積的比例線性加權(quán)后的結(jié)果。

好吧一句話已經(jīng)把數(shù)學(xué)的核心部分講完了

那么既然理解了本質(zhì),數(shù)學(xué)公式就好寫了:

python實(shí)現(xiàn)

在實(shí)現(xiàn)時(shí)當(dāng)然 for 循環(huán)大法可以解決一切問題,但總歸是不太優(yōu)雅,我們嘗試使用 numpy 操作完成雙線性插值

假設(shè)原始圖像 image,變換后的小數(shù)坐標(biāo) X 矩陣 x_grid,Y 矩陣 y_grid,那么可以使用如下的 bilinear_by_meshgrid 函數(shù)快速雙線性插值,已經(jīng)處理好了邊界,可以放心使用。

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

該函數(shù)集成在我自己的python庫 mtutils 中,可以通過:

pip install mtutils

直接安裝,之后可以直接引用:

from mtutils import bilinear_by_meshgrid

以上就是基于Python實(shí)現(xiàn)二維圖像雙線性插值的詳細(xì)內(nèi)容,更多關(guān)于Python雙線性插值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PyQt5基本控件使用詳解:單選按鈕、復(fù)選框、下拉框

    PyQt5基本控件使用詳解:單選按鈕、復(fù)選框、下拉框

    這篇文章主要介紹了PyQt5基本控件使用:單選按鈕、復(fù)選框、下拉框,本文中的內(nèi)容和實(shí)例也基本回答了開篇提到的問題。需要的朋友可以參考下
    2019-08-08
  • numpy.concatenate函數(shù)用法詳解

    numpy.concatenate函數(shù)用法詳解

    本文主要介紹了numpy.concatenate函數(shù)用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 淺析python的優(yōu)勢(shì)和不足之處

    淺析python的優(yōu)勢(shì)和不足之處

    在本篇內(nèi)容中小編給大家整理了關(guān)于分析python的優(yōu)勢(shì)和不足的分析,有需要的朋友們參考下。
    2018-11-11
  • 在Python中使用AOP實(shí)現(xiàn)Redis緩存示例

    在Python中使用AOP實(shí)現(xiàn)Redis緩存示例

    本篇文章主要介紹了在Python中使用AOP實(shí)現(xiàn)Redis緩存示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • 詳解Python中__new__方法的作用

    詳解Python中__new__方法的作用

    Python類中有些方法名、屬性名的前后都添加__雙下畫線,這種方法、屬性通常屬于Python的特殊方法和特殊屬性。本文將聊聊構(gòu)造方法__new__實(shí)際程序的應(yīng)用場(chǎng)景,感興趣的可以了解一下
    2022-03-03
  • Python采用raw_input讀取輸入值的方法

    Python采用raw_input讀取輸入值的方法

    這篇文章主要介紹了Python采用raw_input讀取輸入值的方法,對(duì)初學(xué)者有很好的學(xué)習(xí)借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • Python還能這么玩之用Python做個(gè)小游戲的外掛

    Python還能這么玩之用Python做個(gè)小游戲的外掛

    玩過電腦游戲的同學(xué)對(duì)于外掛肯定不陌生,但是你在用外掛的時(shí)候有沒有想過外掛怎么制作出來的呢?現(xiàn)在來看一下怎么制作一個(gè)外掛,首先說下,這里的游戲外掛的概念,和那些大型網(wǎng)游里的外掛可不同,不能自動(dòng)打怪,主要為了提高一下編程技術(shù),需要的朋友可以參考下
    2021-06-06
  • python里將list中元素依次向前移動(dòng)一位

    python里將list中元素依次向前移動(dòng)一位

    這篇文章主要介紹了python里將list中元素依次向前移動(dòng)一位,以及使用racket 5.2.1實(shí)現(xiàn)此功能的代碼,希望對(duì)大家有所幫助
    2014-09-09
  • Python函數(shù)參數(shù)的4種方式

    Python函數(shù)參數(shù)的4種方式

    本文主要介紹了Python函數(shù)參數(shù)的4種方式,主要包括必選參數(shù),默認(rèn)參數(shù),可選參數(shù),關(guān)鍵字參數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 用Python解析身份證號(hào)獲取年齡和性別的實(shí)現(xiàn)方法

    用Python解析身份證號(hào)獲取年齡和性別的實(shí)現(xiàn)方法

    身份證號(hào)碼包含了豐富的信息,包括生日和性別,Python提供了處理和解析身份證號(hào)的功能,讓我們能夠從中提取出相關(guān)的信息,本文將介紹如何利用Python解析身份證號(hào),獲取持有者的年齡和性別信息,感興趣的朋友可以參考下
    2023-12-12

最新評(píng)論