映像縮放的雙線性插補值演算法的原理解析

來源:互聯網
上載者:User

映像的縮放很好理解,就是映像的放大和縮小。傳統的繪畫工具中,有一種叫做“放大尺”的繪畫工具,畫家常用它來放大圖畫。當然,在電腦上,我們不再需要用放大尺去放大或縮小映像了,把這個工作交給程式來完成就可以了。下面就來講講電腦怎麼來放大縮小圖象;在本文中,我們所說的映像都是指點陣圖,也就是用一個像素矩陣來描述映像的方法,對於另一種映像:用函數來描述映像的向量圖,不在本文討論之列。
越是簡單的模型越適合用來舉例子,我們就舉個簡單的映像:3X3 的256級灰階圖,也就是高為3個象素,寬也是3個象素的映像,每個象素的取值可以是 0-255,代表該像素的亮度,255代表最亮,也就是白色,0代表最暗,即黑色 。假像的象素矩陣如所示(這個原始圖把它叫做源圖,Source):
234   38    22
67     44    12
89     65    63

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

  ---------------------->X
  |
  |
  |
  |
  |
∨Y

如果想把這副圖放大為 4X4大小的映像,那麼該怎麼做呢?那麼第一步肯定想到的是先把4X4的矩陣先畫出來再說,好了矩陣畫出來了,如下所示,當然,矩陣的每個像素都是未知數,等待著我們去填充(這個將要被填充的圖的叫做靶心圖表,Destination):
?        ?        ?       ?
?        ?        ?       ?
?        ?        ?       ?
?        ?        ?       ?
              
        然後要往這個空的矩陣裡面填值了,要填的值從哪裡來來呢?是從源圖中來,好,先填寫靶心圖表最左上方的象素,座標為(0,0),那麼該座標組應源圖中的座標可以由如下公式得出:                                     
srcX=dstX* (srcWidth/dstWidth) , srcY = dstY * (srcHeight/dstHeight)
好了,套用公式,就可以找到對應的原圖的座標了(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),完整的運算過程就是這樣的:
(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 ,那麼目標象素值其實應該根據這個源圖中虛擬點四周的四個真實的點來按照一定的規律計算出來的,這樣才能達到更好的縮放效果。雙線型插入值演算法就是一種比較好的映像縮放演算法,它充分的利用了源圖中虛擬點四周的四個真實存在的像素值來共同決定靶心圖表中的一個像素值,因此縮放效果比簡單的最鄰近插值要好很多。

雙線性插補值演算法描述如下:
  對於一個目的像素,設定座標通過反向變換得到的浮點座標為(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)                          公式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也體現出了這一特點;

最鄰近插值和雙向性插入值縮放圖片的效果對比:

      原始圖片

       最鄰近插值放大圖片

    雙線型插入值放大圖片

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/qiqi5521/archive/2008/03/22/2207562.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.