图像的缩放,顾名思义就是图像的缩小和放大。
opencv1和opencv2最大的区别就是c++支持,这使得网上有些资料是opencv1的c语言写的,而有些人喜欢c++,当然接口函数也就不同了。
下面是一个c++的opencv2接口的图像缩放代码。
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main(){
Mat img = imread("C:/Users/Red/Documents/Visual Studio 2013/Projects/StudyOpenCV/kv2.jpg",1);
if (!img.data) { printf("Oh,no,读取img图片文件错误~! \n"); return -1; }
namedWindow("【1】原画");
imshow("【1】原画", img);
double scale =4;
//Cv::Size结构表示矩形尺寸的结构,结构体中分别定义了矩形的宽度和高度。顾名思义这个是定义一个矩阵的宽度和高度的。而定义之后的宽带和高度直接用在cv::Mat中,用cv::Mat来创建一个固定大小的矩阵。代码中就是image2的矩阵了。
Size dsize = Size(img.cols*scale, img.rows*scale);
Mat newimg = Mat(dsize,CV_32SC3);
resize(img, newimg,dsize);
Mat imgROI = newimg(Rect(800, 600, 600, 600));
namedWindow("【2】缩放");
imshow("【2】缩放", imgROI);
waitKey(0);
return 0;
}
resize函数原型
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_
LINEAR )
各个参数的意义比较直观:
- src 输入图像;
- dst 输出图像.;
- dsize 输出图像大小,目标大小可以是任意的大小,可以不保持长宽比率;
- fx和fy默认为0,但它们与dsize必须不能同时为零,也就是说要么dsize不为零而fx与fy同时可以为0,要么dsize为0而fx与fy不同时为0;
- interpolation 插值方法,默认为INTER_LINEAR(双线性插值),删除的像素或者新增的像素值通过interpolation控制;
检验interpolation插值方法
【参考】http://www.cnblogs.com/wangguchangqing/p/4039095.html
• CV_INTER_NN - 最近邻插值,
• CV_INTER_LINEAR - 双线性插值 (缺省使用)
• CV_INTER_AREA - 使用象素关系重采样。当图像放大时,类似于 CV_INTER_NN 方法的效果;当图像缩小时候,该方法可以避免波纹出现。
• CV_INTER_CUBIC - 立方插值.
原图如下
1、CV_INTER_NN - 最近邻插值
也被称为零阶插值法,最简单插值算法,当然效果也是最差的。它的思想相当简单,就是四舍五入,浮点坐标的像素值等于距离该点最近的输入图像的像素值。 速度相当快。但是这种邻近取值的方法是很粗糙的,会造成图像的马赛克、锯齿等现象。
2、CV_INTER_LINEAR - 双线性插值
双线性插值的主要思想是计算出浮点坐标像素近似值。一个浮点坐标必定会被四个整数坐标所包围,将这个四个整数坐标的像素值按照一定的比例混合就可以求出浮点坐标的像素值。混合比例为距离浮点坐标的距离。
计算每个像素像素值需要进行6次浮点运算。而且,由于浮点坐标有4个坐标近似求得,如果这个四个坐标的像素值差别较大,插值后,会使得图像在颜色分界较为明显的地方变得比较模糊。