图像金字塔
将一层层图像比喻成金字塔,层级越高,图像越小,分辨率越低。
高斯金字塔:向下降采样;
拉普拉斯金字塔:向上采样,通过金字塔低层图像重建上层未采样图像;
金字塔的产生
用高斯核对图像进行卷积,然后删除所有偶数行和偶数列,新得到的图形面积为原图像的1/4,循环此过程可得到金字塔;
对图像向下(图像尺寸减半)采样——pyrDown函数;
1、对图像进行高斯核卷积;
2、删除所有偶数行和偶数列;(逐渐丢失信息)
对图像向上(图像尺寸加倍)采样——pyrUp函数;
1、对图像每个方向扩大原来的两倍,新增的行列以0填充;
2、使用高斯内核(*4)与放大后的图像卷积;(逐渐丢失信息)
为了减少信息的丢失,使用拉普拉斯金字塔;
拉普拉斯金字塔通过原图像减去先缩小再放大的图像构成;
API函数Resize
resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None) —— 将原始图像调整为指定大小。
scr:原始图像
dsize:输出图像的尺寸(元组方式)
dst:输出图像
fx:沿水平轴缩放的比例因子
fy:沿垂直轴缩放的比例因子
interpolation:插值方法,有以下5种:
cv2.INTER_NEAREST 最近邻插值
cv2.INTER_LINEAR 双线性插值(默认)
cv2.INTER_AREA 使用像素区域关系进行重采样。
cv2.INTER_CUBIC 4x4像素邻域的双3次插值
cv2.INTER_LANCZOS4 8x8像素邻域的Lanczos插值
注:如果要缩小图像,选择:cv2.INTER_AREA;如果要放大图像,建议选择cv2.INTER_LINEAR效果尚可且速度快。进行缩放时, dsize和fx、fy 二选一即可。
程序
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//全局变量
int k = 5;
Mat dst, dst1, dst2;
//载入原图
Mat src = imread("12.bmp", 1);
void on_change(int, void*)
{
//resize放缩的两种用法,二选一即可。
resize(src, dst, Size(0, 0), (double)k / 10, (double)k / 10, INTER_AREA);
//resize(src, src, Size(src.cols / 2, src.rows / 2),(0,0), (0,0), INTER_AREA);
imshow("结果图", dst);
}
void print()
{
cout << "键盘按键【1】:进行resize放缩操作" << endl;
cout << "键盘按键【2】:进行pyrUp向上采样操作" << endl;
cout << "键盘按键【2】:进行pyrDown向下采样操作" << endl;
cout << "键盘按键【Esc】:退出程序" << endl;
cout << "注意:放缩值>10为放大,放缩值<10为缩小" << endl;
}
int main()
{
print();
//改变console(控制台)字体颜色
system("color 0B");
//判断图片是否读入
if (!src.data)
{
printf("读取图片image0错误~! \n");
return false;
}
//循环轮询按键
while (1)
{
//先显示原图
namedWindow("原图");
imshow("原图", src);
//获取键盘按键
int c = waitKey(0);
//判断ESC是否按下,若按下便退出
if ((c & 255) == 27)
{
cout << "程序退出!\n";
break;
}
//根据按键的不同,进行各种操作
switch ((char)c)
{
case '1':
cout << "您正在进行resize放缩操作" << endl;
createTrackbar("resize放缩值", "原图", &k, 30, on_change);
on_change(k, 0);
break;
case '2':
cout << "您正在进行pyrUp操作" << endl;
pyrUp(src, dst1, Size(src.cols * 2, src.rows * 2));
imshow("pyrUp图", dst1);
break;
case '3':
cout << "您正在进行pyrDown操作" << endl;
pyrDown(src, dst2, Size(src.cols / 2, src.rows / 2));
imshow("pyrDown图", dst2);
break;
}
}
return 0;
}