图像处理里面缩放操作是比较常见的:
最近邻插值:类似简单映射的处理方式,目标图像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