OpenCV图片缩放
resize方法
对图像进行缩放的最简单方法就是调用OpenCV中resize
函数。resize
函数可以将源图像精确地转化为指定尺寸的目标图像。要缩小图像,一般推荐使用CV_INETR_AREA来插值;若要放大图像,推荐使用CV_INTER_LINEAR。
void resize(
InputArray src,
OutputArray dst,
Size dsize,
double fx=0,
double fy=0,
int interpolation=INTER_LINEAR
);
src
输入图像.dst
输出图像; 其size
为dsize
,或由src.size()
、fx
与fy
计算而得;dst
类型与src
保持一致.dsize
输出图像的size
;fx
水平轴缩放因子;fy
竖直轴缩放因子;interpolation
选项见下表:
interpolation 选项 | 所用的插值方法 |
---|---|
INTER_NEAREST | 最近邻插值 |
INTER_LINEAR | 双线性插值(默认设置) |
INTER_AREA | 区域插值法 |
INTER_CUBIC | 双三次插值法 |
图像金字塔方法
图像金字塔同样也是进行图像缩放的,我们先来看一下什么是图像金字塔:
其实非常好理解,如上图所示,我们将一层层的图像比喻为金字塔,层级越高,则图像尺寸越小,分辨率越低。
两种类型的金字塔:
- 高斯金字塔:用于下采样,主要的图像金字塔;
- 拉普拉斯金字塔:用于重建图像,也就是预测残差,对图像进行最大程度的还原。比如一幅小图像重建为一幅大图像。
图像金字塔有两个高频出现的名词:上采样和下采样。现在说说他们俩。
- 上采样:就是图片放大,使用
PryUp
函数。将图像在每个方向放大为原来的两倍,新增的行和列用0填充,使用先前同样的内核(乘以4)与放大后的图像卷积,获得新增像素的近似值。 - 下采样:就是图片缩小,使用
PryDown
函数。对图像进行高斯内核卷积,然后将所有偶数行和列去除。
上、下采样都存在一个严重的问题,那就是图像变模糊了,因为缩放的过程中发生了信息丢失的问题。要解决这个问题,就得看拉普拉斯金字塔了。
参考代码
代码语言:javascript复制#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
int main(int argc, char** argv) {
Mat src;
src = imread("cat.jpg");
if (!src.data) {
printf("could not load image...n");
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
/* resize 方法 */
//方式一:转换为任意尺寸
Mat dst1;
dst1 = Mat::zeros(512, 512, CV_8UC3); //转化为512*512大小
resize(src, dst1, dst1.size());
namedWindow("resize1", CV_WINDOW_AUTOSIZE);
imshow("resize1", dst1);
imwrite("resize1.jpg",dst1);
//方式二:按比例缩放
Mat dst2;
resize(src, dst2, Size(),0.5,0.5);//我长宽都变为原来的0.5倍
namedWindow("resize2", CV_WINDOW_AUTOSIZE);
imshow("resize2", dst2);
imwrite("./resize2.jpg",dst2);
/* 图像金字塔 */
Mat dst3,dst4;
pyrUp(src, dst3, Size(src.cols*2, src.rows*2)); //放大一倍
pyrDown(src, dst4, Size(src.cols*0.5, src.rows*0.5)); //缩小为原来的一半
namedWindow("resize3", CV_WINDOW_AUTOSIZE);
namedWindow("resize4", CV_WINDOW_AUTOSIZE);
imshow("resize3", dst3);
imshow("resize4", dst4);
imwrite("./resize3.jpg",dst3);
imwrite("./resize4.jpg",dst4);
waitKey(0);
return 0;
}
结果
注意:通过上图resize2与resize4的结果比较,我们可以看出:采用图像金字塔缩放与图片
resize
方法的结果不太一致。图像金字塔缩放的结果明显要模糊!
参考
http://www.cnblogs.com/skyfsm/p/6876732.html