圖像處理里面縮放操作是比較常見的:
最近鄰插值:類似簡單映射的處理方式,目標圖像w1,h1,原始圖像w0,h0,則在目標圖像上的點(x,y)的像素點實際對應原始圖上(x*w0/w1,y*h0/h1)的像素點。優點是速度快,操作簡單;缺點是圖片會產生鋸齒狀。
線性插值:對周圍的點通過不同權值的乘積,使目標點的像素會受到周圍像素的影響,過度更加自然些,即不會產生鋸齒狀。 對於一個目的像素,設置坐標通過反向變換得到的浮點坐標為(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)
opencv中有四種處理方式:
除了上面的兩種,還有區域插值,三次樣條插值
測試代碼如下:

#include "stdafx.h" #include "cv.h" #include "highgui.h" int main(){ IplImage *img= cvLoadImage("C:/27.jpg");//讀取源圖片 cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example4",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example5",CV_WINDOW_AUTOSIZE); cvShowImage("Example1",img);//在Example1顯示圖片 IplImage *temp= cvLoadImage("C:/lv.jpg");//目標圖片,放大成這個圖片的大小 cvResize(img,temp,CV_INTER_NN); cvShowImage("Example2",temp); cvResize(img,temp,CV_INTER_LINEAR); cvShowImage("Example3",temp); cvResize(img,temp,CV_INTER_AREA); cvShowImage("Example4",temp); cvResize(img,temp,CV_INTER_CUBIC); cvShowImage("Example5",temp); cvWaitKey(0);//暫停用於顯示圖片 cvReleaseImage(&img);//釋放img所指向的內存空間並且 cvReleaseImage(&temp);//釋放img所指向的內存空間並且 cvDestroyWindow("Example1"); cvDestroyWindow("Example2"); cvDestroyWindow("Example3"); cvDestroyWindow("Example4"); cvDestroyWindow("Example5"); return 0; }
放大:
縮小:
縮小的時候,區域插值效果不錯!
參考:http://blog.sina.com.cn/s/blog_afe2af380101cadz.html ;學習opencv