OpenCv中改变图像尺寸

来源:互联网 发布:桐乡淘宝摄影基地 编辑:程序博客网 时间:2024/05/01 11:15

首先初始目标图像尺寸:

方法一:IplImage*  dst= cvCreateImage(cvSize((size.width & -2)/2, (size.height& -2)/2), 8, 1 );

分析:size.width &-2----size.width和-2做‘与’运算

从补码算起,我们知道计算机内存里面负数是以补码形式存储并参与运算的,那-2的补码是多少呢?在vc环境下,注意到cvsize结构体内成员变量是int型的,而vc里面int型是占4个字节的所以-2的补码是:

1111111111111111 11111111 11111110

那么size.width &-2就是把最后一位width的最后一位置0,

下面分析为什么要把最后一位置为0

  1. 如果源图像的width为奇数,则通过和-2相与,最后一位设为0,相当于图像width减小了1,然后再除以2,刚好为源图像分配了一半的width
  2. 如果源图像的width为偶数,则通过和-2相与,该数值不变,然后除以2,也为源图像分配一半的width。

方法二:按比例缩放float scale = 0.723;//缩放倍数为0.723倍则定义:

CvSize dst_size;

dst_size.height =(int)(pSrc->height*scale);
dst_size.width =(int)(pSrc->width*scale);

IplImage* dst= cvCreateImage( dst_size,8, 1);

方法三:按具体高宽 

CvSizedst_size;

dst_size.height = 120;
dst_size.width = 60;

IplImage* dst= cvCreateImage( dst_size,8, 1);

 

然后具体实施缩放

cvResiz(src,dst,CV_INTER_LINEAR);

插值方法:
CV_INTER_NN - 最近邻插值,
CV_INTER_LINEAR - 双线性插值 (缺省使用)
CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于CV_INTER_NN 方法..
CV_INTER_CUBIC -立方插值.

注:

cvResize(src,dst)
必须先分配好空间,注意数据类型一致性,多数错误都是因为数据类型问题。
cvConvertScale(src,dst,scale,shift)
先分配好空间,注意数据类型,同为单通道,或多通道。
可以实现不同深度之间的转换,scale和shift要注意。
0 0
原创粉丝点击