基本原理:雙三次插值是一種更加復(fù)雜的插值方式,它能創(chuàng)造出比雙線性插值更平滑的圖像邊緣??s放后圖像中某個(gè)象素的象素值是由源圖像相應(yīng)像素附近的(4 x 4)個(gè)鄰近象素值計(jì)算出來(lái)的,即通過(guò)一個(gè)基函數(shù)進(jìn)行擬合得到一個(gè)目的像素值,具體某點(diǎn)v(x,y) 的像素值是使用下式計(jì)算得到:
創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)菏澤,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108
v(x,y) =∑∑aij*x^i*y^j;其中,0≤i,j≤3;16個(gè)系數(shù)aij由16個(gè)臨近像素寫出的未知方程確定。
C/C++實(shí)現(xiàn)如下:
void GeometryTrans::Zoom(float ratioX, float ratioY) { //釋放舊的輸出圖像緩沖區(qū) if(m_pImgDataOut!=NULL){ delete []m_pImgDataOut; m_pImgDataOut=NULL; } //輸出圖像的寬和高 m_imgWidthOut=int(m_imgWidth*ratioX+0.5) ; m_imgHeightOut=int(m_imgHeight*ratioY+0.5); //輸入圖像每行像素字節(jié)數(shù) int lineByteIn=(m_imgWidth*m_nBitCount/8+3)/4*4; //輸出圖像每行像素字節(jié)數(shù) int lineByteOut=(m_imgWidthOut*m_nBitCount/8+3)/4*4; //申請(qǐng)緩沖區(qū),存放輸出結(jié)果 m_pImgDataOut=new unsigned char[lineByteOut*m_imgHeightOut]; //每像素字節(jié)數(shù),輸入圖像與輸出圖像相同 int pixelByte=m_nBitCount/8; //輸出圖像在輸入圖像中待插值的位置坐標(biāo) int coordinateX, coordinateY; //循環(huán)變量,輸出圖像的坐標(biāo) int i,j; //循環(huán)變量,像素的每個(gè)通道 int k; //************************************************************** //對(duì)原圖像進(jìn)行拓展,上下分別拓展兩行,左右分別拓展兩列 if(m_pImgData_temp!=NULL){ delete []m_pImgData_temp; m_pImgData_temp=NULL; } //拓展圖像每行像素字節(jié)數(shù) int lineByteIn1=((m_imgWidth+4)*m_nBitCount/8+3)/4*4; //申請(qǐng)緩沖區(qū),存放拓展后的圖像 m_pImgData_temp=new unsigned char[lineByteIn1*(m_imgHeight+4)]; for(k=0;k=0&&coordinateY<(m_imgHeight)) { for(k=0;k 基函數(shù)實(shí)現(xiàn)如下
loat GeometryTrans::Sinc(float x) /*Sinc(x)是對(duì) Sin(x*Pi)/x 的逼近(Pi是圓周率——π)*/ { if(abs(x)>=0&&abs(x)<1) return (1-2*abs(x)*abs(x)+abs(x)*abs(x)*abs(x)); else if(abs(x)>=1&&abs(x)<2) return (4-8*abs(x)+5*abs(x)*abs(x)-abs(x)*abs(x)*abs(x)); else return 0; }矩陣內(nèi)積計(jì)算函數(shù)實(shí)現(xiàn)如下
float GeometryTrans::ABC(float a[],double b[],float c[]) /*矩陣運(yùn)算函數(shù),求得像素值,內(nèi)積*/ { int i,j; float abc=0; float tmp[4]; for(i=0;i<4;i++) tmp[i]=0; for(i=0;i<4;i++) for(j=0;j<4;j++) tmp[i]+=a[j]*b[j*4+i]; for(i=0;i<4;i++) abc+=tmp[i]*c[i]; if (abc<0) abc=0; if (abc>255) abc=255; return abc; }
當(dāng)前名稱:數(shù)字圖像縮放之雙三次插值
網(wǎng)站地址:http://weahome.cn/article/jdpscc.html