opencv的resize( )函数

本文介绍了一种使用 C++ 对图像进行缩放的方法,详细解释了如何通过不同的插值方式实现图像的放大与缩小,并提供了具体的代码示例。


int main(){
 Mat src = imread("test.jpg");//载入原始图   
 Mat src1, src2, src3, src4,dst;
 src1 = src;//将原始图赋给临时变量  
 src2 = src;//将原始图赋给临时变量  
 namedWindow("效果图窗口", 1);//定义窗口

   //进行尺寸调整操作
 resize(src, src1, Size(src1.cols / 2, src1.rows / 2), (0, 0), (0, 0), 3);
 resize(src, src2, Size(src2.cols * 2, src2.rows * 2), (0, 0), (0, 0), 3);

//////////////

//Mat dst=Mat::zeros(512 ,512, CV_8UC3 );//新建一张512x512尺寸的图片
//Mat src=imread(“1.jpg”);
//显式指定dsize=dst.size(),那么fx和fy会其计算出来,不用额外指定。
//resize(src, dst, dst.size());

 imshow("效果图窗口", src1);
 waitKey(3000);
 imshow("效果图窗口", src2);
 waitKey(3000);
 return 0;
}

C++: void resize(InputArray src,OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )


  • 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。
  • 第二个参数,OutputArray类型的dst,输出图像,当其非零时,有着dsize(第三个参数)的尺寸,或者由src.size()计算出来。
  • 第三个参数,Size类型的dsize,输出图像的大小;如果它等于零,由下式进行计算:


其中,dsize,fx,fy都不能为0。

  • 第四个参数,double类型的fx,沿水平轴的缩放系数,有默认值0,且当其等于0时,由下式进行计算:

 

  • 第五个参数,double类型的fy,沿垂直轴的缩放系数,有默认值0,且当其等于0时,由下式进行计算:

  • 第六个参数,int类型的interpolation,用于指定插值方式,默认为INTER_LINEAR(线性插值)。

可选的插值方式如下:

  • INTER_NEAREST - 最近邻插值
  • INTER_LINEAR - 线性插值(默认值)
  • INTER_AREA - 区域插值(利用像素区域关系的重采样插值)
  • INTER_CUBIC –三次样条插值(超过4×4像素邻域内的双三次插值)
  • INTER_LANCZOS4 -Lanczos插值(超过8×8像素邻域的Lanczos插值)

若要缩小图像,一般情况下最好用CV_INTER_AREA来插值,

而若要放大图像,一般情况下最好用CV_INTER_CUBIC(效率不高,慢,不推荐使用)或CV_INTER_LINEAR(效率较高,速度较快,推荐使用)。




OpenCV中的`resize`函数用于调整图像的大小,是图像处理中常用的函数之一。该函数的原型如下: ```cpp void resize(InputArray src, OutputArray dst, Size dsize, double fx, double fy, int interpolation = INTER_LINEAR); ``` ### 参数说明 - `src`:输入图像,即需要调整大小的原始图像。 - `dst`:输出图像,调整大小后的结果图像。 - `dsize`:输出图像的大小,通常以`Size(width, height)`的形式指定。如果该参数为0,则会根据`fx`和`fy`的比例自动计算输出图像的大小,即`dsize = Size(round(fx * src.cols), round(fy * src.rows))`。 - `fx` 和 `fy`:分别表示图像宽度和高度方向上的缩放比例。如果这两个参数被指定,则可以省略`dsize`参数。 - `interpolation`:插值方法,用于决定图像缩放过程中像素值的计算方式。常见的插值方式包括: - `INTER_NEAREST`:最邻近插值,计算速度快,但图像质量较低。 - `INTER_LINEAR`:双线性插值,速度与质量的折中,是默认的插值方式。 - `INTER_AREA`:区域插值,适用于缩小图像。 - `INTER_CUBIC`:4x4像素邻域内的双立方插值,图像质量更高,但计算量较大。 - `INTER_LANCZOS4`:8x8像素邻域内的Lanczos插值,提供最高的图像质量,但计算开销最大[^4]。 ### 使用示例 以下是一个使用`resize`函数调整图像大小的简单示例: ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { // 读取输入图像 cv::Mat src = cv::imread("input.jpg"); if (src.empty()) { std::cout << "无法加载图像!" << std::endl; return -1; } // 定义输出图像 cv::Mat dst; // 指定输出图像的大小 cv::Size dsize(640, 480); // 调用resize函数 cv::resize(src, dst, dsize, 0, 0, cv::INTER_LINEAR); // 显示结果图像 cv::imshow("Resized Image", dst); cv::waitKey(0); return 0; } ``` 在上述代码中,首先读取输入图像`src`,然后定义输出图像`dst`。通过指定`dsize`为`Size(640, 480)`,将图像调整为640x480的大小。插值方式选择`INTER_LINEAR`,即双线性插值。 ### 注意事项 - **返回值问题**:在OpenCV官方文档中,`cv.resize`函数的返回值为`None`。然而,在实际使用中,`resize`函数并不会返回任何值,而是直接将结果存储在`dst`参数中。这种差异可能是由于文档描述与实际实现之间的不一致造成的[^2]。 - **参数选择**:在使用`resize`函数时,可以选择指定`dsize`或者`fx`和`fy`来控制图像的缩放比例。如果同时指定了`dsize`和`fx`、`fy`,则只有`dsize`会被使用,`fx`和`fy`将被忽略[^4]。 - **插值方式的选择**:不同的插值方式适用于不同的应用场景。对于需要快速处理的情况,可以选择`INTER_NEAREST`;而对于需要高质量图像的情况,则可以选择`INTER_CUBIC`或`INTER_LANCZOS4`[^4]。 ### 总结 通过合理选择`dsize`、`fx`、`fy`和插值方式,可以有效地调整图像的大小,同时保证图像的质量和处理速度。在实际应用中,可以根据具体需求选择合适的参数组合来优化图像缩放操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vqt5_qt6

你的鼓励是我们创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值