1.临近算法
INTER_NEAREST 近邻算法 :对相邻像素直接拷贝
优点: 最简单、速度最快
缺点:缩小可能有丢失问题,放大后边界可能会出现马赛克
resize()
第一个参数:输入图像;
**第二个参数:**输出图像;
**第三个参数:**设定尺寸;
**第四和第五个参数:**缩放比例;(设定尺寸后,缩放比例传0即可)
**第六个参数:**算法(默认 1 是双插值算法)
第六个参数有很多算法可以选择,转到定义后,你可以看到 0 是近邻算法, 1 是双插值算法
代码和下面的双插值算法共同展示。
2.双插值算法
INTER_LINEAR 双插值算法,对像素进行计算
优点:图像边缘过渡更平整,不会出现马赛克现象
还是resize()函数,并且是resize()的默认算法。
下面展示两种算法的效果对比:
#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
void PrintMs(const char*text = "")
{
static long long last = 0;
long long current = getTickCount();
if (last == 0)
{
last = current;
return;
}
long long ms = 0;
ms = ((double)(current - last) / getTickFrequency()) * 1000;//最容易出问题的一行代码
if (*text != 0)
{
/*cout << *text <<"= "<< ms << " ms" << endl;*/
printf("%s = %d ms\n", text , ms);
}
last = getTickCount();
}
int main()
{
Mat src = imread("D:\\photogallery\\人物\\image_2.png");
Mat dest256;
Mat ldest256;
PrintMs("");
//近邻算法
resize(src, dest256, Size(2024, 2024), 0, 0, INTER_NEAREST);
PrintMs("dest256");
//双插值算法
resize(src, ldest256, Size(2024, 2024), 0, 0, INTER_LINEAR);
PrintMs("ldest256");
imshow("src", src);
imshow("近邻算法", dest256);
imshow("双插值算法", ldest256);
waitKey(0);
return 0;
}
运行结果如图:
左图为临近算法,可以看在色彩边界有明显的马赛克现象,右图为双插值算法,则过渡更加平滑,但耗时略长(耗时则么会这么多?)。
3.金字塔
pyrDown()高斯金字塔 ,用来向下采样
pyrUp()拉普拉斯金字塔 , 从金字塔底层图像重建上层图像
pyrDown()
第一个参数:输入图像;
第二个参数:输出图像;
后面两个参数使用默认就行
pyrUp()同上;
下面看代码:
#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
void PrintMs(const char*text = "")
{
static long long last = 0;
long long current = getTickCount();
if (last == 0)
{
last = current;
return;
}
long long ms = 0;
ms = ((double)(current - last) / getTickFrequency()) * 1000;//最容易出问题的一行代码
if (*text != 0)
{
/*cout << *text <<"= "<< ms << " ms" << endl;*/
printf("%s = %d ms\n", text , ms);
}
last = getTickCount();
}
int main()
{
Mat src = imread("D:\\photogallery\\人物\\image_2.png");
Mat gsrc;
Mat lsrc;
PrintMs("");
pyrDown(src, gsrc);
PrintMs("pyrDown");
pyrUp(src, lsrc);
PrintMs("pyrUp");
imshow("src", src);
imshow("高斯金字塔", gsrc);
imshow("拉普拉斯金字塔", lsrc);
waitKey(0);
return 0;
}
运行结果如下: