opencv改变图像大小cvResize和resize及其原理

如:函数

原始图像为M*N,缩小后图像大小要求为m*n,则须要将图像划分为(M*N)/(m*n)大小的互不相交的小块,计算小块的平均值,该值做为缩小图像对应的像素值。atom

以下图:spa

咱们把16*16的图像缩小成4*4的图像:code

opencv改变图像大小cvResize和resize及其原理_第1张图片

最后对应的值以下:

opencv改变图像大小cvResize和resize及其原理_第2张图片

 在Opencv里面图片缩放函数以下图片

void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
前两个参数分别为输入和输出图像。dsize表示输出图像的大小,若是为0,则
ci

dsize=Size(round(fx∗src.cols),round(fy∗src.rows))dsize=Size(round(fx∗src.cols),round(fy∗src.rows))


dsize和fx、fy不能同时为0。fx、fy是沿x轴和y轴的缩放系数;默认取0时,计算以下

fx=(double)dsize.width/src.colsfx=(double)dsize.width/src.cols

fy=(double)dsize.height/src.rowsfy=(double)dsize.height/src.rows

/

在实现图像窗口展示的时候,经常出现图像过大或过小而无法有效的展示全图,opencv提供了cvResize()和resize()两个函数进行相应的缩放操作
默认图片的坐标

opencv改变图像大小cvResize和resize及其原理_第3张图片

 

1、cvResize:函数原形

CVAPI(void)  cvResize( const CvArr* src, CvArr* dst,
                       int interpolation CV_DEFAULT( CV_INTER_LINEAR ));
其中interpolation 为修改、插补的方法,取值如下:
·CV_INTER_NN - 最近-邻居插补
·CV_INTER_LINEAR - 双线性插值(默认方法)
·CV_INTER_AREA - 像素面积相关重采样。当缩小图像时,该方法可以避免波纹的出现。当放大图像时,类似于方法CV_INTER_NN。
·CV_INTER_CUBIC - 双三次插值。

示例:

int main()
{
    IplImage *src = cvLoadImage("1.jpg");
    IplImage *dst;
    CvSize size;
    double scale = 0.5;     //缩放的倍数
    size.width = src->width*scale;
    size.height = src->height*scale;
    dst = cvCreateImage(size, src->depth, src->nChannels);
    cvResize(src, dst, CV_INTER_CUBIC);
    cvNamedWindow("src", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("dst", CV_WINDOW_AUTOSIZE);
    cvShowImage("src", src);
    cvShowImage("dst", dst);
    cvWaitKey(0);
    cvReleaseImage(&src);
    cvReleaseImage(&dst);
    cvDestroyWindow("src");
    cvDestroyWindow("dst");
    return 0;
}

opencv改变图像大小cvResize和resize及其原理_第4张图片

 

2、resize:函数原形

CV_EXPORTS_W void resize( InputArray src, OutputArray dst,
                          Size dsize, double fx=0, double fy=0,
                          int interpolation=INTER_LINEAR );
同理interpolation也是相应的修改、插补的方法,有最近邻、双线性、双三次、基于像素区域关系、兰索斯插值种方法, 因为没用到过, 我一般采用默认,原理不太清楚。
注:dsize与(fx,fy)不能同时为0

示例:


int main()
{
    Mat img = imread("1.jpg",1);
    //缩放
    double scale = 0.5;
    Size dsize = Size(img.cols*scale, img.rows*scale);
    Mat img2 = Mat(dsize, CV_32S);
    resize(img, img2, dsize);
    imshow("img", img);
    imshow("img2", img2);
    waitKey(0);
    return 0;
    //或者来直接的
    //Mat img = imread("1.jpg", 1);
    //Mat img2;
    //resize(img,img2,Size(img.cols*scale,img.rows*scale));   //缩小为1/2
    //resize(img, img2, Size(20, 20));    //缩放到任意尺寸,20*20
}

opencv改变图像大小cvResize和resize及其原理_第5张图片

 

    cvResize常用于IplImage操作,resize常用于Mat操作。
 

 

你可能感兴趣的:(Open,CV,opencv,计算机视觉,图像处理)