opencv中的縮放函數


  圖像處理里面縮放操作是比較常見的:

  最近鄰插值:類似簡單映射的處理方式,目標圖像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;
}
View Code

放大:  

 

縮小:

  

縮小的時候,區域插值效果不錯!

 

參考:http://blog.sina.com.cn/s/blog_afe2af380101cadz.html ;學習opencv


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM