雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

opencv中的缩放函数

Posted on 2014-01-27 11:27  huhuuu  阅读(3120)  评论(0编辑  收藏  举报

  图像处理里面缩放操作是比较常见的:

  最近邻插值:类似简单映射的处理方式,目标图像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