opencv改变图像大小cvResize和resize

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

默认图片的坐标

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;
}

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
}

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

使用注意事项:

1. dsize和fx/fy不能同时为0,要么你就指定好dsize的值,让fx和fy空置直接使用默认值,就像

resize(img, imgDst, Size(30,30));

要么你就让dsize为0,指定好fx和fy的值,比如fx=fy=0.5,那么就相当于把原图两个方向缩小一倍!

2. 至于最后的插值方法,正常情况下使用默认的双线性插值就够用了。

几种常用方法的效率是:最邻近插值>双线性插值>双立方插值>Lanczos插值;

但是效率和效果成反比,所以根据自己的情况酌情使用。

3. 正常情况下,在使用之前dst图像的大小和类型都是不知道的,类型从src图像继承而来,大小也是从原图像根据参数计算出来。但是如果你事先已经指定好dst图像的大小,那么你可以通过下面这种方式来调用函数:


resize(src, dst, dst.size(), 0, 0, interpolation);
————————————————

Python-OpenCV之图片缩放(cv2.resize)

OpenCV函数原型:
cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation)

参数解释:

InputArray src    输入图片
OutputArray dst    输出图片
Size    输出图片尺寸
fx, fy    沿x轴,y轴的缩放系数
interpolation    插入方式
interpolation 选项所用的插值方法:

INTER_NEAREST    最近邻插值

INTER_LINEAR        双线性插值(默认设置)

INTER_AREA            使用像素区域关系进行重采样。

INTER_CUBIC          4x4像素邻域的双三次插值

INTER_LANCZOS4   8x8像素邻域的Lanczos插值

注意:

1.输出尺寸格式为(宽,高)

2.默认的插值方法为:双线性插值

代码演示:

import cv2 as cv
 
# 读入原图片
img = cv.imread('test.jpg')
# 打印出图片尺寸
print(img.shape)
# 将图片高和宽分别赋值给x,y
x, y = img.shape[0:2]
 
# 显示原图
cv.imshow('OriginalPicture', img)
 
# 缩放到原来的二分之一,输出尺寸格式为(宽,高)
img_test1 = cv.resize(img, (int(y / 2), int(x / 2)))
cv.imshow('resize0', img_test1)
cv.waitKey()
 
# 最近邻插值法缩放
# 缩放到原来的四分之一
img_test2 = cv.resize(img, (0, 0), fx=0.25, fy=0.25, interpolation=cv.INTER_NEAREST)
cv.imshow('resize1', img_test2)
cv.waitKey()
cv.destroyAllWindows()

————————————————
 

你可能感兴趣的:(图像)