函数原型:
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
最优一个参数interpolation表示插值方式,有以下几种: INTER_NEAREST - 最近邻插值 INTER_LINEAR - 线性插值(默认) INTER_AREA - 区域插值 INTER_CUBIC - 三次样条插值 INTER_LANCZOS4 - Lanczos插值
INTER_NEAREST最近邻插值
目标如下的像素点为对应的最近的原图像的像素点。假设原图像大小为(s_height, s_width),目标图像大小为(d_height, d_width),那么高度和宽度的缩放比例为h_ratio = s_height/d_height,w_ratio=s_width/d_width。
对面目标图像像素:(x, y)其值等于原图像(x * w_ration, y * h_ration)处的值。
INTER_LINEAR 线性插值
默认使用。在使用最近邻插值时,得到的坐标未必是一个整数,例如 (xw_ration, yh_ration)=(10.5, 20.5),那么可能取得坐标点就有四种(10, 20)、(11, 20)、(10, 21)、(11, 21)。双线性插值,会把这四个坐标的像素值加权求和。 D(x, y) = S(j, k) * w1 + S(j+1, k)?w2 + S(j+1,k+1)?w3 + S(j, K+1) * w4,其中w为权值。权值大小和计算位置的小数部分有关。
CV_INTER_AREA:区域插值
区域插值分为3种情况。图像放大时类似于线性插值,图像缩小时可以避免波纹出现。
INTER_CUBIC 三次样条插值
使用4x4邻域内的像素双3次插值。
INTER_LANCZOS4 Lanczos插值
使用8×8像素邻域的Lanczos插值
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
using namespace std;
using namespace cv;
int main(void)
{
Mat src_img = imread("001.jpg", 1);
Mat dst_img_rsize(640, 512, src_img.type()); //创建Mat对象并指定大小和类型
resize(src_img, dst_img_rsize, dst_img_rsize.size(), 0, 0, INTER_LINEAR);
imshow("Rsize图像", dst_img_rsize);
waitKey(5000);
return 0;
}
|