在图像处理中,图像的缩放常常会利用到。图像金字塔概念就和图像的缩放相关。如果把正常大小的图片放在金字塔结构的中间,那么金字塔的上部就相当于图片的收缩,金字塔的地步就相当于图片的放大。金字塔结构有两种,分别是高斯金字塔和拉普拉斯金字塔。在本次学习中,接触到的是高斯金字塔,我们把图片收缩叫做下采样,图片放大叫做上采样。相关函数如下:
(1)pyrUp(源Mat对象,目标Mat对象,Size(源对象列数*2,源对象行数*2))//上采样,生成的图像是原图在宽高上各放大1倍。
(2)pyrDown(源Mat对象,目标Mat对象,Size(源对象列数/2,源对象行数/2))//下采样,生成的图像是原图在宽高上各缩小1倍。
随带提一下高斯不同的概念(Difference of Gaussian-DOG):把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到输出图像。高斯不同能够反映图像的内在特征。
(3)subtract(Mat对象1,Mat对象2,目标Mat对象)//把两个图像相减结果赋给目标图像。
(4)normalize(源Mat对象,目标Mat对象,最大值max,最小值min,NORM_MAXMIN)//把图像的像素集合归一化到min~max的区间。
演示代码:
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat src,dst_up,dst_down;
src = imread("1.jpg", 1);
if (src.empty())
{
printf("cannot load!");
return -1;
}
namedWindow("原图");
imshow("原图", src);
//上采样
pyrUp(src, dst_up, Size(src.cols * 2, src.rows * 2));
namedWindow("上采样");
imshow("上采样", dst_up);
//下采样
pyrDown(src, dst_down, Size(src.cols / 2, src.rows / 2));
namedWindow("下采样");
imshow("下采样", dst_down);
//高斯不同
Mat g1, g2, dogImg;
GaussianBlur(src, g1, Size(5, 5), 0, 0);
GaussianBlur(src, g2, Size(5, 5), 11, 11);
subtract(g1, g2, dogImg);
//归一化显示
normalize(dogImg, dogImg, 255, 0, NORM_MINMAX);//因为两个图像的差值肯定不大,看起来一片黑,所以需要把像素扩展到0~255的区间。
namedWindow("高斯不同");
imshow("高斯不同", dogImg);
waitKey(0);
return 0;
}