OpenCV改变图像大小的操作
2015-07-29 21:33
381 查看
OpenCV改变图像大小的操作有两类:resize与图像金字塔,但是这两类操作差别还是比较大的。
一、resize
函数原型
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
各个参数的意义比较直观,但是需要注意的是dsize与fx和fy必须不能同时为零,也就是说要么dsize不为零而fx与fy同时可以为0,要么dsize为0而fx与fy不同时为0;resize函数的目标大小可以是任意的大小,可以不保持长宽比率,删除的像素或者新增的像素值通过interpolation(内插)控制;
二、图像金字塔
pyrDown与pyrUp分别表示向下降采样与向上升采样,但是二者并不是互为逆操作;
void pyrDown(InputArray src, OutputArray dst, const Size& dstsize=Size(), int border-
Type=BORDER_DEFAULT )
void pyrUp(InputArray src, OutputArray dst, const Size& dstsize=Size(), int border-
Type=BORDER_DEFAULT )
这两个操作实现图像金字塔的经典操作,他们仅仅是分别代表一次采样操作,也就是说,向下(或者向上)进行相邻层次的金字塔采样,调用一次pyrDown函数只能降低到原图像尺寸的1/2;反之,调用pyrUp目标图像则为原图像尺寸的2倍。因为它们内部都给定了一次采样尺寸的约束。也就是说采样之后,长宽比基本是不变的。
例子:
void ResizeDemo()
{
Mat img1=imread("person_org.jpg");
Mat img2;
//将原图像变为32*32,长宽比被改变了
resize(img1,img2,Size(32,32),0,0,CV_INTER_LINEAR);
namedWindow("WindowOrg");
namedWindow("WindowNew");
imshow("WindowOrg",img1);
imshow("WindowNew",img2);
waitKey(10000);
}
void PyrDown()
{
Mat img1=imread("person_org.jpg");
Mat img2;
Size sz;
//金字塔向下或者向上采样操作 ,基本不改变图像长宽比率
//pyrDown(img1,img2,sz,BORDER_DEFAULT);
pyrUp(img1,img2,sz,BORDER_DEFAULT);
pyrUp(img2,img2,sz,BORDER_DEFAULT);
namedWindow("WindowOrg");
namedWindow("WindowNew");
imshow("WindowOrg",img1);
imshow("WindowNew",img2);
waitKey(10000);
}
总结:resize可以一次性将原图像变为任意不为0的尺寸,适合用来做归一化图像操作;而pyrDown与pyrUp适合做长宽比率不变得操作,且调用一次只能长和宽只能变为原来的1/2或者2倍,也即是说面积变为原来的1/4或者4倍。
一、resize
函数原型
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
各个参数的意义比较直观,但是需要注意的是dsize与fx和fy必须不能同时为零,也就是说要么dsize不为零而fx与fy同时可以为0,要么dsize为0而fx与fy不同时为0;resize函数的目标大小可以是任意的大小,可以不保持长宽比率,删除的像素或者新增的像素值通过interpolation(内插)控制;
二、图像金字塔
pyrDown与pyrUp分别表示向下降采样与向上升采样,但是二者并不是互为逆操作;
void pyrDown(InputArray src, OutputArray dst, const Size& dstsize=Size(), int border-
Type=BORDER_DEFAULT )
void pyrUp(InputArray src, OutputArray dst, const Size& dstsize=Size(), int border-
Type=BORDER_DEFAULT )
这两个操作实现图像金字塔的经典操作,他们仅仅是分别代表一次采样操作,也就是说,向下(或者向上)进行相邻层次的金字塔采样,调用一次pyrDown函数只能降低到原图像尺寸的1/2;反之,调用pyrUp目标图像则为原图像尺寸的2倍。因为它们内部都给定了一次采样尺寸的约束。也就是说采样之后,长宽比基本是不变的。
例子:
void ResizeDemo()
{
Mat img1=imread("person_org.jpg");
Mat img2;
//将原图像变为32*32,长宽比被改变了
resize(img1,img2,Size(32,32),0,0,CV_INTER_LINEAR);
namedWindow("WindowOrg");
namedWindow("WindowNew");
imshow("WindowOrg",img1);
imshow("WindowNew",img2);
waitKey(10000);
}
void PyrDown()
{
Mat img1=imread("person_org.jpg");
Mat img2;
Size sz;
//金字塔向下或者向上采样操作 ,基本不改变图像长宽比率
//pyrDown(img1,img2,sz,BORDER_DEFAULT);
pyrUp(img1,img2,sz,BORDER_DEFAULT);
pyrUp(img2,img2,sz,BORDER_DEFAULT);
namedWindow("WindowOrg");
namedWindow("WindowNew");
imshow("WindowOrg",img1);
imshow("WindowNew",img2);
waitKey(10000);
}
总结:resize可以一次性将原图像变为任意不为0的尺寸,适合用来做归一化图像操作;而pyrDown与pyrUp适合做长宽比率不变得操作,且调用一次只能长和宽只能变为原来的1/2或者2倍,也即是说面积变为原来的1/4或者4倍。
相关文章推荐
- 每天一个linux命令(15):tail 命令
- opengl es
- shell学习小结
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
- hadoop2.x常用端口、定义方法及默认端口、hadoop1.X端口对比
- 解析如何在C语言中调用shell命令的实现方法【转】
- Linux 硬链接和软连接的区别
- shell编程进阶
- shell学习五十八天----/proc文件系统
- Linux bash: scp: command not found的问题记录
- 【linux高级程序设计】(第十一章)System V进程间通信 3
- 执行一个shell脚本而导致虚拟机centos6崩溃,慎重使用root权限
- 一个初学者对于MVC架构的理解
- OpenCV - win7+vs2013(2012)+opencv3.0.0 环境配置 (以及配置技巧)
- OpenCV - win7+vs2013(2012)+opencv3.0.0 环境配置 (以及配置技巧)
- 在ubuntu上面配置nginx实现反向代理和负载均衡
- linux权限控制机制
- Jsoup读取东方财富网站数据实例
- shell编程入门
- linux之例行性工作排程:crontab学习