日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习之双线性插值(Bilinear interpolation)

發布時間:2023/12/20 pytorch 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习之双线性插值(Bilinear interpolation) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 什么是插值

Interpolation is a method of constructing new data points within the range of a discrete set of known data points. Image interpolation refers to the“guess”of intensity values at missing locations.

圖片放大是圖像處理中的一個特別基礎的操作。在幾乎每一個圖片相關的項目中,從傳統圖像處理到深度學習,都有應用。生活里,和朋友通過微信傳張圖片,從圖片發出,到朋友收到圖片,查看圖片,都會數次的的改變圖像的尺寸,從而用到這個算法。但是很少關注這個算法的實現細節:插值算法是如何工作的。
簡單來說,插值指利用已知的點來“猜”未知的點,圖像領域插值常用在修改圖像尺寸的過程,由舊的圖像矩陣中的點計算新圖像矩陣中的點并插入,不同的計算過程就是不同的插值算法。

2.常用的插值算法

插值算法有很多種,常見的插值運算包括:

  • 最近鄰法(Nearest Interpolation):計算速度最快,但是效果最差。
  • 雙線性插值(Bilinear Interpolation):雙線性插值是用原圖像中4(2*2)個點計算新圖像中1個點,效果略遜于雙三次插值,速度比雙三次插值快,屬于一種平衡美,在很多框架中屬于默認算法。由于折中的插值效果和運算速度,運用比較廣泛。
  • 雙三次插值(Bicubic interpolation):雙三次插值是用原圖像中16(4*4)個點計算新圖像中1個點,效果比較好,但是計算代價過大。

3.最近鄰法(Nearest Interpolation)

越是簡單的模型越適合用來舉例子,我們就舉個簡單的圖像:3?33*33?3 的256級灰度圖。假如圖像的象素矩陣如下圖所示(這個原始圖把它叫做源圖,Source):

234 38 22 67 44 12 89 65 63

這個矩陣中,元素坐標(x,y)是這樣確定的,x從左到右,從0開始,y從上到下,也是從零開始,這是圖象處理中最常用的坐標系。

如果想把這副圖放大為 4?44*44?4 大小的圖像,那么該怎么做呢?那么第一步肯定想到的是先把 4?44*44?4 的矩陣先畫出來再說,好了矩陣畫出來了,如下所示,當然,矩陣的每個像素都是未知數,等待著我們去填充(這個將要被填充的圖的叫做目標圖,Destination):

  ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

然后要往這個空的矩陣里面填值了,要填的值從哪里來來呢?是從源圖中來,好,先填寫目標圖最左上角的象素,坐標為(0,0),那么該坐標對應源圖中的坐標可以由如下公式得出

srcX=dstX?(srcWidth/dstWidth),srcY=dstY?(srcHeight/dstHeight)srcX=dstX* (srcWidth/dstWidth) ,srcY = dstY * (srcHeight/dstHeight)srcX=dstX?(srcWidth/dstWidth),srcY=dstY?(srcHeight/dstHeight)

好了,套用公式,就可以找到對應的原圖的坐標了 (0?(3/4),0?(3/4))=>(0?0.75,0?0.75)=>(0,0)(0*(3/4),0*(3/4))=>(0*0.75,0*0.75)=>(0,0)(0?(3/4),0?(3/4))=>(0?0.75,0?0.75)=>(0,0),找到了源圖的對應坐標,就可以把源圖中坐標為(0,0)處的234象素值填進去目標圖的(0,0)這個位置了。

接下來,如法炮制,尋找目標圖中坐標為(1,0)的象素對應源圖中的坐標,套用公式:
(1?0.75,0?0.75)=>(0.75,0)(1*0.75,0*0.75)=>(0.75,0)(1?0.75,0?0.75)=>(0.75,0) 結果發現,得到的坐標里面竟然有小數,這可怎么辦?計算機里的圖像可是數字圖像,象素就是最小單位了,象素的坐標都是整數,從來沒有小數坐標。這時候采用的一種策略就是采用四舍五入的方法(也可以采用直接舍掉小數位的方法),把非整數坐標轉換成整數,好,那么按照四舍五入的方法就得到坐標(1,0),完整的運算過程就是這樣的:(1?0.75,0?0.75)=>(0.75,0)=>(1,0)(1*0.75,0*0.75)=>(0.75,0)=>(1,0)(1?0.75,0?0.75)=>(0.75,0)=>(1,0) 那么就可以再填一個象素到目標矩陣中了,同樣是把源圖中坐標為(1,0)處的像素值38填入目標圖中的坐標。

依次填完每個象素,一幅放大后的圖像就誕生了,像素矩陣如下所示:

  234 38 22 22 67 44 12 12 89 65 63 63 89 65 63 63

這種放大圖像的方法叫做最臨近插值算法,這是一種最基本、最簡單的圖像縮放算法,效果也是最不好的,放大后的圖像有很嚴重的馬賽克,縮小后的圖像有很嚴重的失真;效果不好的根源就是其簡單的最臨近插值方法引入了嚴重的圖像失真,比如,當由目標圖的坐標反推得到的源圖的的坐標是一個浮點數的時候,采用了四舍五入的方法,直接采用了和這個浮點數最接近的象素的值,這種方法是很不科學的,當推得坐標值為 0.75的時候,不應該就簡單的取為1,既然是0.75,比1要小0.25 ,比0要大0.75 ,那么目標象素值其實應該根據這個源圖中虛擬的點四周的四個真實的點來按照一定的規律計算出來的,這樣才能達到更好的縮放效果。

4 雙線性插值

雙線型內插值算法就是一種比較好的圖像縮放算法,它充分的利用了源圖中虛擬點四周的四個真實存在的像素值來共同決定目標圖中的一個像素值,因此縮放效果比簡單的最鄰近插值要好很多。 雙線性內插值算法描述如下:

對于一個目的像素,設置坐標通過反向變換得到的浮點坐標為(i+u,j+v) (其中i、j均為浮點坐標的整數部分,u、v為浮點坐標的小數部分,是取值[0,1)區間的浮點數),則這個像素得值 f(i+u,j+v) 可由原圖像中坐標為 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所對應的周圍四個像素的值決定,即:f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)
其中f(i,j)表示源圖像(i,j)處的的像素值,以此類推。

比如,象剛才的例子,現在假如目標圖的象素坐標為(1,1),那么反推得到的對應于源圖的坐標是(0.75,0.75), 這其實只是一個概念上的虛擬象素,實際在源圖中并不存在這樣一個象素,那么目標圖的象素(1,1)的取值不能夠由這個虛擬象素來決定,而只能由源圖的這四個象素共同決定:(0,0)(0,1)(1,0)(1,1),而由于(0.75,0.75)離(1,1)要更近一些,那么(1,1)所起的決定作用更大一些,這從公式1中的系數uv=0.75×0.75就可以體現出來,而(0.75,0.75)離(0,0)最遠,所以(0,0)所起的決定作用就要小一些,公式中系數為(1-u)(1-v)=0.25×0.25也體現出了這一特點。

計算方法

首先,在X方向上進行兩次線性插值計算,然后在Y方向上進行一次插值計算。
  

在圖像處理的時候,我們先根據
  
srcX=dstX?(srcWidth/dstWidth),srcX=dstX* (srcWidth/dstWidth) ,srcX=dstX?(srcWidth/dstWidth),
srcY=dstY?(srcHeight/dstHeight)srcY = dstY * (srcHeight/dstHeight) srcY=dstY?(srcHeight/dstHeight)

來計算目標像素在源圖像中的位置,這里計算的srcX和srcY一般都是浮點數,比如f(1.2, 3.4)這個像素點是虛擬存在的,先找到與它臨近的四個實際存在的像素點 (1,3) (2,3) (1,4) (2,4) 寫成f(i+u,j+v)的形式,則u=0.2,v=0.4, i=1, j=3 在沿著X方向差插值時,f(R1)=u(f(Q21)-f(Q11))+f(Q11) 沿著Y方向同理計算。 或者,直接整理一步計算,f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) 。

5. 加速以及優化策略

單純按照上文實現的插值算法只能勉強完成插值的功能,速度和效果都不會理想,在具體代碼實現的時候有些小技巧。參考OpenCV源碼以及網上博客整理如下兩點:

  • 源圖像和目標圖像幾何中心的對齊。
  • 將浮點運算轉換成整數運算

5.1 源圖像和目標圖像幾何中心的對齊

方法:在計算源圖像的虛擬浮點坐標的時候,一般情況:

srcX=dstX?(srcWidth/dstWidth),srcY=dstY?(srcHeight/dstHeight)srcX=dstX* (srcWidth/dstWidth) ,srcY = dstY * (srcHeight/dstHeight) srcX=dstX?(srcWidth/dstWidth),srcY=dstY?(srcHeight/dstHeight)

中心對齊(OpenCV也是如此):

SrcX=(dstX+0.5)?(srcWidth/dstWidth)?0.5,SrcY=(dstY+0.5)?(srcHeight/dstHeight)?0.5SrcX=(dstX+0.5)* (srcWidth/dstWidth) -0.5,SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5SrcX=(dstX+0.5)?(srcWidth/dstWidth)?0.5,SrcY=(dstY+0.5)?(srcHeight/dstHeight)?0.5

問題

下面這張圖是以右上角為坐標系原點,我們可以發現最右面的點都會有概率直接復制到目標圖像中(至少原點肯定是這樣),而且就算不不和原圖像中的點重合,也相當于進行了1次單線性插值。這樣如果我們采用不用的坐標系產生的結果是不一樣的,而且無論我們采用什么坐標系,最左側和最右側(最上側和最下側)的點是不“公平的”,這是第一個問題。

整體的圖像相對位置會發生變化看下面這張圖,左側是原圖像(33),右側是目標圖像(55),原圖像的幾何中心點是(1, 1),目標圖像的幾何中心點是(2, 2),根據對應關系,目標圖像的幾何中心點對應的原圖像的位置是(1.2, 1.2),如圖所示,那么問題來了,目標圖像的原點(0, 0)點和原始圖像的原點是重合的,但是目標圖像的幾何中心點相對于原始圖像的幾何中心點偏右下,那么整體圖像的位置會發生偏移,為什么這樣說,其實圖像是由1個個的像素點組成,單純說1個像素點是沒有太大的意義的,1個像素點跟相鄰像素點的值的漸變或者突變形成圖像顏色的漸變或者邊界,所以參與計算的點相對都往右下偏移會產生相對的位置信息損失。這是第二個問題。


解決
  
將公式變形,srcX=dstX?(srcWidth/dstWidth)+0.5?(srcWidth/dstWidth?1)srcX=dstX* (srcWidth/dstWidth)+0.5*(srcWidth/dstWidth-1)srcX=dstX?(srcWidth/dstWidth)+0.5?(srcWidth/dstWidth?1) 相當于我們在原始的浮點坐標上加上了 0.5?(srcWidth/dstWidth?1)0.5*(srcWidth/dstWidth-1)0.5?(srcWidth/dstWidth?1) 這樣一個控制因子,這項的符號可正可負,與 srcWidth/dstWidthsrcWidth/dstWidthsrcWidth/dstWidth 的比值也就是當前插值是擴大還是縮小圖像有關,有什么作用呢?看一個例子:假設源圖像是 3?33*33?3,中心點坐標(1,1)目標圖像是 9?99*99?9,中心點坐標(4,4),我們在進行插值映射的時候,盡可能希望均勻的用到源圖像的像素信息,最直觀的就是(4,4)映射到(1,1)現在直接計算 srcX=4?3/9=1.3333!=1srcX=4*3/9=1.3333!=1srcX=4?3/9=1.3333=1,也就是我們在插值的時候所利用的像素集中在圖像的右下方,而不是均勻分布整個圖像。現在考慮中心點對齊,srcX=(4+0.5)*3/9-0.5=1,剛好滿足我們的要求。

5.2 將浮點運算轉換成整數運算

參考圖像處理界雙線性插值算法的優化

直接進行計算的話,由于計算的srcX和srcY 都是浮點數,后續會進行大量的乘法,而圖像數據量又大,速度不會理想,解決思路是:浮點運算→→整數運算→→”<<左右移按位運算”

放大的主要對象是u,v這些浮點數,OpenCV選擇的放大倍數是2048“如何取這個合適的放大倍數呢,要從三個方面考慮,第一:精度問題,如果這個數取得過小,那么經過計算后可能會導致結果出現較大的誤差。第二,這個數不能太大,太大會導致計算過程超過長整形所能表達的范圍。第三:速度考慮。假如放大倍數取為12,那么算式在最后的結果中應該需要除以12*12=144,但是如果取為16,則最后的除數為16*16=256,這個數字好,我們可以用右移來實現,而右移要比普通的整除快多了。”我們利用左移11位操作就可以達到放大目的。

6. 代碼

uchar* dataDst = matDst1.data;int stepDst = matDst1.step;uchar* dataSrc = matSrc.data;int stepSrc = matSrc.step;int iWidthSrc = matSrc.cols;int iHiehgtSrc = matSrc.rows;for (int j = 0; j < matDst1.rows; ++j){float fy = (float)((j + 0.5) * scale_y - 0.5);int sy = cvFloor(fy);fy -= sy;sy = std::min(sy, iHiehgtSrc - 2);sy = std::max(0, sy);short cbufy[2];cbufy[0] = cv::saturate_cast<short>((1.f - fy) * 2048);cbufy[1] = 2048 - cbufy[0];for (int i = 0; i < matDst1.cols; ++i){float fx = (float)((i + 0.5) * scale_x - 0.5);int sx = cvFloor(fx);fx -= sx;if (sx < 0) {fx = 0, sx = 0;}if (sx >= iWidthSrc - 1) {fx = 0, sx = iWidthSrc - 2;}short cbufx[2];cbufx[0] = cv::saturate_cast<short>((1.f - fx) * 2048);cbufx[1] = 2048 - cbufx[0];for (int k = 0; k < matSrc.channels(); ++k){*(dataDst+ j*stepDst + 3*i + k) = (*(dataSrc + sy*stepSrc + 3*sx + k) * cbufx[0] * cbufy[0] + *(dataSrc + (sy+1)*stepSrc + 3*sx + k) * cbufx[0] * cbufy[1] + *(dataSrc + sy*stepSrc + 3*(sx+1) + k) * cbufx[1] * cbufy[0] + *(dataSrc + (sy+1)*stepSrc + 3*(sx+1) + k) * cbufx[1] * cbufy[1]) >> 22;}}}cv::imwrite("linear_1.jpg", matDst1);cv::resize(matSrc, matDst2, matDst1.size(), 0, 0, 1);cv::imwrite("linear_2.jpg", matDst2);

參考:

  • OpenCV ——雙線性插值(Bilinear interpolation)
  • https://blog.csdn.net/qq_37577735/article/details/80041586

總結

以上是生活随笔為你收集整理的深度学习之双线性插值(Bilinear interpolation)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费日韩| 中国久久久久 | 黄色一几片 | 韩国精品在线 | 欧美大胆a视频 | 成人免费三级 | 喷水了…太爽了高h | 国精产品一品二品国精品69xx | 黄色大片av | 欧美成人h版在线观看 | 国产精品无码专区av免费播放 | 五月天国产精品 | av在线小说 | 观看免费av | 制服丝袜中文字幕在线 | 欧美一区二区三区观看 | 日批视频免费播放 | 污污网站免费在线观看 | 欧美性受xxxx黑人xyx | 日韩三级观看 | 天堂久久一区 | 免费国产一区二区三区 | 四川丰满妇女毛片四川话 | 91国模少妇一区二区三区 | 蜜桃成人av | 91黑人精品一区二区三区 | 欧美,日韩,国产精品免费观看 | 久久免费视频2 | 最黄一级片 | 日韩一区二区不卡视频 | 18男女无套免费视频 | 日韩av综合 | 毛片av网址 | 伊人久艹 | 日本一区二区三区免费看 | 日本一区二区在线不卡 | 福利视频在线播放 | 青青青在线免费 | 日本爱爱网址 | √8天堂资源地址中文在线 欧美精品在线一区二区 | 欧美片免费网站 | 国产精品传媒视频 | 日本黄网站 | 亚洲精品少妇久久久久久 | 欧美精品人妻一区二区 | 亚洲欧美日韩一区二区三区在线观看 | 久草色在线 | 性久久久久久久久久久 | 色乱码一区二区三区熟女 | caobi视频 | 亚洲美女综合网 | 啪网址| 一级影片在线观看 | 插插射射 | 久久中文字幕电影 | 国产一级片免费视频 | 久久国产一区二区三区 | 亚洲操一操 | 少妇高潮av | 夜夜天天拍拍 | 亚洲精品国产精品乱码不卡√香蕉 | 亚洲女人毛片 | 欧美一区二区三区不卡视频 | 九九视频这里只有精品 | 日韩亚洲第一页 | 日本视频网 | 久久岛国 | 高清在线一区二区 | 国产在线一区二 | 九九九九九热 | 天堂…中文在线最新版在线 | 天天射网 | 国产调教打屁股xxxx网站 | 波多野结衣视频免费观看 | www.jizz国产 | 青草伊人网 | 精品在线91| 9999视频 | 亚洲精品1区2区3区 国产丝袜网站 | 国产suv精品一区二区69 | 玖草在线观看 | 国产特级黄色录像 | 毛片.com| 伊人久久大香 | 九九视频免费在线观看 | 亚洲hh | 超碰95在线 | 亚洲狼人伊人 | 日本青青草| 性――交――性――乱 | 国产做爰全过程免费视频 | 亚洲一区中文字幕在线观看 | 91污网站 | 欧美在线性爱视频 | 韩国伦理片免费看 | 尤物综合网 | 黄色aaaaa| 欧洲精品免费一区二区三区 | 欧美私人情侣网站 |