圖像的
縮放很好理解,就是圖像的放大和縮小,。傳統(tǒng)的繪畫工具中,有一種叫做“放大尺”的繪畫工具,,畫家常用它來放大圖畫。當(dāng)然,,在計(jì)算機(jī)上,,我們不再需要用放大
尺去放大或縮小圖像了,把這個工作交給程序來完成就可以了,。下面就來講講計(jì)算機(jī)怎么來放大縮小圖象,;在本文中,我們所說的圖像都是指點(diǎn)陣圖,,也就是用一個
像素矩陣來描述圖像的方法,,對于另一種圖像:用函數(shù)來描述圖像的矢量圖,不在本文討論之列,。 越是簡單的模型越適合用來舉例子,,我們就舉個簡單的圖
像:3X3 的256級灰度圖,也就是高為3個象素,,寬也是3個象素的圖像,,每個象素的取值可以是
0-255,代表該像素的亮度,,255代表最亮,,也就是白色,,0代表最暗,即黑色
,。假如圖像的象素矩陣如下圖所示(這個原始圖把它叫做源圖,,Source): 234 38 22 67 44 12 89 65 63
這個矩陣中,元素坐標(biāo)(x,y)是這樣確定的,,x從左到右,,從0開始,y從上到下,,也是從零開始,,這是圖象處理中最常用的坐標(biāo)系,就是這樣一個坐標(biāo):
---------------------->X | | | | | ∨Y
如果想把這副圖放大為 4X4大小的圖像,,那么該怎么做呢,?那么第一步肯定想到的是先把4X4的矩陣先畫出來再說,好了矩陣畫出來了,,如下所示,,當(dāng)然,矩陣的每個像素都是未知數(shù),,等待著我們?nèi)ヌ畛洌ㄟ@個將要被填充的圖的叫做目標(biāo)圖,Destination): 然后要往這個空的矩陣?yán)锩嫣钪盗?,要填的值從哪里來來呢?是從源圖中來,,好,,先填寫目標(biāo)圖最左上角的象素,坐標(biāo)為(0,,0),,那么該坐標(biāo)對應(yīng)源圖中的坐標(biāo)可以由如下公式得出: srcX=dstX* (srcWidth/dstWidth) , srcY = dstY * (srcHeight/dstHeight) 好了,套用公式,,就可以找到對應(yīng)的原圖的坐標(biāo)了(0*(3/4),0*(3/4))=>(0*0.75,0*0.75)=>(0,0) ,找到了源圖的對應(yīng)坐標(biāo),就可以把源圖中坐標(biāo)為(0,0)處的234象素值填進(jìn)去目標(biāo)圖的(0,0)這個位置了,。
接下來,如法炮制,尋找目標(biāo)圖中坐標(biāo)為(1,0)的象素對應(yīng)源圖中的坐標(biāo),套用公式: (1*0.75,0*0.75)=>(0.75,0) 結(jié)果發(fā)現(xiàn),得到的坐標(biāo)里面竟然有小數(shù),這可怎么辦?計(jì)算機(jī)里的圖像可是數(shù)字圖像,象素就是最小單位了,象素的坐標(biāo)都是整數(shù),從來沒有小數(shù)坐標(biāo)。這時候采用的一種策略就是采用四舍五入的方法(也可以采用直接舍掉小數(shù)位的方法),,把非整數(shù)坐標(biāo)轉(zhuǎn)換成整數(shù),,好,那么按照四舍五入的方法就得到坐標(biāo)(1,,0),,完整的運(yùn)算過程就是這樣的: (1*0.75,0*0.75)=>(0.75,0)=>(1,0) 那么就可以再填一個象素到目標(biāo)矩陣中了,同樣是把源圖中坐標(biāo)為(1,0)處的像素值38填入目標(biāo)圖中的坐標(biāo),。 依次填完每個象素,,一幅放大后的圖像就誕生了,像素矩陣如下所示: 234 38 22 22 67 44 12 12 89 65 63 63 89 65 63 63
這種放大圖像的方法叫做最臨近插值算法,
這是一種最基本,、最簡單的圖像縮放算法,,效果也是最不好的,放大后的圖像有很嚴(yán)重的馬賽克,,縮小后的圖像有很嚴(yán)重的失真,;效果不好的根源就是其簡單的最臨
近插值方法引入了嚴(yán)重的圖像失真,比如,,當(dāng)由目標(biāo)圖的坐標(biāo)反推得到的源圖的的坐標(biāo)是一個浮點(diǎn)數(shù)的時候,,采用了四舍五入的方法,直接采用了和這個浮點(diǎn)數(shù)最接
近的象素的值,,這種方法是很不科學(xué)的,,當(dāng)推得坐標(biāo)值為 0.75的時候,不應(yīng)該就簡單的取為1,,既然是0.75,,比1要小0.25 ,比0要大0.75
,那么目標(biāo)象素值其實(shí)應(yīng)該根據(jù)這個源圖中虛擬的點(diǎn)四周的四個真實(shí)的點(diǎn)來按照一定的規(guī)律計(jì)算出來的,,這樣才能達(dá)到更好的縮放效果。雙線型內(nèi)插值算法就是一種
比較好的圖像縮放算法,,它充分的利用了源圖中虛擬點(diǎn)四周的四個真實(shí)存在的像素值來共同決定目標(biāo)圖中的一個像素值,,因此縮放效果比簡單的最鄰近插值要好很
多。
雙線性內(nèi)插值算法描述如下: 對于一個目的像素,,設(shè)置坐
標(biāo)通過反向變換得到的浮點(diǎn)坐標(biāo)為(i+u,j+v)
(其中i,、j均為浮點(diǎn)坐標(biāo)的整數(shù)部分,u,、v為浮點(diǎn)坐標(biāo)的小數(shù)部分,,是取值[0,1)區(qū)間的浮點(diǎn)數(shù)),則這個像素得值 f(i+u,j+v)
可由原圖像中坐標(biāo)為 (i,j),、(i+1,j),、(i,j+1)、(i+1,j+1)所對應(yīng)的周圍四個像素的值決定,,即:
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)處的的像素值,,以此類推。
比
如,,象剛才的例子,,現(xiàn)在假如目標(biāo)圖的象素坐標(biāo)為(1,1),,那么反推得到的對應(yīng)于源圖的坐標(biāo)是(0.75 , 0.75),
這其實(shí)只是一個概念上的虛擬象素,實(shí)際在源圖中并不存在這樣一個象素,那么目標(biāo)圖的象素(1,,1)的取值不能夠由這個虛擬象素來決定,而只能由源圖的這四
個象素共同決定:(0,0)(0,,1)(1,,0)(1,1),,而由于(0.75,0.75)離(1,,1)要更近一些,那么(1,1)所起的決定作用更大一
些,,這從公式1中的系數(shù)uv=0.75×0.75就可以體現(xiàn)出來,,而(0.75,0.75)離(0,0)最遠(yuǎn),,所以(0,,0)所起的決定作用就要小一些,
公式中系數(shù)為(1-u)(1-v)=0.25×0.25也體現(xiàn)出了這一特點(diǎn),;
最鄰近插值和雙向性內(nèi)插值縮放圖片的效果對比:
原始圖片
最鄰近插值放大圖片
雙線型內(nèi)插值放大圖片
插值算法對于縮放比例較小的情況是完全可以接受的,,令人信服的。一般的,,縮小0.5倍以上或放大3.0倍以下,,對任何圖像都是可以接受的。
最鄰近插值(近鄰取樣法): 最
臨近插值的的思想很簡單,。對于通過反向變換得到的的一個浮點(diǎn)坐標(biāo),,對其進(jìn)行簡單的取整,得到一個整數(shù)型坐標(biāo),,這個整數(shù)型坐標(biāo)對應(yīng)的像素值就是目的像素的像
素值,,也就是說,取浮點(diǎn)坐標(biāo)最鄰近的左上角點(diǎn)(對于DIB是右上角,,因?yàn)樗膾呙栊惺悄嫘虼鎯Φ模?yīng)的像素值,。可見,,最鄰近插值簡單且直觀,,但得到的圖
像質(zhì)量不高
雙線性內(nèi)插值: 對于一個目的像素,設(shè)置坐標(biāo)通過反向變換得到的浮點(diǎn)坐標(biāo)為(i+u,j+v),,其中i,、j均為非
負(fù)整數(shù),u,、v為[0,1)區(qū)間的浮點(diǎn)數(shù),,則這個像素得值 f(i+u,j+v) 可由原圖像中坐標(biāo)為
(i,j)、(i+1,j),、(i,j+1),、(i+1,j+1)所對應(yīng)的周圍四個像素的值決定,即:
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)處的的像素值,以此類推 這就是雙線性內(nèi)插值法,。雙線性內(nèi)插值法計(jì)算量大,,但縮放后圖像質(zhì)量高,不會出現(xiàn)像素值不連續(xù)的的情況,。由于雙線性插值具有低通濾波器的性質(zhì),,使高頻分量受損,所以可能會使圖像輪廓在一定程度上變得模糊
三次卷積法能夠克服以上兩種算法的不足,,計(jì)算精度高,,但計(jì)算亮大,他考慮一個浮點(diǎn)坐標(biāo)(i+u,j+v)周圍的16個鄰點(diǎn),,目的像素值f(i+u,j+v)可由如下插值公式得到:
f(i+u,j+v) = [A] * [B] * [C]
[A]=[ S(u + 1) S(u + 0) S(u - 1) S(u - 2) ]
┏ f(i-1, j-1) f(i-1, j+0) f(i-1, j+1) f(i-1, j+2) ┓ [B]=┃ f(i+0, j-1) f(i+0, j+0) f(i+0, j+1) f(i+0, j+2) ┃ ┃ f(i+1, j-1) f(i+1, j+0) f(i+1, j+1) f(i+1, j+2) ┃ ┗ f(i+2, j-1) f(i+2, j+0) f(i+2, j+1) f(i+2, j+2) ┛
┏ S(v + 1) ┓ [C]=┃ S(v + 0) ┃ ┃ S(v - 1) ┃ ┗ S(v - 2) ┛
┏ 1-2*Abs(x)^2+Abs(x)^3 , 0<=Abs(x)<1 S(x)={ 4-8*Abs(x)+5*Abs(x)^2-Abs(x)^3 , 1<=Abs(x)<2 ┗ 0 , Abs(x)>=2 S(x)是對 Sin(x*Pi)/x 的逼近(Pi是圓周率——π)
最鄰近插值(近鄰取樣法),、雙線性內(nèi)插值、三次卷積法 等插值算法對于旋轉(zhuǎn)變換,、錯切變換,、一般線性變換 和 非線性變換 都適用。
|
|
原文地址http://blog.csdn.net/qiqi5521/archive/2008/03/22/2207562.aspx |
|