0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

三種圖像插值方式對(duì)比

新機(jī)器視覺(jué) ? 來(lái)源:簡(jiǎn)書(shū)-梧桐光影 ? 2023-06-01 17:16 ? 次閱讀

在播放視頻時(shí),常遇到視頻尺寸與畫(huà)布尺寸不一致的情況。為了讓視頻按比例填充畫(huà)布,需要對(duì)視頻中的每一幀圖像做縮放處理。

縮放就是在原圖的基礎(chǔ)上做插值計(jì)算,從而增加或減少像素點(diǎn)的數(shù)量。常見(jiàn)的插值方式有最近點(diǎn)插值,線性插值,蘭索斯插值。

下面簡(jiǎn)要介紹,并對(duì)比三種插值方式的結(jié)果。

最近點(diǎn)插值

在一維空間中,最近點(diǎn)插值就相當(dāng)于四舍五入取整。在二維圖像中,像素點(diǎn)的坐標(biāo)都是整數(shù),該方法就是選取離目標(biāo)點(diǎn)最近的點(diǎn)。計(jì)算方式如下:

假設(shè)原圖為A[aw,ah],寬度為aw,高度為ah。目標(biāo)圖為B[bw,bh],寬度為bw,高度為bh。已知A[aw,ah]的寬度,高度及其中每個(gè)點(diǎn)的顏色值,B[bw,bh]中每個(gè)點(diǎn)像素值的計(jì)算方式如下:

for(int i=0; i

最近點(diǎn)插值

線性插值

線性插值是以距離為權(quán)重的一種插值方式。在一維空間中,假設(shè)有點(diǎn)A,B,其距離為L(zhǎng)AB。A,B之間任意一點(diǎn)C的值為A*LBC/LAB+B*LAC/LAB。在二維空間中,需要在兩個(gè)方向上做插值。如下圖所示:

6483caf8-eca5-11ed-90ce-dac502259ad0.jpg

線性插值

已知Q11,Q21,Q12,Q22,計(jì)算P點(diǎn)的值時(shí),需要先由Q11和Q21插值得到R1,由Q12和Q22插值得到R2,再由R1和R2插值得到P。

該方法生成的圖像比較平滑。

線性插值

蘭索斯插值(lanczos)

一維的線性插值,是在目標(biāo)點(diǎn)的左邊和右邊各取一個(gè)點(diǎn)做插值,這兩個(gè)點(diǎn)的權(quán)重是由線性函數(shù)計(jì)算得到。而一維的蘭索斯插值是在目標(biāo)點(diǎn)的左邊和右邊各取四個(gè)點(diǎn)做插值,這八個(gè)點(diǎn)的權(quán)重是由高階函數(shù)計(jì)算得到。

二維的蘭索斯插值在x,y方向分別對(duì)相鄰的八個(gè)點(diǎn)進(jìn)行插值,也就是計(jì)算加權(quán)和,所以它是一個(gè)8x8的描述子。

網(wǎng)上目前可找到蘭索斯算法有兩份:GPUImage和OpenCV。其中GPUImage中是用GLSL實(shí)現(xiàn),其算法有誤,并不能得到正確的結(jié)果。OpenCV中是用C++實(shí)現(xiàn)的CPU端代碼。


我參考OpenCV中的實(shí)現(xiàn)方式,實(shí)現(xiàn)了一份GPU上的蘭索斯插值算法,該算法在GPU上運(yùn)行,并不額外消耗CPU資源。其對(duì)應(yīng)的GLSL為

uniform int ssize;
uniform int tsize;
uniform int flag;
uniform float scale;
uniform sampler2D inputImageTexture;
void interpolateLanczos4(in float fx, inout float rate[8]) {
    const float s45 = 0.70710678118654752440084436210485;
    const float PI = 3.1415926535897932384626433832795;
    float cs[] = float[16]( ,1.0, 0.0, -s45, -s45, 0.0, 1.0, s45, -s45, -1.0, 0.0, s45, s45, 0.0, -1.0, -s45, s45);
    if( fx < 0.0000000001 ) {
        for( int i = 0; i < 8; i++ ) {
            rate[i] = 0.0;
        }
        rate[3] = 1.0;
        return;
    }
    float sum = 0.0;
    float y0 = -(fx+3.0)*PI*0.25;
    float s0 = sin(y0);
    float c0 = cos(y0);
    for(int i = 0; i < 8; i++ ) {
        float y = -(fx+float(3-i))*PI*0.25;
        int index = i*2;
        rate[i] = (cs[index]*s0 + cs[index+1]*c0) g (y*y);
        sum += rate[i];
    }
    sum = 1.0gsum;
    for(int i = 0; i < 8; i++ ) {
        rate[i] *= sum;
    }
}
void main() {
    vec4 fragmentColor = vec4(0);
    float curPos = float(tsize);
    if( flag == 0 ) {
        curPos = fragTexCoord.x * float(tsize);
    } else {
        curPos = fragTexCoord.y * float(tsize);
    }
    float fx = (curPos + 0.5) * scale - 0.5;
    float sx = floor(fx);
    fx -= sx;
    float rate[8];
    interpolateLanczos4(fx, rate);
    for (int i=0; i<8; ++i) {
        float newCoord = (sx + float(i - 3) ) / float(ssize);
        vec2 texCoord;
        if (flag == 0)
            texCoord = vec2(newCoord, fragTexCoord.y);
        else
            texCoord = vec2(fragTexCoord.x, newCoord);
        fragmentColor += texture2D(inputImageTexture, texCoord) * rate[i];
    }
    gl_FragColor = fragmentColor;
}

上述代碼需要執(zhí)行兩遍:

第一遍的輸入為原圖,縮放寬度方向。ssize為原圖寬度,tsize為目標(biāo)圖寬度。執(zhí)行完畢后,把結(jié)果存到紋理中,作為第二遍的輸入;

第二遍縮放高度方向,ssize為原圖高度,tsize為目標(biāo)圖高度。執(zhí)行完畢后,把結(jié)果顯示到屏幕上。

結(jié)果對(duì)比

將上面的對(duì)比圖放大后可以發(fā)現(xiàn),線性插值的結(jié)果較最近點(diǎn)插值更平滑,蘭索斯插值的結(jié)果較線性插值更清晰。

性能對(duì)比

運(yùn)行環(huán)境:iphone5s,ios8.3

運(yùn)行程序:自研播放器demo

以上三種插值算法渲染每幀圖像時(shí),占用CPU時(shí)間都是40ms左右。由于這三種算法都是在GPU上實(shí)現(xiàn),其對(duì)應(yīng)的CPU代碼相同,結(jié)果與預(yù)期相符。

占用GPU時(shí)間如下所示:

插值方式 最近點(diǎn)插值 線性插值 蘭索斯插值
每幀圖像平均占用的GPU時(shí)間(ms) 6 6 12

蘭索斯插值算法占用GPU的平均時(shí)間為12ms,是其它兩種算法的兩倍,由于該算法中shader代碼執(zhí)行了兩遍,結(jié)果也與預(yù)期相符。

由于GPU與CPU是異步執(zhí)行,大部分視頻幀率不超過(guò)30,因此GPU上多出的6ms不會(huì)造成性能瓶頸。

注:GPUImage中的蘭索斯插值實(shí)現(xiàn)有誤,本文是參考OpenCV實(shí)現(xiàn)的。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 視頻
    +關(guān)注

    關(guān)注

    6

    文章

    1946

    瀏覽量

    72918
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    4740

    瀏覽量

    128953
  • 圖像
    +關(guān)注

    關(guān)注

    2

    文章

    1084

    瀏覽量

    40470
  • 線性插值
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    6676
  • 二維空間
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    1593

原文標(biāo)題:三種圖像插值方式對(duì)比

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    伺服電機(jī)的三種控制方式

    伺服電機(jī)控制方式有脈沖、模擬量和通訊這三種,在不同的應(yīng)用場(chǎng)景下,我們?cè)撊绾芜x擇伺服電機(jī)的控制方式呢?
    發(fā)表于 08-17 11:01 ?7109次閱讀

    步進(jìn)電機(jī)的三種驅(qū)動(dòng)方式

    步進(jìn)電機(jī)的三種驅(qū)動(dòng)方式
    發(fā)表于 01-12 17:03

    三種基本放大電路對(duì)比

    三種基本放大電路對(duì)比1.輸入阻抗、輸出阻抗從幾十歐姆到幾百千歐姆,這個(gè)是由什么造成的?如何根據(jù)輸入、輸出阻抗進(jìn)行應(yīng)用場(chǎng)合的選型?2.電壓放大倍數(shù)、電流放大倍數(shù)都不一樣。共射是既有電壓放大能力也有電流
    發(fā)表于 09-09 16:14

    基于B樣條圖像邊緣檢測(cè)實(shí)現(xiàn)

    為了能高速、高質(zhì)量地進(jìn)行圖像邊緣檢測(cè),提出了一新的基于B 樣條的邊緣檢測(cè)方法。該方法采用了次B 樣條
    發(fā)表于 05-14 15:27 ?40次下載
    基于B樣條<b class='flag-5'>插</b><b class='flag-5'>值</b>的<b class='flag-5'>圖像</b>邊緣檢測(cè)實(shí)現(xiàn)

    圖像處理中的和縮放研究

    本文圍繞圖像處理領(lǐng)域中兩類重要處理手法――圖像圖像縮放技術(shù)展開(kāi)了深入的研究.在分析目前現(xiàn)有的
    發(fā)表于 09-28 14:00 ?38次下載
    <b class='flag-5'>圖像</b>處理中的<b class='flag-5'>插</b><b class='flag-5'>值</b>和縮放研究

    改進(jìn)的線性圖像算法

    針對(duì)傳統(tǒng)的雙線性插值法在對(duì)圖像進(jìn)行后會(huì)不可避免的產(chǎn)生邊緣模糊的問(wèn)題,提出了一改進(jìn)的線性插值
    發(fā)表于 08-20 12:01 ?29次下載

    局部多項(xiàng)式的方法對(duì)圖像進(jìn)行

    本文運(yùn)用局部多項(xiàng)式的方法對(duì)圖像進(jìn)行。文中我們從一幅高分辨率圖像通過(guò)下采樣得到一張低分辨率圖像,然后對(duì)其進(jìn)行
    發(fā)表于 12-20 10:02 ?1次下載

    實(shí)時(shí)圖像算法

    針對(duì)現(xiàn)有彩色圖像算法的實(shí)時(shí)性及可靠性不能兼?zhèn)涞膯?wèn)題,提出了一高效的實(shí)時(shí)彩色圖像縮放算法,算法基于Lanczos核生成可應(yīng)用于整個(gè)目標(biāo)
    發(fā)表于 01-17 11:48 ?0次下載
    實(shí)時(shí)<b class='flag-5'>圖像</b><b class='flag-5'>插</b><b class='flag-5'>值</b>算法

    伺服電機(jī)的三種控制方式該如何應(yīng)用

    一般伺服都有三種控制方式:速度控制方式,轉(zhuǎn)矩控制方式,位置控制方式。大多數(shù)人想知道的就是這三種
    的頭像 發(fā)表于 12-14 23:12 ?5367次閱讀

    如何應(yīng)用伺服電機(jī)的三種控制方式

    一般伺服都有三種控制方式:速度控制方式,轉(zhuǎn)矩控制方式,位置控制方式。大多數(shù)人想知道的就是這三種
    發(fā)表于 01-22 06:30 ?7次下載
    如何應(yīng)用伺服電機(jī)的<b class='flag-5'>三種</b>控制<b class='flag-5'>方式</b>

    視頻圖像方式的結(jié)果

    方式有 最近點(diǎn),線性插值,蘭索斯 。 ? 下面簡(jiǎn)要介紹,并
    的頭像 發(fā)表于 11-09 15:39 ?1880次閱讀

    Redis實(shí)現(xiàn)限流的三種方式分享

    當(dāng)然,限流有許多種實(shí)現(xiàn)的方式,Redis具有很強(qiáng)大的功能,我用Redis實(shí)踐了三種的實(shí)現(xiàn)方式,可以較為簡(jiǎn)單的實(shí)現(xiàn)其方式。
    的頭像 發(fā)表于 02-22 09:52 ?1084次閱讀

    三種近場(chǎng)通信技術(shù)技術(shù)對(duì)比

    Android開(kāi)發(fā)——近場(chǎng)通信技術(shù)特點(diǎn)分析及對(duì)比三種近場(chǎng)通信技術(shù)特點(diǎn) NFC 主要技術(shù)特點(diǎn) Blue Tooth 主要技術(shù)特點(diǎn) WIFI 主要技術(shù)特點(diǎn) 三種技術(shù)對(duì)比
    發(fā)表于 05-19 17:44 ?0次下載
    <b class='flag-5'>三種</b>近場(chǎng)通信技術(shù)技術(shù)<b class='flag-5'>對(duì)比</b>

    什么是電池化成?電池化成的三種方式 三種電池化成對(duì)比

    什么是電池化成?電池化成的三種方式 三種電池化成對(duì)比? 電池化成是指將物體或設(shè)備改造為可以使用電池供電的過(guò)程。在電池化成過(guò)程中,常見(jiàn)的電源例如燃油、電線甚至是替換掉,以便更高效、便捷地
    的頭像 發(fā)表于 11-10 14:49 ?2336次閱讀

    圖像理論研究之雙三次插值

    三次插值又叫雙立方,用于在圖像中“”(Interpolating)或增加“像素”(Pi
    的頭像 發(fā)表于 12-14 14:35 ?1155次閱讀
    <b class='flag-5'>圖像</b><b class='flag-5'>插</b><b class='flag-5'>值</b>理論研究之雙<b class='flag-5'>三次插值</b>